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

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 (498) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +137 -0
  4. package/dist/breakouts/breakout.js.map +1 -0
  5. package/dist/breakouts/collection.js +23 -0
  6. package/dist/breakouts/collection.js.map +1 -0
  7. package/dist/breakouts/edit-lock-error.js +52 -0
  8. package/dist/breakouts/edit-lock-error.js.map +1 -0
  9. package/dist/breakouts/index.js +546 -0
  10. package/dist/breakouts/index.js.map +1 -0
  11. package/dist/breakouts/request.js +78 -0
  12. package/dist/breakouts/request.js.map +1 -0
  13. package/dist/breakouts/utils.js +48 -0
  14. package/dist/breakouts/utils.js.map +1 -0
  15. package/dist/common/browser-detection.js +1 -20
  16. package/dist/common/browser-detection.js.map +1 -1
  17. package/dist/common/collection.js +5 -20
  18. package/dist/common/collection.js.map +1 -1
  19. package/dist/common/config.js +0 -7
  20. package/dist/common/config.js.map +1 -1
  21. package/dist/common/errors/captcha-error.js +10 -24
  22. package/dist/common/errors/captcha-error.js.map +1 -1
  23. package/dist/common/errors/intent-to-join.js +11 -24
  24. package/dist/common/errors/intent-to-join.js.map +1 -1
  25. package/dist/common/errors/join-meeting.js +12 -25
  26. package/dist/common/errors/join-meeting.js.map +1 -1
  27. package/dist/common/errors/media.js +10 -24
  28. package/dist/common/errors/media.js.map +1 -1
  29. package/dist/common/errors/parameter.js +5 -33
  30. package/dist/common/errors/parameter.js.map +1 -1
  31. package/dist/common/errors/password-error.js +10 -24
  32. package/dist/common/errors/password-error.js.map +1 -1
  33. package/dist/common/errors/permission.js +9 -23
  34. package/dist/common/errors/permission.js.map +1 -1
  35. package/dist/common/errors/reconnection-in-progress.js +0 -17
  36. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  37. package/dist/common/errors/reconnection.js +10 -24
  38. package/dist/common/errors/reconnection.js.map +1 -1
  39. package/dist/common/errors/stats.js +10 -24
  40. package/dist/common/errors/stats.js.map +1 -1
  41. package/dist/common/errors/webex-errors.js +6 -41
  42. package/dist/common/errors/webex-errors.js.map +1 -1
  43. package/dist/common/errors/webex-meetings-error.js +5 -25
  44. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  45. package/dist/common/events/events-scope.js +0 -22
  46. package/dist/common/events/events-scope.js.map +1 -1
  47. package/dist/common/events/events.js +0 -23
  48. package/dist/common/events/events.js.map +1 -1
  49. package/dist/common/events/trigger-proxy.js +0 -12
  50. package/dist/common/events/trigger-proxy.js.map +1 -1
  51. package/dist/common/events/util.js +0 -15
  52. package/dist/common/events/util.js.map +1 -1
  53. package/dist/common/logs/logger-config.js +0 -4
  54. package/dist/common/logs/logger-config.js.map +1 -1
  55. package/dist/common/logs/logger-proxy.js +1 -8
  56. package/dist/common/logs/logger-proxy.js.map +1 -1
  57. package/dist/common/logs/request.js +37 -60
  58. package/dist/common/logs/request.js.map +1 -1
  59. package/dist/common/queue.js +4 -14
  60. package/dist/common/queue.js.map +1 -1
  61. package/dist/config.js +6 -6
  62. package/dist/config.js.map +1 -1
  63. package/dist/constants.js +109 -49
  64. package/dist/constants.js.map +1 -1
  65. package/dist/controls-options-manager/constants.js +14 -0
  66. package/dist/controls-options-manager/constants.js.map +1 -0
  67. package/dist/controls-options-manager/enums.js +15 -0
  68. package/dist/controls-options-manager/enums.js.map +1 -0
  69. package/dist/controls-options-manager/index.js +203 -0
  70. package/dist/controls-options-manager/index.js.map +1 -0
  71. package/dist/controls-options-manager/util.js +28 -0
  72. package/dist/controls-options-manager/util.js.map +1 -0
  73. package/dist/index.js +11 -18
  74. package/dist/index.js.map +1 -1
  75. package/dist/locus-info/controlsUtils.js +12 -29
  76. package/dist/locus-info/controlsUtils.js.map +1 -1
  77. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  78. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  79. package/dist/locus-info/fullState.js +0 -15
  80. package/dist/locus-info/fullState.js.map +1 -1
  81. package/dist/locus-info/hostUtils.js +4 -12
  82. package/dist/locus-info/hostUtils.js.map +1 -1
  83. package/dist/locus-info/index.js +186 -192
  84. package/dist/locus-info/index.js.map +1 -1
  85. package/dist/locus-info/infoUtils.js +3 -37
  86. package/dist/locus-info/infoUtils.js.map +1 -1
  87. package/dist/locus-info/mediaSharesUtils.js +12 -38
  88. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  89. package/dist/locus-info/parser.js +92 -118
  90. package/dist/locus-info/parser.js.map +1 -1
  91. package/dist/locus-info/selfUtils.js +34 -91
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.js +66 -153
  94. package/dist/media/index.js.map +1 -1
  95. package/dist/media/properties.js +83 -117
  96. package/dist/media/properties.js.map +1 -1
  97. package/dist/media/util.js +2 -9
  98. package/dist/media/util.js.map +1 -1
  99. package/dist/mediaQualityMetrics/config.js +505 -495
  100. package/dist/mediaQualityMetrics/config.js.map +1 -1
  101. package/dist/meeting/in-meeting-actions.js +13 -14
  102. package/dist/meeting/in-meeting-actions.js.map +1 -1
  103. package/dist/meeting/index.js +2141 -2210
  104. package/dist/meeting/index.js.map +1 -1
  105. package/dist/meeting/muteState.js +59 -82
  106. package/dist/meeting/muteState.js.map +1 -1
  107. package/dist/meeting/request.js +308 -264
  108. package/dist/meeting/request.js.map +1 -1
  109. package/dist/meeting/request.type.js +7 -0
  110. package/dist/meeting/request.type.js.map +1 -0
  111. package/dist/meeting/state.js +21 -31
  112. package/dist/meeting/state.js.map +1 -1
  113. package/dist/meeting/util.js +45 -217
  114. package/dist/meeting/util.js.map +1 -1
  115. package/dist/meeting-info/collection.js +6 -25
  116. package/dist/meeting-info/collection.js.map +1 -1
  117. package/dist/meeting-info/index.js +14 -32
  118. package/dist/meeting-info/index.js.map +1 -1
  119. package/dist/meeting-info/meeting-info-v2.js +193 -268
  120. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  121. package/dist/meeting-info/request.js +3 -15
  122. package/dist/meeting-info/request.js.map +1 -1
  123. package/dist/meeting-info/util.js +98 -183
  124. package/dist/meeting-info/util.js.map +1 -1
  125. package/dist/meeting-info/utilv2.js +137 -228
  126. package/dist/meeting-info/utilv2.js.map +1 -1
  127. package/dist/meetings/collection.js +5 -20
  128. package/dist/meetings/collection.js.map +1 -1
  129. package/dist/meetings/index.js +490 -560
  130. package/dist/meetings/index.js.map +1 -1
  131. package/dist/meetings/request.js +24 -41
  132. package/dist/meetings/request.js.map +1 -1
  133. package/dist/meetings/util.js +116 -155
  134. package/dist/meetings/util.js.map +1 -1
  135. package/dist/member/index.js +78 -86
  136. package/dist/member/index.js.map +1 -1
  137. package/dist/member/util.js +31 -68
  138. package/dist/member/util.js.map +1 -1
  139. package/dist/members/collection.js +3 -12
  140. package/dist/members/collection.js.map +1 -1
  141. package/dist/members/index.js +95 -200
  142. package/dist/members/index.js.map +1 -1
  143. package/dist/members/request.js +16 -39
  144. package/dist/members/request.js.map +1 -1
  145. package/dist/members/util.js +9 -38
  146. package/dist/members/util.js.map +1 -1
  147. package/dist/metrics/config.js +1 -13
  148. package/dist/metrics/config.js.map +1 -1
  149. package/dist/metrics/constants.js +1 -6
  150. package/dist/metrics/constants.js.map +1 -1
  151. package/dist/metrics/index.js +54 -156
  152. package/dist/metrics/index.js.map +1 -1
  153. package/dist/multistream/mediaRequestManager.js +74 -52
  154. package/dist/multistream/mediaRequestManager.js.map +1 -1
  155. package/dist/multistream/receiveSlot.js +48 -65
  156. package/dist/multistream/receiveSlot.js.map +1 -1
  157. package/dist/multistream/receiveSlotManager.js +60 -82
  158. package/dist/multistream/receiveSlotManager.js.map +1 -1
  159. package/dist/multistream/remoteMedia.js +60 -76
  160. package/dist/multistream/remoteMedia.js.map +1 -1
  161. package/dist/multistream/remoteMediaGroup.js +6 -40
  162. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  163. package/dist/multistream/remoteMediaManager.js +360 -413
  164. package/dist/multistream/remoteMediaManager.js.map +1 -1
  165. package/dist/networkQualityMonitor/index.js +40 -59
  166. package/dist/networkQualityMonitor/index.js.map +1 -1
  167. package/dist/personal-meeting-room/index.js +21 -45
  168. package/dist/personal-meeting-room/index.js.map +1 -1
  169. package/dist/personal-meeting-room/request.js +1 -31
  170. package/dist/personal-meeting-room/request.js.map +1 -1
  171. package/dist/personal-meeting-room/util.js +0 -13
  172. package/dist/personal-meeting-room/util.js.map +1 -1
  173. package/dist/reachability/index.js +147 -183
  174. package/dist/reachability/index.js.map +1 -1
  175. package/dist/reachability/request.js +15 -23
  176. package/dist/reachability/request.js.map +1 -1
  177. package/dist/reactions/constants.js +13 -0
  178. package/dist/reactions/constants.js.map +1 -0
  179. package/dist/reactions/reactions.js +109 -0
  180. package/dist/reactions/reactions.js.map +1 -0
  181. package/dist/reactions/reactions.type.js +36 -0
  182. package/dist/reactions/reactions.type.js.map +1 -0
  183. package/dist/reconnection-manager/index.js +322 -456
  184. package/dist/reconnection-manager/index.js.map +1 -1
  185. package/dist/recording-controller/enums.js +17 -0
  186. package/dist/recording-controller/enums.js.map +1 -0
  187. package/dist/recording-controller/index.js +343 -0
  188. package/dist/recording-controller/index.js.map +1 -0
  189. package/dist/recording-controller/util.js +63 -0
  190. package/dist/recording-controller/util.js.map +1 -0
  191. package/dist/roap/index.js +48 -70
  192. package/dist/roap/index.js.map +1 -1
  193. package/dist/roap/request.js +143 -131
  194. package/dist/roap/request.js.map +1 -1
  195. package/dist/roap/turnDiscovery.js +91 -98
  196. package/dist/roap/turnDiscovery.js.map +1 -1
  197. package/dist/statsAnalyzer/global.js +1 -95
  198. package/dist/statsAnalyzer/global.js.map +1 -1
  199. package/dist/statsAnalyzer/index.js +361 -449
  200. package/dist/statsAnalyzer/index.js.map +1 -1
  201. package/dist/statsAnalyzer/mqaUtil.js +137 -81
  202. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  203. package/dist/transcription/index.js +22 -47
  204. package/dist/transcription/index.js.map +1 -1
  205. package/dist/types/breakouts/breakout.d.ts +8 -0
  206. package/dist/types/breakouts/collection.d.ts +5 -0
  207. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  208. package/dist/types/breakouts/index.d.ts +5 -0
  209. package/dist/types/breakouts/request.d.ts +22 -0
  210. package/dist/types/breakouts/utils.d.ts +8 -0
  211. package/dist/types/common/browser-detection.d.ts +9 -0
  212. package/dist/types/common/collection.d.ts +48 -0
  213. package/dist/types/common/config.d.ts +2 -0
  214. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  215. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  216. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  217. package/dist/types/common/errors/media.d.ts +15 -0
  218. package/dist/types/common/errors/parameter.d.ts +15 -0
  219. package/dist/types/common/errors/password-error.d.ts +15 -0
  220. package/dist/types/common/errors/permission.d.ts +14 -0
  221. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  222. package/dist/types/common/errors/reconnection.d.ts +15 -0
  223. package/dist/types/common/errors/stats.d.ts +15 -0
  224. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  225. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  226. package/dist/types/common/events/events-scope.d.ts +17 -0
  227. package/dist/types/common/events/events.d.ts +12 -0
  228. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  229. package/dist/types/common/events/util.d.ts +2 -0
  230. package/dist/types/common/logs/logger-config.d.ts +2 -0
  231. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  232. package/dist/types/common/logs/request.d.ts +34 -0
  233. package/dist/types/common/queue.d.ts +32 -0
  234. package/dist/types/config.d.ts +77 -0
  235. package/dist/types/constants.d.ts +916 -0
  236. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  237. package/dist/types/controls-options-manager/enums.d.ts +5 -0
  238. package/dist/types/controls-options-manager/index.d.ts +120 -0
  239. package/dist/types/controls-options-manager/util.d.ts +7 -0
  240. package/dist/types/index.d.ts +6 -0
  241. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  242. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  243. package/dist/types/locus-info/fullState.d.ts +2 -0
  244. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  245. package/dist/types/locus-info/index.d.ts +269 -0
  246. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  247. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  248. package/dist/types/locus-info/parser.d.ts +212 -0
  249. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  250. package/dist/types/media/index.d.ts +32 -0
  251. package/dist/types/media/properties.d.ts +108 -0
  252. package/dist/types/media/util.d.ts +2 -0
  253. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  254. package/dist/types/meeting/in-meeting-actions.d.ts +83 -0
  255. package/dist/types/meeting/index.d.ts +1699 -0
  256. package/dist/types/meeting/muteState.d.ts +116 -0
  257. package/dist/types/meeting/request.d.ts +271 -0
  258. package/dist/types/meeting/request.type.d.ts +11 -0
  259. package/dist/types/meeting/state.d.ts +9 -0
  260. package/dist/types/meeting/util.d.ts +2 -0
  261. package/dist/types/meeting-info/collection.d.ts +20 -0
  262. package/dist/types/meeting-info/index.d.ts +57 -0
  263. package/dist/types/meeting-info/meeting-info-v2.d.ts +93 -0
  264. package/dist/types/meeting-info/request.d.ts +22 -0
  265. package/dist/types/meeting-info/util.d.ts +2 -0
  266. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  267. package/dist/types/meetings/collection.d.ts +23 -0
  268. package/dist/types/meetings/index.d.ts +297 -0
  269. package/dist/types/meetings/request.d.ts +27 -0
  270. package/dist/types/meetings/util.d.ts +18 -0
  271. package/dist/types/member/index.d.ts +146 -0
  272. package/dist/types/member/util.d.ts +2 -0
  273. package/dist/types/members/collection.d.ts +24 -0
  274. package/dist/types/members/index.d.ts +320 -0
  275. package/dist/types/members/request.d.ts +50 -0
  276. package/dist/types/members/util.d.ts +2 -0
  277. package/dist/types/metrics/config.d.ts +169 -0
  278. package/dist/types/metrics/constants.d.ts +53 -0
  279. package/dist/types/metrics/index.d.ts +152 -0
  280. package/dist/types/multistream/mediaRequestManager.d.ts +51 -0
  281. package/dist/types/multistream/receiveSlot.d.ts +64 -0
  282. package/dist/types/multistream/receiveSlotManager.d.ts +46 -0
  283. package/dist/types/multistream/remoteMedia.d.ts +100 -0
  284. package/dist/types/multistream/remoteMediaGroup.d.ts +56 -0
  285. package/dist/types/multistream/remoteMediaManager.d.ts +241 -0
  286. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  287. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  288. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  289. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  290. package/dist/types/reachability/index.d.ts +140 -0
  291. package/dist/types/reachability/request.d.ts +37 -0
  292. package/dist/types/reactions/constants.d.ts +3 -0
  293. package/dist/types/reactions/reactions.d.ts +4 -0
  294. package/dist/types/reactions/reactions.type.d.ts +52 -0
  295. package/dist/types/reconnection-manager/index.d.ts +117 -0
  296. package/dist/types/recording-controller/enums.d.ts +7 -0
  297. package/dist/types/recording-controller/index.d.ts +193 -0
  298. package/dist/types/recording-controller/util.d.ts +13 -0
  299. package/dist/types/roap/index.d.ts +77 -0
  300. package/dist/types/roap/request.d.ts +38 -0
  301. package/dist/types/roap/turnDiscovery.d.ts +74 -0
  302. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  303. package/dist/types/statsAnalyzer/index.d.ts +195 -0
  304. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  305. package/dist/types/transcription/index.d.ts +64 -0
  306. package/internal-README.md +7 -6
  307. package/package.json +27 -21
  308. package/src/breakouts/README.md +199 -0
  309. package/src/breakouts/breakout.ts +130 -0
  310. package/src/breakouts/collection.ts +19 -0
  311. package/src/breakouts/edit-lock-error.ts +25 -0
  312. package/src/breakouts/index.ts +504 -0
  313. package/src/breakouts/request.ts +55 -0
  314. package/src/breakouts/utils.ts +39 -0
  315. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  316. package/src/common/collection.ts +9 -7
  317. package/src/common/{config.js → config.ts} +1 -1
  318. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  319. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  320. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  321. package/src/common/errors/{media.js → media.ts} +11 -7
  322. package/src/common/errors/parameter.ts +11 -7
  323. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  324. package/src/common/errors/{permission.js → permission.ts} +10 -6
  325. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  326. package/src/common/errors/{stats.js → stats.ts} +11 -7
  327. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  328. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  329. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  330. package/src/common/events/{events.js → events.ts} +5 -1
  331. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  332. package/src/common/events/{util.js → util.ts} +2 -3
  333. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  334. package/src/common/logs/logger-proxy.ts +44 -0
  335. package/src/common/logs/{request.js → request.ts} +22 -9
  336. package/src/common/queue.ts +1 -2
  337. package/src/{config.js → config.ts} +17 -12
  338. package/src/constants.ts +62 -5
  339. package/src/controls-options-manager/constants.ts +5 -0
  340. package/src/controls-options-manager/enums.ts +6 -0
  341. package/src/controls-options-manager/index.ts +183 -0
  342. package/src/controls-options-manager/util.ts +20 -0
  343. package/src/index.js +4 -1
  344. package/src/locus-info/controlsUtils.ts +114 -0
  345. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  346. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  347. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  348. package/src/locus-info/{index.js → index.ts} +150 -66
  349. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  350. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  351. package/src/locus-info/{parser.js → parser.ts} +67 -79
  352. package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
  353. package/src/media/{index.js → index.ts} +182 -173
  354. package/src/media/{properties.js → properties.ts} +60 -37
  355. package/src/media/{util.js → util.ts} +2 -2
  356. package/src/mediaQualityMetrics/config.ts +384 -0
  357. package/src/meeting/in-meeting-actions.ts +31 -3
  358. package/src/meeting/{index.js → index.ts} +2512 -1579
  359. package/src/meeting/{muteState.js → muteState.ts} +95 -49
  360. package/src/meeting/{request.js → request.ts} +326 -142
  361. package/src/meeting/request.type.ts +13 -0
  362. package/src/meeting/{state.js → state.ts} +50 -35
  363. package/src/meeting/{util.js → util.ts} +117 -119
  364. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  365. package/src/meeting-info/{index.js → index.ts} +42 -36
  366. package/src/meeting-info/meeting-info-v2.ts +273 -0
  367. package/src/meeting-info/{request.js → request.ts} +14 -4
  368. package/src/meeting-info/{util.js → util.ts} +60 -51
  369. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  370. package/src/meetings/{collection.js → collection.ts} +6 -3
  371. package/src/meetings/index.ts +1159 -0
  372. package/src/meetings/{request.js → request.ts} +32 -25
  373. package/src/meetings/{util.js → util.ts} +58 -32
  374. package/src/member/{index.js → index.ts} +102 -56
  375. package/src/member/{util.js → util.ts} +52 -25
  376. package/src/members/{collection.js → collection.ts} +2 -2
  377. package/src/members/{index.js → index.ts} +221 -142
  378. package/src/members/{request.js → request.ts} +60 -16
  379. package/src/members/{util.js → util.ts} +50 -48
  380. package/src/metrics/{config.js → config.ts} +253 -92
  381. package/src/metrics/{constants.js → constants.ts} +0 -6
  382. package/src/metrics/{index.js → index.ts} +105 -94
  383. package/src/multistream/mediaRequestManager.ts +101 -39
  384. package/src/multistream/receiveSlot.ts +62 -26
  385. package/src/multistream/receiveSlotManager.ts +35 -21
  386. package/src/multistream/remoteMedia.ts +38 -5
  387. package/src/multistream/remoteMediaGroup.ts +4 -3
  388. package/src/multistream/remoteMediaManager.ts +152 -36
  389. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  390. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  391. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  392. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  393. package/src/reachability/{index.js → index.ts} +109 -85
  394. package/src/reachability/request.ts +46 -35
  395. package/src/reactions/constants.ts +4 -0
  396. package/src/reactions/reactions.ts +104 -0
  397. package/src/reactions/reactions.type.ts +62 -0
  398. package/src/reconnection-manager/{index.js → index.ts} +196 -103
  399. package/src/recording-controller/enums.ts +8 -0
  400. package/src/recording-controller/index.ts +315 -0
  401. package/src/recording-controller/util.ts +58 -0
  402. package/src/roap/{index.js → index.ts} +77 -60
  403. package/src/roap/request.ts +172 -0
  404. package/src/roap/turnDiscovery.ts +81 -41
  405. package/src/statsAnalyzer/global.ts +37 -0
  406. package/src/statsAnalyzer/index.ts +1234 -0
  407. package/src/statsAnalyzer/mqaUtil.ts +293 -0
  408. package/src/transcription/{index.js → index.ts} +46 -39
  409. package/test/integration/spec/converged-space-meetings.js +176 -0
  410. package/test/integration/spec/journey.js +665 -464
  411. package/test/integration/spec/space-meeting.js +320 -206
  412. package/test/integration/spec/transcription.js +7 -8
  413. package/test/unit/spec/breakouts/breakout.ts +147 -0
  414. package/test/unit/spec/breakouts/collection.ts +15 -0
  415. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  416. package/test/unit/spec/breakouts/index.ts +707 -0
  417. package/test/unit/spec/breakouts/request.ts +104 -0
  418. package/test/unit/spec/breakouts/utils.js +47 -0
  419. package/test/unit/spec/common/browser-detection.js +9 -28
  420. package/test/unit/spec/controls-options-manager/index.js +124 -0
  421. package/test/unit/spec/controls-options-manager/util.js +66 -0
  422. package/test/unit/spec/fixture/locus.js +92 -90
  423. package/test/unit/spec/locus-info/controlsUtils.js +25 -5
  424. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  425. package/test/unit/spec/locus-info/index.js +104 -2
  426. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  427. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  428. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  429. package/test/unit/spec/locus-info/parser.js +3 -9
  430. package/test/unit/spec/locus-info/selfConstant.js +97 -103
  431. package/test/unit/spec/locus-info/selfUtils.js +105 -12
  432. package/test/unit/spec/media/index.ts +39 -53
  433. package/test/unit/spec/media/properties.ts +9 -9
  434. package/test/unit/spec/meeting/in-meeting-actions.ts +13 -2
  435. package/test/unit/spec/meeting/index.js +2253 -811
  436. package/test/unit/spec/meeting/muteState.js +74 -55
  437. package/test/unit/spec/meeting/request.js +141 -43
  438. package/test/unit/spec/meeting/utils.js +106 -171
  439. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  440. package/test/unit/spec/meeting-info/request.js +7 -9
  441. package/test/unit/spec/meeting-info/util.js +11 -12
  442. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  443. package/test/unit/spec/meetings/collection.js +1 -1
  444. package/test/unit/spec/meetings/index.js +439 -257
  445. package/test/unit/spec/meetings/utils.js +14 -12
  446. package/test/unit/spec/member/index.js +0 -1
  447. package/test/unit/spec/member/util.js +31 -7
  448. package/test/unit/spec/members/index.js +104 -54
  449. package/test/unit/spec/members/request.js +29 -20
  450. package/test/unit/spec/members/utils.js +8 -5
  451. package/test/unit/spec/metrics/index.js +16 -21
  452. package/test/unit/spec/multistream/mediaRequestManager.ts +318 -64
  453. package/test/unit/spec/multistream/receiveSlot.ts +68 -17
  454. package/test/unit/spec/multistream/receiveSlotManager.ts +41 -13
  455. package/test/unit/spec/multistream/remoteMedia.ts +38 -2
  456. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  457. package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
  458. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  459. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  460. package/test/unit/spec/reachability/index.ts +70 -27
  461. package/test/unit/spec/reachability/request.js +66 -0
  462. package/test/unit/spec/reconnection-manager/index.js +58 -30
  463. package/test/unit/spec/recording-controller/index.js +231 -0
  464. package/test/unit/spec/recording-controller/util.js +102 -0
  465. package/test/unit/spec/roap/index.ts +12 -8
  466. package/test/unit/spec/roap/request.ts +217 -0
  467. package/test/unit/spec/roap/turnDiscovery.ts +72 -49
  468. package/test/unit/spec/stats-analyzer/index.js +86 -57
  469. package/test/utils/cmr.js +44 -42
  470. package/test/utils/constants.js +9 -0
  471. package/test/utils/testUtils.js +98 -77
  472. package/test/utils/webex-config.js +22 -18
  473. package/test/utils/webex-test-users.js +57 -50
  474. package/tsconfig.json +6 -0
  475. package/dist/media/internal-media-core-wrapper.js +0 -22
  476. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  477. package/dist/meeting/effectsState.js +0 -327
  478. package/dist/meeting/effectsState.js.map +0 -1
  479. package/dist/multistream/multistreamMedia.js +0 -116
  480. package/dist/multistream/multistreamMedia.js.map +0 -1
  481. package/dist/peer-connection-manager/util.js +0 -124
  482. package/dist/peer-connection-manager/util.js.map +0 -1
  483. package/src/common/logs/logger-proxy.js +0 -33
  484. package/src/locus-info/controlsUtils.js +0 -102
  485. package/src/media/internal-media-core-wrapper.ts +0 -9
  486. package/src/mediaQualityMetrics/config.js +0 -382
  487. package/src/meeting/effectsState.js +0 -205
  488. package/src/meeting-info/meeting-info-v2.js +0 -255
  489. package/src/meetings/index.js +0 -1015
  490. package/src/multistream/multistreamMedia.ts +0 -92
  491. package/src/peer-connection-manager/util.ts +0 -117
  492. package/src/roap/request.js +0 -127
  493. package/src/statsAnalyzer/global.js +0 -133
  494. package/src/statsAnalyzer/index.js +0 -1006
  495. package/src/statsAnalyzer/mqaUtil.js +0 -173
  496. package/test/unit/spec/meeting/effectsState.js +0 -291
  497. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  498. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -8,30 +8,21 @@ import uuid from 'uuid';
