@webex/plugin-meetings 3.0.0-beta.7 → 3.0.0-beta.71

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