@webex/plugin-meetings 3.0.0-beta.17 → 3.0.0-beta.171

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 (427) hide show
  1. package/README.md +45 -7
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +359 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +216 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +23 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +52 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +45 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1048 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +78 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +67 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +3 -2
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/config.js +6 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +194 -28
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +300 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +107 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +214 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +92 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +350 -41
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/mediaSharesUtils.js +43 -1
  53. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  54. package/dist/locus-info/parser.js +2 -1
  55. package/dist/locus-info/parser.js.map +1 -1
  56. package/dist/locus-info/selfUtils.js +97 -14
  57. package/dist/locus-info/selfUtils.js.map +1 -1
  58. package/dist/media/index.js +41 -136
  59. package/dist/media/index.js.map +1 -1
  60. package/dist/media/properties.js +33 -94
  61. package/dist/media/properties.js.map +1 -1
  62. package/dist/mediaQualityMetrics/config.js +505 -493
  63. package/dist/mediaQualityMetrics/config.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +76 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +2757 -2439
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +291 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +229 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +191 -167
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/request.type.js.map +1 -1
  75. package/dist/meeting/util.js +477 -466
  76. package/dist/meeting/util.js.map +1 -1
  77. package/dist/meeting-info/index.js +48 -7
  78. package/dist/meeting-info/index.js.map +1 -1
  79. package/dist/meeting-info/meeting-info-v2.js +172 -50
  80. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  81. package/dist/meeting-info/utilv2.js +20 -5
  82. package/dist/meeting-info/utilv2.js.map +1 -1
  83. package/dist/meetings/collection.js +22 -0
  84. package/dist/meetings/collection.js.map +1 -1
  85. package/dist/meetings/index.js +377 -82
  86. package/dist/meetings/index.js.map +1 -1
  87. package/dist/meetings/meetings.types.js +7 -0
  88. package/dist/meetings/meetings.types.js.map +1 -0
  89. package/dist/meetings/request.js +16 -12
  90. package/dist/meetings/request.js.map +1 -1
  91. package/dist/meetings/util.js +88 -1
  92. package/dist/meetings/util.js.map +1 -1
  93. package/dist/member/index.js +43 -0
  94. package/dist/member/index.js.map +1 -1
  95. package/dist/member/types.js +15 -0
  96. package/dist/member/types.js.map +1 -0
  97. package/dist/member/util.js +97 -3
  98. package/dist/member/util.js.map +1 -1
  99. package/dist/members/collection.js +10 -0
  100. package/dist/members/collection.js.map +1 -1
  101. package/dist/members/index.js +94 -11
  102. package/dist/members/index.js.map +1 -1
  103. package/dist/members/request.js +109 -39
  104. package/dist/members/request.js.map +1 -1
  105. package/dist/members/types.js +15 -0
  106. package/dist/members/types.js.map +1 -0
  107. package/dist/members/util.js +316 -233
  108. package/dist/members/util.js.map +1 -1
  109. package/dist/metrics/constants.js +3 -5
  110. package/dist/metrics/constants.js.map +1 -1
  111. package/dist/metrics/index.js +1 -468
  112. package/dist/metrics/index.js.map +1 -1
  113. package/dist/multistream/mediaRequestManager.js +265 -36
  114. package/dist/multistream/mediaRequestManager.js.map +1 -1
  115. package/dist/multistream/receiveSlot.js +52 -19
  116. package/dist/multistream/receiveSlot.js.map +1 -1
  117. package/dist/multistream/receiveSlotManager.js +53 -33
  118. package/dist/multistream/receiveSlotManager.js.map +1 -1
  119. package/dist/multistream/remoteMedia.js +44 -18
  120. package/dist/multistream/remoteMedia.js.map +1 -1
  121. package/dist/multistream/remoteMediaGroup.js +60 -3
  122. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  123. package/dist/multistream/remoteMediaManager.js +322 -103
  124. package/dist/multistream/remoteMediaManager.js.map +1 -1
  125. package/dist/networkQualityMonitor/index.js +4 -2
  126. package/dist/networkQualityMonitor/index.js.map +1 -1
  127. package/dist/reachability/index.js +117 -60
  128. package/dist/reachability/index.js.map +1 -1
  129. package/dist/reachability/request.js +12 -5
  130. package/dist/reachability/request.js.map +1 -1
  131. package/dist/reactions/constants.js +13 -0
  132. package/dist/reactions/constants.js.map +1 -0
  133. package/dist/reactions/reactions.js +2 -2
  134. package/dist/reactions/reactions.js.map +1 -1
  135. package/dist/reactions/reactions.type.js +18 -18
  136. package/dist/reactions/reactions.type.js.map +1 -1
  137. package/dist/reconnection-manager/index.js +216 -162
  138. package/dist/reconnection-manager/index.js.map +1 -1
  139. package/dist/recording-controller/enums.js +17 -0
  140. package/dist/recording-controller/enums.js.map +1 -0
  141. package/dist/recording-controller/index.js +363 -0
  142. package/dist/recording-controller/index.js.map +1 -0
  143. package/dist/recording-controller/util.js +64 -0
  144. package/dist/recording-controller/util.js.map +1 -0
  145. package/dist/roap/index.js +21 -29
  146. package/dist/roap/index.js.map +1 -1
  147. package/dist/roap/request.js +135 -94
  148. package/dist/roap/request.js.map +1 -1
  149. package/dist/roap/turnDiscovery.js +135 -53
  150. package/dist/roap/turnDiscovery.js.map +1 -1
  151. package/dist/statsAnalyzer/global.js +1 -93
  152. package/dist/statsAnalyzer/global.js.map +1 -1
  153. package/dist/statsAnalyzer/index.js +329 -314
  154. package/dist/statsAnalyzer/index.js.map +1 -1
  155. package/dist/statsAnalyzer/mqaUtil.js +103 -54
  156. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  157. package/dist/types/annotation/annotation.types.d.ts +43 -0
  158. package/dist/types/annotation/constants.d.ts +31 -0
  159. package/dist/types/annotation/index.d.ts +124 -0
  160. package/dist/types/breakouts/breakout.d.ts +8 -0
  161. package/dist/types/breakouts/collection.d.ts +5 -0
  162. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  163. package/dist/types/breakouts/events.d.ts +8 -0
  164. package/dist/types/breakouts/index.d.ts +5 -0
  165. package/dist/types/breakouts/request.d.ts +22 -0
  166. package/dist/types/breakouts/utils.d.ts +15 -0
  167. package/dist/types/common/browser-detection.d.ts +9 -0
  168. package/dist/types/common/collection.d.ts +48 -0
  169. package/dist/types/common/config.d.ts +2 -0
  170. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  171. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  172. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  173. package/dist/types/common/errors/media.d.ts +15 -0
  174. package/dist/types/common/errors/parameter.d.ts +15 -0
  175. package/dist/types/common/errors/password-error.d.ts +15 -0
  176. package/dist/types/common/errors/permission.d.ts +14 -0
  177. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  178. package/dist/types/common/errors/reconnection.d.ts +15 -0
  179. package/dist/types/common/errors/stats.d.ts +15 -0
  180. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  181. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  182. package/dist/types/common/events/events-scope.d.ts +17 -0
  183. package/dist/types/common/events/events.d.ts +12 -0
  184. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  185. package/dist/types/common/events/util.d.ts +2 -0
  186. package/dist/types/common/logs/logger-config.d.ts +2 -0
  187. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  188. package/dist/types/common/logs/request.d.ts +34 -0
  189. package/dist/types/common/queue.d.ts +32 -0
  190. package/dist/types/config.d.ts +72 -0
  191. package/dist/types/constants.d.ts +1007 -0
  192. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  193. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  194. package/dist/types/controls-options-manager/index.d.ts +136 -0
  195. package/dist/types/controls-options-manager/types.d.ts +43 -0
  196. package/dist/types/controls-options-manager/util.d.ts +1 -0
  197. package/dist/types/index.d.ts +7 -0
  198. package/dist/types/interpretation/collection.d.ts +5 -0
  199. package/dist/types/interpretation/index.d.ts +5 -0
  200. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  201. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  202. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  203. package/dist/types/locus-info/fullState.d.ts +2 -0
  204. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  205. package/dist/types/locus-info/index.d.ts +315 -0
  206. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  207. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  208. package/dist/types/locus-info/parser.d.ts +212 -0
  209. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  210. package/dist/types/media/index.d.ts +34 -0
  211. package/dist/types/media/properties.d.ts +93 -0
  212. package/dist/types/media/util.d.ts +2 -0
  213. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  214. package/dist/types/meeting/in-meeting-actions.d.ts +149 -0
  215. package/dist/types/meeting/index.d.ts +1462 -0
  216. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  217. package/dist/types/meeting/muteState.d.ts +184 -0
  218. package/dist/types/meeting/request.d.ts +270 -0
  219. package/dist/types/meeting/request.type.d.ts +11 -0
  220. package/dist/types/meeting/state.d.ts +9 -0
  221. package/dist/types/meeting/util.d.ts +77 -0
  222. package/dist/types/meeting-info/collection.d.ts +20 -0
  223. package/dist/types/meeting-info/index.d.ts +62 -0
  224. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  225. package/dist/types/meeting-info/request.d.ts +22 -0
  226. package/dist/types/meeting-info/util.d.ts +2 -0
  227. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  228. package/dist/types/meetings/collection.d.ts +31 -0
  229. package/dist/types/meetings/index.d.ts +365 -0
  230. package/dist/types/meetings/meetings.types.d.ts +4 -0
  231. package/dist/types/meetings/request.d.ts +27 -0
  232. package/dist/types/meetings/util.d.ts +18 -0
  233. package/dist/types/member/index.d.ts +158 -0
  234. package/dist/types/member/types.d.ts +21 -0
  235. package/dist/types/member/util.d.ts +2 -0
  236. package/dist/types/members/collection.d.ts +29 -0
  237. package/dist/types/members/index.d.ts +353 -0
  238. package/dist/types/members/request.d.ts +114 -0
  239. package/dist/types/members/types.d.ts +24 -0
  240. package/dist/types/members/util.d.ts +210 -0
  241. package/dist/types/metrics/constants.d.ts +55 -0
  242. package/dist/types/metrics/index.d.ts +45 -0
  243. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  244. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  245. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  246. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  247. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  248. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  249. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  250. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  251. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  252. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  253. package/dist/types/reachability/index.d.ts +152 -0
  254. package/dist/types/reachability/request.d.ts +37 -0
  255. package/dist/types/reactions/constants.d.ts +3 -0
  256. package/dist/types/reactions/reactions.d.ts +4 -0
  257. package/dist/types/reactions/reactions.type.d.ts +52 -0
  258. package/dist/types/reconnection-manager/index.d.ts +126 -0
  259. package/dist/types/recording-controller/enums.d.ts +7 -0
  260. package/dist/types/recording-controller/index.d.ts +208 -0
  261. package/dist/types/recording-controller/util.d.ts +14 -0
  262. package/dist/types/roap/index.d.ts +77 -0
  263. package/dist/types/roap/request.d.ts +36 -0
  264. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  265. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  266. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  267. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  268. package/dist/types/transcription/index.d.ts +64 -0
  269. package/package.json +29 -21
  270. package/src/annotation/annotation.types.ts +52 -0
  271. package/src/annotation/constants.ts +36 -0
  272. package/src/annotation/index.ts +343 -0
  273. package/src/breakouts/README.md +220 -0
  274. package/src/breakouts/breakout.ts +188 -0
  275. package/src/breakouts/collection.ts +19 -0
  276. package/src/breakouts/edit-lock-error.ts +25 -0
  277. package/src/breakouts/events.ts +56 -0
  278. package/src/breakouts/index.ts +925 -0
  279. package/src/breakouts/request.ts +55 -0
  280. package/src/breakouts/utils.ts +57 -0
  281. package/src/common/errors/webex-errors.ts +6 -2
  282. package/src/common/logs/logger-proxy.ts +1 -1
  283. package/src/config.ts +5 -7
  284. package/src/constants.ts +183 -22
  285. package/src/controls-options-manager/constants.ts +5 -0
  286. package/src/controls-options-manager/enums.ts +18 -0
  287. package/src/controls-options-manager/index.ts +278 -0
  288. package/src/controls-options-manager/types.ts +59 -0
  289. package/src/controls-options-manager/util.ts +286 -0
  290. package/src/index.ts +39 -0
  291. package/src/interpretation/README.md +51 -0
  292. package/src/interpretation/collection.ts +19 -0
  293. package/src/interpretation/index.ts +182 -0
  294. package/src/interpretation/siLanguage.ts +18 -0
  295. package/src/locus-info/controlsUtils.ts +110 -0
  296. package/src/locus-info/index.ts +374 -38
  297. package/src/locus-info/mediaSharesUtils.ts +48 -0
  298. package/src/locus-info/parser.ts +2 -1
  299. package/src/locus-info/selfUtils.ts +86 -2
  300. package/src/media/index.ts +78 -144
  301. package/src/media/properties.ts +55 -99
  302. package/src/mediaQualityMetrics/config.ts +379 -377
  303. package/src/meeting/in-meeting-actions.ts +151 -3
  304. package/src/meeting/index.ts +2181 -2052
  305. package/src/meeting/locusMediaRequest.ts +309 -0
  306. package/src/meeting/muteState.ts +228 -132
  307. package/src/meeting/request.ts +100 -91
  308. package/src/meeting/request.type.ts +2 -0
  309. package/src/meeting/util.ts +450 -439
  310. package/src/meeting-info/index.ts +54 -8
  311. package/src/meeting-info/meeting-info-v2.ts +150 -14
  312. package/src/meeting-info/utilv2.ts +13 -3
  313. package/src/meetings/collection.ts +20 -0
  314. package/src/meetings/index.ts +396 -89
  315. package/src/meetings/meetings.types.ts +12 -0
  316. package/src/meetings/request.ts +3 -1
  317. package/src/meetings/util.ts +103 -4
  318. package/src/member/index.ts +42 -0
  319. package/src/member/types.ts +24 -0
  320. package/src/member/util.ts +95 -1
  321. package/src/members/collection.ts +8 -0
  322. package/src/members/index.ts +108 -6
  323. package/src/members/request.ts +98 -17
  324. package/src/members/types.ts +28 -0
  325. package/src/members/util.ts +319 -240
  326. package/src/metrics/constants.ts +2 -4
  327. package/src/metrics/index.ts +1 -490
  328. package/src/multistream/mediaRequestManager.ts +337 -63
  329. package/src/multistream/receiveSlot.ts +68 -26
  330. package/src/multistream/receiveSlotManager.ts +61 -38
  331. package/src/multistream/remoteMedia.ts +29 -3
  332. package/src/multistream/remoteMediaGroup.ts +61 -2
  333. package/src/multistream/remoteMediaManager.ts +260 -66
  334. package/src/networkQualityMonitor/index.ts +6 -6
  335. package/src/reachability/index.ts +75 -25
  336. package/src/reachability/request.ts +10 -5
  337. package/src/reactions/constants.ts +4 -0
  338. package/src/reactions/reactions.ts +4 -4
  339. package/src/reactions/reactions.type.ts +28 -3
  340. package/src/reconnection-manager/index.ts +83 -49
  341. package/src/recording-controller/enums.ts +8 -0
  342. package/src/recording-controller/index.ts +333 -0
  343. package/src/recording-controller/util.ts +75 -0
  344. package/src/roap/index.ts +21 -30
  345. package/src/roap/request.ts +72 -61
  346. package/src/roap/turnDiscovery.ts +51 -27
  347. package/src/statsAnalyzer/global.ts +1 -94
  348. package/src/statsAnalyzer/index.ts +380 -390
  349. package/src/statsAnalyzer/mqaUtil.ts +106 -99
  350. package/test/integration/spec/converged-space-meetings.js +233 -0
  351. package/test/integration/spec/journey.js +336 -259
  352. package/test/integration/spec/space-meeting.js +77 -4
  353. package/test/unit/spec/annotation/index.ts +436 -0
  354. package/test/unit/spec/breakouts/breakout.ts +237 -0
  355. package/test/unit/spec/breakouts/collection.ts +15 -0
  356. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  357. package/test/unit/spec/breakouts/events.ts +89 -0
  358. package/test/unit/spec/breakouts/index.ts +1790 -0
  359. package/test/unit/spec/breakouts/request.ts +104 -0
  360. package/test/unit/spec/breakouts/utils.js +72 -0
  361. package/test/unit/spec/controls-options-manager/index.js +287 -0
  362. package/test/unit/spec/controls-options-manager/util.js +518 -0
  363. package/test/unit/spec/fixture/locus.js +1 -0
  364. package/test/unit/spec/interpretation/collection.ts +15 -0
  365. package/test/unit/spec/interpretation/index.ts +329 -0
  366. package/test/unit/spec/interpretation/siLanguage.ts +26 -0
  367. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  368. package/test/unit/spec/locus-info/index.js +792 -4
  369. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  370. package/test/unit/spec/locus-info/selfConstant.js +48 -0
  371. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  372. package/test/unit/spec/media/index.ts +130 -24
  373. package/test/unit/spec/media/properties.ts +9 -9
  374. package/test/unit/spec/meeting/in-meeting-actions.ts +75 -3
  375. package/test/unit/spec/meeting/index.js +2834 -1442
  376. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  377. package/test/unit/spec/meeting/muteState.js +370 -208
  378. package/test/unit/spec/meeting/request.js +354 -42
  379. package/test/unit/spec/meeting/utils.js +384 -170
  380. package/test/unit/spec/meeting-info/index.js +181 -0
  381. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  382. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  383. package/test/unit/spec/meetings/collection.js +14 -0
  384. package/test/unit/spec/meetings/index.js +847 -121
  385. package/test/unit/spec/meetings/utils.js +206 -2
  386. package/test/unit/spec/member/index.js +31 -0
  387. package/test/unit/spec/member/util.js +408 -32
  388. package/test/unit/spec/members/index.js +320 -1
  389. package/test/unit/spec/members/request.js +206 -27
  390. package/test/unit/spec/members/utils.js +184 -0
  391. package/test/unit/spec/metrics/index.js +1 -50
  392. package/test/unit/spec/multistream/mediaRequestManager.ts +1012 -109
  393. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  394. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  395. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  396. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  397. package/test/unit/spec/multistream/remoteMediaManager.ts +672 -65
  398. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  399. package/test/unit/spec/reachability/index.ts +176 -25
  400. package/test/unit/spec/reachability/request.js +66 -0
  401. package/test/unit/spec/reconnection-manager/index.js +95 -13
  402. package/test/unit/spec/recording-controller/index.js +307 -0
  403. package/test/unit/spec/recording-controller/util.js +229 -0
  404. package/test/unit/spec/roap/index.ts +28 -52
  405. package/test/unit/spec/roap/request.ts +225 -0
  406. package/test/unit/spec/roap/turnDiscovery.ts +73 -34
  407. package/test/unit/spec/stats-analyzer/index.js +94 -43
  408. package/test/utils/constants.js +9 -0
  409. package/test/utils/integrationTestUtils.js +46 -0
  410. package/test/utils/testUtils.js +0 -45
  411. package/test/utils/webex-config.js +4 -0
  412. package/test/utils/webex-test-users.js +7 -3
  413. package/tsconfig.json +6 -0
  414. package/dist/media/internal-media-core-wrapper.js +0 -18
  415. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  416. package/dist/meeting/effectsState.js +0 -262
  417. package/dist/meeting/effectsState.js.map +0 -1
  418. package/dist/metrics/config.js +0 -299
  419. package/dist/metrics/config.js.map +0 -1
  420. package/dist/multistream/multistreamMedia.js +0 -106
  421. package/dist/multistream/multistreamMedia.js.map +0 -1
  422. package/src/index.js +0 -15
  423. package/src/media/internal-media-core-wrapper.ts +0 -9
  424. package/src/meeting/effectsState.ts +0 -211
  425. package/src/metrics/config.ts +0 -495
  426. package/src/multistream/multistreamMedia.ts +0 -93
  427. package/test/unit/spec/meeting/effectsState.js +0 -281