8
8
  import window from 'global/window';
9
9
  import anonymize from 'ip-anonymize';
10
10
 
11
+ import {getOSNameInternal} from '@webex/internal-plugin-metrics';
11
12
  import LoggerProxy from '../common/logs/logger-proxy';
12
13
  import {MEETING_ERRORS} from '../constants';
13
14
  import BrowserDetection from '../common/browser-detection';
14
15
 
15
16
  import {
16
- error, eventType, errorCodes as ERROR_CODE, OS_NAME, UNKNOWN, CLIENT_NAME,
17
- mediaType
17
+ error,
18
+ eventType,
19
+ errorCodes as ERROR_CODE,
20
+ UNKNOWN,
21
+ CLIENT_NAME,
22
+ mediaType,
18
23
  } from './config';
19
24
 
20
- const OSMap = {
21
- 'Chrome OS': OS_NAME.chrome,
22
- macOS: OS_NAME.MAC,
23
- Windows: OS_NAME.WINDOWS,
24
- iOS: OS_NAME.IOS,
25
- Android: OS_NAME.ANDROID,
26
- Linux: OS_NAME.LINUX
27
- };
28
-
29
- const {
30
- getOSName,
31
- getOSVersion,
32
- getBrowserName,
33
- getBrowserVersion
34
- } = BrowserDetection();
25
+ const {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();
35
26
 
36
27
  // Apply a CIDR /28 format to the IPV4 and /96 to the IPV6 addresses
37
28
  // For reference : https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing
@@ -76,34 +67,41 @@ const triggerTimers = ({event, meeting, data}) => {
76
67
  * @class Metrics
77
68
  */
78
69
  class Metrics {
70
+ static instance: Metrics;
71
+
72
+ _events: any;
73
+ keys: any;
74
+ meetingCollection: any;
75
+ webex: any;
76
+
79
77
  /**
80
- * Create Metrics Object
81
- * @constructor
82
- * @public
83
- * @memberof Meetings
84
- */
78
+ * Create Metrics Object
79
+ * @constructor
80
+ * @public
81
+ * @memberof Meetings
82
+ */
85
83
  constructor() {
86
84
  if (!Metrics.instance) {
87
- /**
88
- * @instance
89
- * @type {Array}
90
- * @private
91
- * @memberof Metrics
92
- */
85
+ /**
86
+ * @instance
87
+ * @type {Array}
88
+ * @private
89
+ * @memberof Metrics
90
+ */
93
91
  this._events = [];
94
92
  /**
95
- * @instance
96
- * @type {MeetingCollection}
97
- * @private
98
- * @memberof Metrics
99
- */
93
+ * @instance
94
+ * @type {MeetingCollection}
95
+ * @private
96
+ * @memberof Metrics
97
+ */
100
98
  this.meetingCollection = null;
101
99
  /**
102
- * @instance
103
- * @type {MeetingCollection}
104
- * @private
105
- * @memberof Metrics
106
- */
100
+ * @instance
101
+ * @type {MeetingCollection}
102
+ * @private
103
+ * @memberof Metrics
104
+ */
107
105
  this.keys = Object.values(eventType);
108
106
  /**
109
107
  * @instance
@@ -114,6 +112,7 @@ class Metrics {
114
112
  Metrics.instance = this;
115
113
  }
116
114
 
115
+ // eslint-disable-next-line no-constructor-return
117
116
  return Metrics.instance;
118
117
  }
119
118
 
@@ -125,7 +124,7 @@ class Metrics {
125
124
  *
126
125
  * @returns {void}
127
126
  */
128
- initialSetup(meetingCollection, webex) {
127
+ initialSetup(meetingCollection: object, webex: object) {
129
128
  this.meetingCollection = meetingCollection;
130
129
  this.webex = webex;
131
130
  }
@@ -139,12 +138,14 @@ class Metrics {
139
138
  * @param {object} options.event
140
139
  * @returns {object} null
141
140
  */
142
- postEvent(options) {
141
+ postEvent(options: {meeting?: any; meetingId?: string; data?: object; event?: any} | any) {
143
142
  const {meetingId, data = {}, event} = options;
144
143
  let {meeting} = options;
145
144
 
146
145
  if (this.keys.indexOf(event) === -1) {
147
- LoggerProxy.logger.error(`Metrics:index#postEvent --> Event ${event} doesn't exist in dictionary`);
146
+ LoggerProxy.logger.error(
147
+ `Metrics:index#postEvent --> Event ${event} doesn't exist in dictionary`
148
+ );
148
149
  }
149
150
 
150
151
  if (!meeting && meetingId) {
@@ -161,27 +162,27 @@ class Metrics {
161
162
  if (event === eventType.MEDIA_QUALITY) {
162
163
  data.event = event;
163
164
  meeting.sendMediaQualityAnalyzerMetrics(data);
164
- }
165
- else {
165
+ } else {
166
166
  meeting.callEvents.push(event);
167
167
  data.event = event;
168
168
  meeting.sendCallAnalyzerMetrics(data);
169
169
  }
170
- }
171
-
172
- else {
173
- LoggerProxy.logger.info(`Metrics:index#postEvent --> Event received for meetingId:${meetingId}, but meeting not found in collection.`);
170
+ } else {
171
+ LoggerProxy.logger.info(
172
+ `Metrics:index#postEvent --> Event received for meetingId:${meetingId}, but meeting not found in collection.`
173
+ );
174
174
  }
175
175
  }
176
176
 
177
177
  /**
178
178
  * Docs for Call analyzer metrics
179
- * https://sqbu-github.cisco.com/WebExSquared/call-analyzer/wiki
180
- * https://sqbu-github.cisco.com/WebExSquared/event-dictionary/blob/master/diagnostic-events.raml
181
- */
179
+ * https://sqbu-github.cisco.com/WebExSquared/call-analyzer/wiki
180
+ * https://sqbu-github.cisco.com/WebExSquared/event-dictionary/blob/master/diagnostic-events.raml
181
+ */
182
182
 
183
+ // eslint-disable-next-line @typescript-eslint/no-shadow
183
184
  initPayload(eventType, identifiers, options) {
184
- const payload = {
185
+ const payload: any = {
185
186
  eventId: uuid.v4(),
186
187
  version: 1,
187
188
  origin: {
@@ -194,21 +195,21 @@ class Metrics {
194
195
  localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),
195
196
  osVersion: getOSVersion() || 'unknown',
196
197
  subClientType: options.subClientType,
197
- os: this.getOsName(),
198
+ os: getOSNameInternal(),
198
199
  browser: getBrowserName(),
199
- browserVersion: getBrowserVersion()
200
- }
200
+ browserVersion: getBrowserVersion(),
201
+ },
201
202
  },
202
203
  originTime: {
203
- triggered: new Date().toISOString()
204
+ triggered: new Date().toISOString(),
204
205
  },
205
206
  senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,
206
207
  event: {
207
208
  name: eventType,
208
209
  canProceed: true,
209
210
  identifiers,
210
- eventData: {webClientDomain: window.location.hostname}
211
- }
211
+ eventData: {webClientDomain: window.location.hostname},
212
+ },
212
213
  };
213
214
 
214
215
  // TODO: more options should be checked and some of them should be mandatory in certain conditions
@@ -245,17 +246,6 @@ class Metrics {
245
246
  return payload;
246
247
  }
247
248
 
248
- /**
249
- * returns metrics friendly OS versions
250
- * @param {String} osName Os name
251
- * @returns {String}
252
- * @private
253
- * @memberof Metrics
254
- */
255
- getOsName() {
256
- return OSMap[getOSName()] ?? OS_NAME.OTHERS;
257
- }
258
-
259
249
  /**
260
250
  * get the payload specific for a media quality event through call analyzer
261
251
  * @param {String} eventType the event name
@@ -270,7 +260,21 @@ class Metrics {
270
260
  * @public
271
261
  * @memberof Metrics
272
262
  */
273
- initMediaPayload(eventType, identifiers, options = {}) {
263
+ public initMediaPayload(
264
+ // eslint-disable-next-line @typescript-eslint/no-shadow
265
+ eventType: string,
266
+ identifiers: {
267
+ correlationId: string;
268
+ locusUrl: string;
269
+ locusId: string;
270
+ },
271
+ options:
272
+ | {
273
+ intervalData: object;
274
+ clientType: string;
275
+ }
276
+ | any = {}
277
+ ) {
274
278
  const {audioSetupDelay, videoSetupDelay, joinTimes} = options;
275
279
 
276
280
  const payload = {
@@ -286,15 +290,15 @@ class Metrics {
286
290
  clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted
287
291
  clientVersion: `${CLIENT_NAME}/${this.webex.version}`,
288
292
  localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),
289
- os: this.getOsName(),
293
+ os: getOSNameInternal(),
290
294
  osVersion: getOSVersion() || UNKNOWN,
291
295
  subClientType: options.subClientType,
292
296
  browser: getBrowserName(),
293
- browserVersion: getBrowserVersion()
294
- }
297
+ browserVersion: getBrowserVersion(),
298
+ },
295
299
  },
296
300
  originTime: {
297
- triggered: new Date().toISOString()
301
+ triggered: new Date().toISOString(),
298
302
  },
299
303
  senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,
300
304
  event: {
@@ -304,16 +308,16 @@ class Metrics {
304
308
  intervals: [options.intervalData],
305
309
  joinTimes,
306
310
  eventData: {
307
- webClientDomain: window.location.hostname
311
+ webClientDomain: window.location.hostname,
308
312
  },
309
313
  sourceMetadata: {
310
314
  applicationSoftwareType: CLIENT_NAME,
311
315
  applicationSoftwareVersion: this.webex.version,
312
316
  mediaEngineSoftwareType: getBrowserName() || 'browser',
313
317
  mediaEngineSoftwareVersion: getOSVersion() || UNKNOWN,
314
- startTime: new Date().toISOString()
315
- }
316
- }
318
+ startTime: new Date().toISOString(),
319
+ },
320
+ },
317
321
  };
318
322
 
319
323
  return payload;
@@ -329,13 +333,12 @@ class Metrics {
329
333
  * @returns {{showToUser: boolean, category: string, errorDescription: string,
330
334
  * errorCode: number, errorData: *, fatal: boolean, name: string}}
331
335
  */
332
- parseLocusError(err, showToUser) {
336
+ parseLocusError(err: any, showToUser: boolean) {
333
337
  let errorCode;
334
338
 
335
339
  if (err && err.statusCode && err.statusCode >= 500) {
336
340
  errorCode = 1003;
337
- }
338
- else if (err && err.body && err.body.errorCode) {
341
+ } else if (err && err.body && err.body.errorCode) {
339
342
  // locus error codes: https://sqbu-github.cisco.com/WebExSquared/locus/blob/master/server/src/main/resources/locus-error-codes.properties
340
343
  switch (ERROR_CODE[err.body.errorCode]) {
341
344
  case MEETING_ERRORS.FREE_USER_MAX_PARTICIPANTS_EXCEEDED:
@@ -434,26 +437,22 @@ class Metrics {
434
437
  default:
435
438
  errorCode = 4008;
436
439
  }
437
- }
438
- else {
440
+ } else {
439
441
  errorCode = 4008;
440
442
  }
441
443
 
442
- return this.generateErrorPayload(
443
- errorCode, showToUser, error.name.LOCUS_RESPONSE, err
444
- );
444
+ return this.generateErrorPayload(errorCode, showToUser, error.name.LOCUS_RESPONSE, err);
445
445
  }
446
446
 
447
-
448
447
  generateErrorPayload(errorCode, shownToUser, name, err) {
449
448
  if (error.errors[errorCode]) {
450
- const errorPayload = {
449
+ const errorPayload: any = {
451
450
  shownToUser: shownToUser || false,
452
451
  category: error.errors[errorCode][2],
453
452
  errorDescription: error.errors[errorCode][0],
454
453
  errorCode,
455
454
  fatal: !includes(error.notFatalErrorList, errorCode),
456
- name: name || error.name.OTHER
455
+ name: name || error.name.OTHER,
457
456
  };
458
457
 
459
458
  if (err && err.body) {
@@ -480,8 +479,14 @@ class Metrics {
480
479
  let browserInfo;
481
480
  const clientInfo = util.format('client=%s', `${this.webex.meetings?.metrics?.clientName}`);
482
481
 
483
- if (['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1) {
484
- browserInfo = util.format('browser=%s', `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`);
482
+ if (
483
+ ['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !==
484
+ -1
485
+ ) {
486
+ browserInfo = util.format(
487
+ 'browser=%s',
488
+ `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`
489
+ );
485
490
  }
486
491
  const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);
487
492
 
@@ -489,12 +494,18 @@ class Metrics {
489
494
  userAgentOption = `(${browserInfo}`;
490
495
  }
491
496
  if (osInfo) {
492
- userAgentOption = userAgentOption ? `${userAgentOption}; ${clientInfo}; ${osInfo}` : `${clientInfo}; (${osInfo}`;
497
+ userAgentOption = userAgentOption
498
+ ? `${userAgentOption}; ${clientInfo}; ${osInfo}`
499
+ : `${clientInfo}; (${osInfo}`;
493
500
  }
494
501
  if (userAgentOption) {
495
502
  userAgentOption += ')';
496
503
 
497
- return util.format('webex-js-sdk/%s %s', `${process.env.NODE_ENV}-${this.webex.version}`, userAgentOption);
504
+ return util.format(
505
+ 'webex-js-sdk/%s %s',
506
+ `${process.env.NODE_ENV}-${this.webex.version}`,
507
+ userAgentOption
508
+ );
498
509
  }
499
510
 
500
511
  return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${this.webex.version}`);
@@ -515,11 +526,11 @@ class Metrics {
515
526
  *
516
527
  * @returns {void}
517
528
  */
518
- sendBehavioralMetric(metricName, metricFields = {}, metricTags = {}) {
529
+ sendBehavioralMetric(metricName: string, metricFields: object = {}, metricTags: object = {}) {
519
530
  this.webex.internal.metrics.submitClientMetrics(metricName, {
520
531
  type: this.webex.config.metrics.type,
521
532
  fields: metricFields,
522
- tags: metricTags
533
+ tags: metricTags,
523
534
  });
524
535
  }
525
536
  }
@@ -1,9 +1,18 @@
1
1
  /* eslint-disable require-jsdoc */
2
- import {MediaConnection as MC} from '@webex/internal-media-core';
2
+ import {
3
+ MediaRequest as WcmeMediaRequest,
4
+ Policy,
5
+ ActiveSpeakerInfo,
6
+ ReceiverSelectedInfo,
7
+ CodecInfo as WcmeCodecInfo,
8
+ H264Codec,
9
+ } from '@webex/internal-media-core';
10
+ import {cloneDeep, debounce} from 'lodash';
3
11
 
4
12
  import LoggerProxy from '../common/logs/logger-proxy';
5
13
 
6
- import {ReceiveSlot, ReceiveSlotId} from './receiveSlot';
14
+ import {ReceiveSlot, ReceiveSlotEvents, ReceiveSlotId} from './receiveSlot';
15
+ import {getMaxFs} from './remoteMedia';
7
16
 
8
17
  export interface ActiveSpeakerPolicyInfo {
9
18
  policy: 'active-speaker';
@@ -35,6 +44,7 @@ export interface MediaRequest {
35
44
  policyInfo: PolicyInfo;
36
45
  receiveSlots: Array<ReceiveSlot>;
37
46
  codecInfo?: CodecInfo;
47
+ preferredMaxFs?: number;
38
48
  }
39
49
 
40
50
  export type MediaRequestId = string;
@@ -47,77 +57,120 @@ const CODEC_DEFAULTS = {
47
57
  },
48
58
  };
49
59
 
50
- type SendMediaRequestsCallback = (mediaRequests: MC.MediaRequest[]) => void;
60
+ const DEBOUNCED_SOURCE_UPDATE_TIME = 1000;
61
+
62
+ type DegradationPreferences = {
63
+ maxMacroblocksLimit: number;
64
+ };
65
+
66
+ type SendMediaRequestsCallback = (mediaRequests: WcmeMediaRequest[]) => void;
51
67
 
52
68
  export class MediaRequestManager {
53
69
  private sendMediaRequestsCallback: SendMediaRequestsCallback;
54
70
 
55
- private counter;
71
+ private counter: number;
56
72
 
57
73
  private clientRequests: {[key: MediaRequestId]: MediaRequest};
58
74
 
59
- private slotsActiveInLastMediaRequest: {[key: ReceiveSlotId]: ReceiveSlot};
75
+ private degradationPreferences: DegradationPreferences;
76
+
77
+ private sourceUpdateListener: () => void;
60
78
 
61
- constructor(sendMediaRequestsCallback: SendMediaRequestsCallback) {
79
+ private debouncedSourceUpdateListener: () => void;
80
+
81
+ constructor(
82
+ degradationPreferences: DegradationPreferences,
83
+ sendMediaRequestsCallback: SendMediaRequestsCallback
84
+ ) {
62
85
  this.sendMediaRequestsCallback = sendMediaRequestsCallback;
63
86
  this.counter = 0;
64
87
  this.clientRequests = {};
65
- this.slotsActiveInLastMediaRequest = {};
88
+ this.degradationPreferences = degradationPreferences;
89
+ this.sourceUpdateListener = this.commit.bind(this);
90
+ this.debouncedSourceUpdateListener = debounce(
91
+ this.sourceUpdateListener,
92
+ DEBOUNCED_SOURCE_UPDATE_TIME
93
+ );
66
94
  }
67
95
 
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
- );
96
+ public setDegradationPreferences(degradationPreferences: DegradationPreferences) {
97
+ this.degradationPreferences = degradationPreferences;
98
+ this.sendRequests(); // re-send requests after preferences are set
99
+ }
77
100
 
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}`
101
+ private getDegradedClientRequests() {
102
+ const clientRequests = cloneDeep(this.clientRequests);
103
+ const maxFsLimits = [
104
+ getMaxFs('best'),
105
+ getMaxFs('large'),
106
+ getMaxFs('medium'),
107
+ getMaxFs('small'),
108
+ getMaxFs('very small'),
109
+ getMaxFs('thumbnail'),
110
+ ];
111
+
112
+ // reduce max-fs until total macroblocks is below limit
113
+ for (let i = 0; i < maxFsLimits.length; i += 1) {
114
+ let totalMacroblocksRequested = 0;
115
+ Object.entries(clientRequests).forEach(([id, mr]) => {
116
+ if (mr.codecInfo) {
117
+ mr.codecInfo.maxFs = Math.min(
118
+ mr.preferredMaxFs || CODEC_DEFAULTS.h264.maxFs,
119
+ mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,
120
+ maxFsLimits[i]
121
+ );
122
+ // we only consider sources with "live" state
123
+ const slotsWithLiveSource = this.clientRequests[id].receiveSlots.filter(
124
+ (rs) => rs.sourceState === 'live'
125
+ );
126
+ totalMacroblocksRequested += mr.codecInfo.maxFs * slotsWithLiveSource.length;
127
+ }
128
+ });
129
+ if (totalMacroblocksRequested <= this.degradationPreferences.maxMacroblocksLimit) {
130
+ if (i !== 0) {
131
+ LoggerProxy.logger.warn(
132
+ `multistream:mediaRequestManager --> too many streams with high max-fs, frame size will be limited to ${maxFsLimits[i]}`
133
+ );
134
+ }
135
+ break;
136
+ } else if (i === maxFsLimits.length - 1) {
137
+ LoggerProxy.logger.warn(
138
+ `multistream:mediaRequestManager --> even with frame size limited to ${maxFsLimits[i]} you are still requesting too many streams, consider reducing the number of requests`
85
139
  );
86
- slot.resetSourceState();
87
140
  }
88
141
  }
89
142
 
90
- this.slotsActiveInLastMediaRequest = activeSlots;
143
+ return clientRequests;
91
144
  }
92
145
 
93
146
  private sendRequests() {
94
- const wcmeMediaRequests: MC.MediaRequest[] = [];
147
+ const wcmeMediaRequests: WcmeMediaRequest[] = [];
95
148
 
96
- // todo: check how many streams we're asking for and what resolution and introduce some limits (spark-377701)
149
+ const clientRequests = this.getDegradedClientRequests();
97
150
  const maxPayloadBitsPerSecond = 10 * 1000 * 1000;
98
151
 
99
152
  // map all the client media requests to wcme media requests
100
- Object.values(this.clientRequests).forEach((mr) => {
153
+ Object.values(clientRequests).forEach((mr) => {
101
154
  wcmeMediaRequests.push(
102
- new MC.MediaRequest(
155
+ new WcmeMediaRequest(
103
156
  mr.policyInfo.policy === 'active-speaker'
104
- ? MC.Policy.ActiveSpeaker
105
- : MC.Policy.ReceiverSelected,
157
+ ? Policy.ActiveSpeaker
158
+ : Policy.ReceiverSelected,
106
159
  mr.policyInfo.policy === 'active-speaker'
107
- ? new MC.ActiveSpeakerInfo(
160
+ ? new ActiveSpeakerInfo(
108
161
  mr.policyInfo.priority,
109
162
  mr.policyInfo.crossPriorityDuplication,
110
163
  mr.policyInfo.crossPolicyDuplication,
111
164
  mr.policyInfo.preferLiveVideo
112
165
  )
113
- : new MC.ReceiverSelectedInfo(mr.policyInfo.csi),
166
+ : new ReceiverSelectedInfo(mr.policyInfo.csi),
114
167
  mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),
115
168
  maxPayloadBitsPerSecond,
116
169
  mr.codecInfo && [
117
- new MC.CodecInfo(
170
+ new WcmeCodecInfo(
118
171
  0x80,
119
- new MC.H264Codec(
120
- mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,
172
+ new H264Codec(
173
+ mr.codecInfo.maxFs,
121
174
  mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,
122
175
  mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps,
123
176
  mr.codecInfo.maxWidth,
@@ -130,8 +183,6 @@ export class MediaRequestManager {
130
183
  });
131
184
 
132
185
  this.sendMediaRequestsCallback(wcmeMediaRequests);
133
-
134
- this.resetInactiveReceiveSlots();
135
186
  }
136
187
 
137
188
  public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {
@@ -140,6 +191,14 @@ export class MediaRequestManager {
140
191
 
141
192
  this.clientRequests[newId] = mediaRequest;
142
193
 
194
+ mediaRequest.receiveSlots.forEach((rs) => {
195
+ rs.on(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);
196
+ rs.on(ReceiveSlotEvents.MaxFsUpdate, ({maxFs}) => {
197
+ mediaRequest.preferredMaxFs = maxFs;
198
+ this.debouncedSourceUpdateListener();
199
+ });
200
+ });
201
+
143
202
  if (commit) {
144
203
  this.commit();
145
204
  }
@@ -148,6 +207,10 @@ export class MediaRequestManager {
148
207
  }
149
208
 
150
209
  public cancelRequest(requestId: MediaRequestId, commit = true) {
210
+ this.clientRequests[requestId]?.receiveSlots.forEach((rs) => {
211
+ rs.off(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);
212
+ });
213
+
151
214
  delete this.clientRequests[requestId];
152
215
 
153
216
  if (commit) {
@@ -161,6 +224,5 @@ export class MediaRequestManager {
161
224
 
162
225
  public reset() {
163
226
  this.clientRequests = {};
164
- this.slotsActiveInLastMediaRequest = {};
165
227
  }
166
228
  }