@@ -1,9 +1,20 @@
1
1
  /* eslint-disable require-jsdoc */
2
- import {MediaConnection as MC} from '@webex/internal-media-core';
2
+ import {
3
+ StreamRequest,
4
+ Policy,
5
+ ActiveSpeakerInfo,
6
+ ReceiverSelectedInfo,
7
+ CodecInfo as WcmeCodecInfo,
8
+ H264Codec,
9
+ getRecommendedMaxBitrateForFrameSize,
10
+ RecommendedOpusBitrates,
11
+ } from '@webex/internal-media-core';
12
+ import {cloneDeepWith, debounce, isEmpty} from 'lodash';
3
13
 
4
14
  import LoggerProxy from '../common/logs/logger-proxy';
5
15
 
6
- import {ReceiveSlot, ReceiveSlotId} from './receiveSlot';
16
+ import {ReceiveSlot, ReceiveSlotEvents} from './receiveSlot';
17
+ import {getMaxFs} from './remoteMedia';
7
18
 
8
19
  export interface ActiveSpeakerPolicyInfo {
9
20
  policy: 'active-speaker';
@@ -35,6 +46,8 @@ export interface MediaRequest {
35
46
  policyInfo: PolicyInfo;
36
47
  receiveSlots: Array<ReceiveSlot>;
37
48
  codecInfo?: CodecInfo;
49
+ preferredMaxFs?: number;
50
+ handleMaxFs?: ({maxFs}: {maxFs: number}) => void;
38
51
  }
39
52
 
40
53
  export type MediaRequestId = string;
@@ -47,91 +60,326 @@ const CODEC_DEFAULTS = {
47
60
  },
48
61
  };
49
62
 
50
- type SendMediaRequestsCallback = (mediaRequests: MC.MediaRequest[]) => void;
63
+ const DEBOUNCED_SOURCE_UPDATE_TIME = 1000;
64
+
65
+ type DegradationPreferences = {
66
+ maxMacroblocksLimit: number;
67
+ };
68
+
69
+ type SendMediaRequestsCallback = (streamRequests: StreamRequest[]) => void;
70
+ type Kind = 'audio' | 'video';
71
+
72
+ type Options = {
73
+ degradationPreferences: DegradationPreferences;
74
+ kind: Kind;
75
+ trimRequestsToNumOfSources: boolean; // if enabled, AS speaker requests will be trimmed based on the calls to setNumCurrentSources()
76
+ };
77
+
78
+ type ClientRequestsMap = {[key: MediaRequestId]: MediaRequest};
51
79
 
52
80
  export class MediaRequestManager {
53
81
  private sendMediaRequestsCallback: SendMediaRequestsCallback;
54
82
 
55
- private counter;
83
+ private kind: Kind;
84
+
85
+ private counter: number;
86
+
87
+ private clientRequests: ClientRequestsMap;
56
88
 
57
- private clientRequests: {[key: MediaRequestId]: MediaRequest};
89
+ private degradationPreferences: DegradationPreferences;
58
90
 
59
- private slotsActiveInLastMediaRequest: {[key: ReceiveSlotId]: ReceiveSlot};
91
+ private sourceUpdateListener: () => void;
60
92
 
61
- constructor(sendMediaRequestsCallback: SendMediaRequestsCallback) {
93
+ private debouncedSourceUpdateListener: () => void;
94
+
95
+ private previousStreamRequests: Array<StreamRequest> = [];
96
+
97
+ private trimRequestsToNumOfSources: boolean;
98
+ private numTotalSources: number;
99
+ private numLiveSources: number;
100
+
101
+ constructor(sendMediaRequestsCallback: SendMediaRequestsCallback, options: Options) {
62
102
  this.sendMediaRequestsCallback = sendMediaRequestsCallback;
63
103
  this.counter = 0;
104
+ this.numLiveSources = 0;
105
+ this.numTotalSources = 0;
64
106
  this.clientRequests = {};
65
- this.slotsActiveInLastMediaRequest = {};
107
+ this.degradationPreferences = options.degradationPreferences;
108
+ this.kind = options.kind;
109
+ this.trimRequestsToNumOfSources = options.trimRequestsToNumOfSources;
110
+ this.sourceUpdateListener = this.commit.bind(this);
111
+ this.debouncedSourceUpdateListener = debounce(
112
+ this.sourceUpdateListener,
113
+ DEBOUNCED_SOURCE_UPDATE_TIME
114
+ );
66
115
  }
67
116
 
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
- );
117
+ public setDegradationPreferences(degradationPreferences: DegradationPreferences) {
118
+ this.degradationPreferences = degradationPreferences;
119
+ this.sendRequests(); // re-send requests after preferences are set
120
+ }
77
121
 
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}`
122
+ private getDegradedClientRequests(clientRequests: ClientRequestsMap) {
123
+ const maxFsLimits = [
124
+ getMaxFs('best'),
125
+ getMaxFs('large'),
126
+ getMaxFs('medium'),
127
+ getMaxFs('small'),
128
+ getMaxFs('very small'),
129
+ getMaxFs('thumbnail'),
130
+ ];
131
+
132
+ // reduce max-fs until total macroblocks is below limit
133
+ for (let i = 0; i < maxFsLimits.length; i += 1) {
134
+ let totalMacroblocksRequested = 0;
135
+ Object.values(clientRequests).forEach((mr) => {
136
+ if (mr.codecInfo) {
137
+ mr.codecInfo.maxFs = Math.min(
138
+ mr.preferredMaxFs || CODEC_DEFAULTS.h264.maxFs,
139
+ mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,
140
+ maxFsLimits[i]
141
+ );
142
+ // we only consider sources with "live" state
143
+ const slotsWithLiveSource = mr.receiveSlots.filter((rs) => rs.sourceState === 'live');
144
+ totalMacroblocksRequested += mr.codecInfo.maxFs * slotsWithLiveSource.length;
145
+ }
146
+ });
147
+ if (totalMacroblocksRequested <= this.degradationPreferences.maxMacroblocksLimit) {
148
+ if (i !== 0) {
149
+ LoggerProxy.logger.warn(
150
+ `multistream:mediaRequestManager --> too many streams with high max-fs, frame size will be limited to ${maxFsLimits[i]}`
151
+ );
152
+ }
153
+ break;
154
+ } else if (i === maxFsLimits.length - 1) {
155
+ LoggerProxy.logger.warn(
156
+ `multistream:mediaRequestManager --> even with frame size limited to ${maxFsLimits[i]} you are still requesting too many streams, consider reducing the number of requests`
85
157
  );
86
- slot.resetSourceState();
87
158
  }
88
159
  }
160
+ }
89
161
 
90
- this.slotsActiveInLastMediaRequest = activeSlots;
162
+ /**
163
+ * Returns true if two stream requests are the same, false otherwise.
164
+ *
165
+ * @param {StreamRequest} streamRequestA - Stream request A for comparison.
166
+ * @param {StreamRequest} streamRequestB - Stream request B for comparison.
167
+ * @returns {boolean} - Whether they are equal.
168
+ */
169
+ // eslint-disable-next-line class-methods-use-this
170
+ public isEqual(streamRequestA: StreamRequest, streamRequestB: StreamRequest) {
171
+ return (
172
+ JSON.stringify(streamRequestA._toJmpStreamRequest()) ===
173
+ JSON.stringify(streamRequestB._toJmpStreamRequest())
174
+ );
91
175
  }
92
176
 
93
- private sendRequests() {
94
- const wcmeMediaRequests: MC.MediaRequest[] = [];
177
+ /**
178
+ * Compares new stream requests to previous ones and determines
179
+ * if they are the same.
180
+ *
181
+ * @param {StreamRequest[]} newRequests - Array with new requests.
182
+ * @returns {boolean} - True if they are equal, false otherwise.
183
+ */
184
+ private checkIsNewRequestsEqualToPrev(newRequests: StreamRequest[]) {
185
+ return (
186
+ !isEmpty(this.previousStreamRequests) &&
187
+ this.previousStreamRequests.length === newRequests.length &&
188
+ this.previousStreamRequests.every((req, idx) => this.isEqual(req, newRequests[idx]))
189
+ );
190
+ }
191
+
192
+ /**
193
+ * Returns the maxPayloadBitsPerSecond per Stream
194
+ *
195
+ * If MediaRequestManager kind is "audio", a constant bitrate will be returned.
196
+ * If MediaRequestManager kind is "video", the bitrate will be calculated based
197
+ * on maxFs (default h264 maxFs as fallback if maxFs is not defined)
198
+ *
199
+ * @param {MediaRequest} mediaRequest - mediaRequest to take data from
200
+ * @returns {number} maxPayloadBitsPerSecond
201
+ */
202
+ private getMaxPayloadBitsPerSecond(mediaRequest: MediaRequest): number {
203
+ if (this.kind === 'audio') {
204
+ // return mono_music bitrate default if the kind of mediarequest manager is audio:
205
+ return RecommendedOpusBitrates.FB_MONO_MUSIC;
206
+ }
95
207
 
96
- // todo: check how many streams we're asking for and what resolution and introduce some limits (spark-377701)
97
- const maxPayloadBitsPerSecond = 10 * 1000 * 1000;
208
+ return getRecommendedMaxBitrateForFrameSize(
209
+ mediaRequest.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs
210
+ );
211
+ }
212
+
213
+ /**
214
+ * Returns the max Macro Blocks per second (maxMbps) per H264 Stream
215
+ *
216
+ * The maxMbps will be calculated based on maxFs and maxFps
217
+ * (default h264 maxFps as fallback if maxFps is not defined)
218
+ *
219
+ * @param {MediaRequest} mediaRequest - mediaRequest to take data from
220
+ * @returns {number} maxMbps
221
+ */
222
+ // eslint-disable-next-line class-methods-use-this
223
+ private getH264MaxMbps(mediaRequest: MediaRequest): number {
224
+ // fallback for maxFps (not needed for maxFs, since there is a fallback already in getDegradedClientRequests)
225
+ const maxFps = mediaRequest.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps;
226
+
227
+ // divided by 100 since maxFps is 3000 (for 30 frames per seconds)
228
+ return (mediaRequest.codecInfo.maxFs * maxFps) / 100;
229
+ }
230
+
231
+ /**
232
+ * Clears the previous stream requests.
233
+ *
234
+ * @returns {void}
235
+ */
236
+ public clearPreviousRequests(): void {
237
+ this.previousStreamRequests = [];
238
+ }
239
+
240
+ /** Modifies the passed in clientRequests and makes sure that in total they don't ask
241
+ * for more streams than there are available.
242
+ *
243
+ * @param {Object} clientRequests
244
+ * @returns {void}
245
+ */
246
+ private trimRequests(clientRequests: ClientRequestsMap) {
247
+ const preferLiveVideo = this.getPreferLiveVideo();
248
+
249
+ if (!this.trimRequestsToNumOfSources) {
250
+ return;
251
+ }
252
+
253
+ // preferLiveVideo being undefined means that there are no active-speaker requests so we don't need to do any trimming
254
+ if (preferLiveVideo === undefined) {
255
+ return;
256
+ }
257
+
258
+ let numStreamsAvailable = preferLiveVideo ? this.numLiveSources : this.numTotalSources;
259
+
260
+ Object.values(clientRequests)
261
+ .sort((a, b) => {
262
+ // we have to count how many streams we're asking for
263
+ // and should not ask for more than numStreamsAvailable in total,
264
+ // so we might need to trim active-speaker requests and first ones to trim should be
265
+ // the ones with lowest priority
266
+
267
+ // receiver-selected requests have priority over active-speakers
268
+ if (a.policyInfo.policy === 'receiver-selected') {
269
+ return -1;
270
+ }
271
+ if (b.policyInfo.policy === 'receiver-selected') {
272
+ return 1;
273
+ }
274
+
275
+ // and active-speakers are sorted by descending priority
276
+ return b.policyInfo.priority - a.policyInfo.priority;
277
+ })
278
+ .forEach((request) => {
279
+ // we only trim active-speaker requests
280
+ if (request.policyInfo.policy === 'active-speaker') {
281
+ const trimmedCount = Math.min(numStreamsAvailable, request.receiveSlots.length);
282
+
283
+ request.receiveSlots.length = trimmedCount;
284
+
285
+ numStreamsAvailable -= trimmedCount;
286
+ } else {
287
+ numStreamsAvailable -= request.receiveSlots.length;
288
+ }
289
+
290
+ if (numStreamsAvailable < 0) {
291
+ numStreamsAvailable = 0;
292
+ }
293
+ });
294
+ }
295
+
296
+ private getPreferLiveVideo(): boolean | undefined {
297
+ let preferLiveVideo;
98
298
 
99
- // map all the client media requests to wcme media requests
100
299
  Object.values(this.clientRequests).forEach((mr) => {
101
- wcmeMediaRequests.push(
102
- new MC.MediaRequest(
103
- mr.policyInfo.policy === 'active-speaker'
104
- ? MC.Policy.ActiveSpeaker
105
- : MC.Policy.ReceiverSelected,
106
- mr.policyInfo.policy === 'active-speaker'
107
- ? new MC.ActiveSpeakerInfo(
108
- mr.policyInfo.priority,
109
- mr.policyInfo.crossPriorityDuplication,
110
- mr.policyInfo.crossPolicyDuplication,
111
- mr.policyInfo.preferLiveVideo
112
- )
113
- : new MC.ReceiverSelectedInfo(mr.policyInfo.csi),
114
- mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),
115
- maxPayloadBitsPerSecond,
116
- mr.codecInfo && [
117
- new MC.CodecInfo(
118
- 0x80,
119
- new MC.H264Codec(
120
- mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,
121
- mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,
122
- mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps,
123
- mr.codecInfo.maxWidth,
124
- mr.codecInfo.maxHeight
125
- )
126
- ),
127
- ]
128
- )
129
- );
300
+ if (mr.policyInfo.policy === 'active-speaker') {
301
+ // take the value from first encountered active speaker request
302
+ if (preferLiveVideo === undefined) {
303
+ preferLiveVideo = mr.policyInfo.preferLiveVideo;
304
+ }
305
+
306
+ if (mr.policyInfo.preferLiveVideo !== preferLiveVideo) {
307
+ throw new Error(
308
+ 'a mix of active-speaker groups with different values for preferLiveVideo is not supported'
309
+ );
310
+ }
311
+ }
130
312
  });
131
313
 
132
- this.sendMediaRequestsCallback(wcmeMediaRequests);
314
+ return preferLiveVideo;
315
+ }
316
+
317
+ private cloneClientRequests(): ClientRequestsMap {
318
+ // we clone the client requests but without cloning the ReceiveSlots that they reference
319
+ return cloneDeepWith(this.clientRequests, (value, key) => {
320
+ if (key === 'receiveSlots') {
321
+ return [...value];
322
+ }
323
+
324
+ return undefined;
325
+ });
326
+ }
327
+
328
+ private sendRequests() {
329
+ const streamRequests: StreamRequest[] = [];
330
+
331
+ // clone the requests so that any modifications we do to them don't affect the original ones
332
+ const clientRequests = this.cloneClientRequests();
333
+
334
+ this.trimRequests(clientRequests);
335
+ this.getDegradedClientRequests(clientRequests);
336
+
337
+ // map all the client media requests to wcme stream requests
338
+ Object.values(clientRequests).forEach((mr) => {
339
+ if (mr.receiveSlots.length > 0) {
340
+ streamRequests.push(
341
+ new StreamRequest(
342
+ mr.policyInfo.policy === 'active-speaker'
343
+ ? Policy.ActiveSpeaker
344
+ : Policy.ReceiverSelected,
345
+ mr.policyInfo.policy === 'active-speaker'
346
+ ? new ActiveSpeakerInfo(
347
+ mr.policyInfo.priority,
348
+ mr.policyInfo.crossPriorityDuplication,
349
+ mr.policyInfo.crossPolicyDuplication,
350
+ mr.policyInfo.preferLiveVideo
351
+ )
352
+ : new ReceiverSelectedInfo(mr.policyInfo.csi),
353
+ mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),
354
+ this.getMaxPayloadBitsPerSecond(mr),
355
+ mr.codecInfo && [
356
+ new WcmeCodecInfo(
357
+ 0x80,
358
+ new H264Codec(
359
+ mr.codecInfo.maxFs,
360
+ mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,
361
+ this.getH264MaxMbps(mr),
362
+ mr.codecInfo.maxWidth,
363
+ mr.codecInfo.maxHeight
364
+ )
365
+ ),
366
+ ]
367
+ )
368
+ );
369
+ }
370
+ });
133
371
 
134
- this.resetInactiveReceiveSlots();
372
+ //! IMPORTANT: this is only a temporary fix. This will soon be done in the jmp layer (@webex/json-multistream)
373
+ // https://jira-eng-gpk2.cisco.com/jira/browse/WEBEX-326713
374
+ if (!this.checkIsNewRequestsEqualToPrev(streamRequests)) {
375
+ this.sendMediaRequestsCallback(streamRequests);
376
+ this.previousStreamRequests = streamRequests;
377
+ LoggerProxy.logger.info(`multistream:sendRequests --> media requests sent. `);
378
+ } else {
379
+ LoggerProxy.logger.info(
380
+ `multistream:sendRequests --> detected duplicate WCME requests, skipping them... `
381
+ );
382
+ }
135
383
  }
136
384
 
137
385
  public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {
@@ -140,6 +388,17 @@ export class MediaRequestManager {
140
388
 
141
389
  this.clientRequests[newId] = mediaRequest;
142
390
 
391
+ const eventHandler = ({maxFs}) => {
392
+ mediaRequest.preferredMaxFs = maxFs;
393
+ this.debouncedSourceUpdateListener();
394
+ };
395
+ mediaRequest.handleMaxFs = eventHandler;
396
+
397
+ mediaRequest.receiveSlots.forEach((rs) => {
398
+ rs.on(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);
399
+ rs.on(ReceiveSlotEvents.MaxFsUpdate, mediaRequest.handleMaxFs);
400
+ });
401
+
143
402
  if (commit) {
144
403
  this.commit();
145
404
  }
@@ -148,6 +407,13 @@ export class MediaRequestManager {
148
407
  }
149
408
 
150
409
  public cancelRequest(requestId: MediaRequestId, commit = true) {
410
+ const mediaRequest = this.clientRequests[requestId];
411
+
412
+ mediaRequest?.receiveSlots.forEach((rs) => {
413
+ rs.off(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);
414
+ rs.off(ReceiveSlotEvents.MaxFsUpdate, mediaRequest.handleMaxFs);
415
+ });
416
+
151
417
  delete this.clientRequests[requestId];
152
418
 
153
419
  if (commit) {
@@ -161,6 +427,14 @@ export class MediaRequestManager {
161
427
 
162
428
  public reset() {
163
429
  this.clientRequests = {};
164
- this.slotsActiveInLastMediaRequest = {};
430
+ this.numTotalSources = 0;
431
+ this.numLiveSources = 0;
432
+ }
433
+
434
+ public setNumCurrentSources(numTotalSources: number, numLiveSources: number) {
435
+ this.numTotalSources = numTotalSources;
436
+ this.numLiveSources = numLiveSources;
437
+
438
+ this.sendRequests();
165
439
  }
166
440
  }
@@ -1,14 +1,20 @@
1
1
  /* eslint-disable valid-jsdoc */
2
- import {MediaConnection as MC} from '@webex/internal-media-core';
2
+ import {
3
+ MediaType,
4
+ ReceiveSlot as WcmeReceiveSlot,
5
+ ReceiveSlotEvents as WcmeReceiveSlotEvents,
6
+ StreamState,
7
+ } from '@webex/internal-media-core';
3
8
 
4
9
  import LoggerProxy from '../common/logs/logger-proxy';
5
10
  import EventsScope from '../common/events/events-scope';
6
11
 
7
12
  export const ReceiveSlotEvents = {
8
13
  SourceUpdate: 'sourceUpdate',
14
+ MaxFsUpdate: 'maxFsUpdate',
9
15
  };
10
16
 
11
- export type SourceState = MC.SourceState;
17
+ export type {StreamState} from '@webex/internal-media-core';
12
18
  export type CSI = number;
13
19
  export type MemberId = string;
14
20
  export type ReceiveSlotId = string;
@@ -22,31 +28,31 @@ export type FindMemberIdCallback = (csi: CSI) => MemberId | undefined;
22
28
  * for example some participant's main video or audio
23
29
  */
24
30
  export class ReceiveSlot extends EventsScope {
25
- private readonly mcReceiveSlot: MC.ReceiveSlot;
31
+ private readonly mcReceiveSlot: WcmeReceiveSlot;
26
32
 
27
33
  private readonly findMemberIdCallback: FindMemberIdCallback;
28
34
 
29
35
  public readonly id: ReceiveSlotId;
30
36
 
31
- public readonly mediaType: MC.MediaType;
37
+ public readonly mediaType: MediaType;
32
38
 
33
39
  #memberId?: MemberId;
34
40
 
35
41
  #csi?: CSI;
36
42
 
37
- #sourceState: MC.SourceState;
43
+ #sourceState: StreamState;
38
44
 
39
45
  /**
40
46
  * constructor - don't use it directly, you should always use meeting.receiveSlotManager.allocateSlot()
41
47
  * to create any receive slots
42
48
  *
43
- * @param {MC.MediaType} mediaType
44
- * @param {MC.ReceiveSlot} mcReceiveSlot
49
+ * @param {MediaType} mediaType
50
+ * @param {ReceiveSlot} mcReceiveSlot
45
51
  * @param {FindMemberIdCallback} findMemberIdCallback callback for finding memberId for given CSI
46
52
  */
47
53
  constructor(
48
- mediaType: MC.MediaType,
49
- mcReceiveSlot: MC.ReceiveSlot,
54
+ mediaType: MediaType,
55
+ mcReceiveSlot: WcmeReceiveSlot,
50
56
  findMemberIdCallback: FindMemberIdCallback
51
57
  ) {
52
58
  super();
@@ -76,6 +82,25 @@ export class ReceiveSlot extends EventsScope {
76
82
  return this.#csi;
77
83
  }
78
84
 
85
+ /**
86
+ * Set the max frame size for this slot
87
+ * @param newFs frame size
88
+ */
89
+ public setMaxFs(newFs) {
90
+ // emit event for media request manager to listen to
91
+
92
+ this.emit(
93
+ {
94
+ file: 'meeting/receiveSlot',
95
+ function: 'findMemberId',
96
+ },
97
+ ReceiveSlotEvents.MaxFsUpdate,
98
+ {
99
+ maxFs: newFs,
100
+ }
101
+ );
102
+ }
103
+
79
104
  /**
80
105
  * Getter for sourceState
81
106
  */
@@ -86,15 +111,15 @@ export class ReceiveSlot extends EventsScope {
86
111
  /**
87
112
  * registers event handlers with the underlying ReceiveSlot
88
113
  */
89
- setupEventListeners() {
114
+ private setupEventListeners() {
90
115
  const scope = {
91
116
  file: 'meeting/receiveSlot',
92
117
  function: 'setupEventListeners',
93
118
  };
94
119
 
95
120
  this.mcReceiveSlot.on(
96
- MC.ReceiveSlotEvents.SourceUpdate,
97
- (state: MC.SourceState, csi?: number) => {
121
+ WcmeReceiveSlotEvents.SourceUpdate,
122
+ (state: StreamState, csi?: number) => {
98
123
  LoggerProxy.logger.log(
99
124
  `ReceiveSlot#setupEventListeners --> got source update on receive slot ${this.id}, mediaType=${this.mediaType}, csi=${csi}, state=${state}`
100
125
  );
@@ -111,6 +136,36 @@ export class ReceiveSlot extends EventsScope {
111
136
  );
112
137
  }
113
138
 
139
+ /** Tries to find the member id for this receive slot if it hasn't got one */
140
+ public findMemberId() {
141
+ if (this.#memberId === undefined && this.#csi) {
142
+ this.#memberId = this.findMemberIdCallback(this.#csi);
143
+
144
+ if (this.#memberId) {
145
+ // if we found the memberId, simulate source update so that the client app knows that something's changed
146
+ this.emit(
147
+ {
148
+ file: 'meeting/receiveSlot',
149
+ function: 'findMemberId',
150
+ },
151
+ ReceiveSlotEvents.SourceUpdate,
152
+ {
153
+ state: this.#sourceState,
154
+ csi: this.#csi,
155
+ memberId: this.#memberId,
156
+ }
157
+ );
158
+ }
159
+ }
160
+ }
161
+
162
+ /**
163
+ * @returns {string} a log message used to identify the receive slot
164
+ */
165
+ public get logString() {
166
+ return `ReceiveSlot - ${this.id}: ${JSON.stringify(this.mcReceiveSlot.id)}`;
167
+ }
168
+
114
169
  /**
115
170
  * The MediaStream object associated with this slot.
116
171
  *
@@ -123,20 +178,7 @@ export class ReceiveSlot extends EventsScope {
123
178
  /**
124
179
  * The underlying WCME receive slot
125
180
  */
126
- get wcmeReceiveSlot(): MC.ReceiveSlot {
181
+ get wcmeReceiveSlot(): WcmeReceiveSlot {
127
182
  return this.mcReceiveSlot;
128
183
  }
129
-
130
- /**
131
- * Resets the source state to the default 'no source' value.
132
- * This function should be called on receive slots that are
133
- * no longer part of a media request. It's needed because WCME
134
- * does not send any more events on such slots, so the sourceState
135
- * value would not represent the truth anymore.
136
- */
137
- public resetSourceState() {
138
- this.#sourceState = 'no source';
139
- this.#csi = undefined;
140
- this.#memberId = undefined;
141
- }
142
184
  }