@webex/plugin-meetings 3.0.0-beta.15 → 3.0.0-beta.151

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 (480) hide show
  1. package/README.md +45 -1
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +359 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +193 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +23 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +52 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +43 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1046 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +78 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +67 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/browser-detection.js +1 -21
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +5 -20
  25. package/dist/common/collection.js.map +1 -1
  26. package/dist/common/config.js +0 -7
  27. package/dist/common/config.js.map +1 -1
  28. package/dist/common/errors/captcha-error.js +0 -21
  29. package/dist/common/errors/captcha-error.js.map +1 -1
  30. package/dist/common/errors/intent-to-join.js +0 -21
  31. package/dist/common/errors/intent-to-join.js.map +1 -1
  32. package/dist/common/errors/join-meeting.js +0 -21
  33. package/dist/common/errors/join-meeting.js.map +1 -1
  34. package/dist/common/errors/media.js +0 -21
  35. package/dist/common/errors/media.js.map +1 -1
  36. package/dist/common/errors/parameter.js +0 -28
  37. package/dist/common/errors/parameter.js.map +1 -1
  38. package/dist/common/errors/password-error.js +0 -21
  39. package/dist/common/errors/password-error.js.map +1 -1
  40. package/dist/common/errors/permission.js +0 -21
  41. package/dist/common/errors/permission.js.map +1 -1
  42. package/dist/common/errors/reconnection-in-progress.js +0 -17
  43. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  44. package/dist/common/errors/reconnection.js +0 -21
  45. package/dist/common/errors/reconnection.js.map +1 -1
  46. package/dist/common/errors/stats.js +0 -21
  47. package/dist/common/errors/stats.js.map +1 -1
  48. package/dist/common/errors/webex-errors.js +9 -43
  49. package/dist/common/errors/webex-errors.js.map +1 -1
  50. package/dist/common/errors/webex-meetings-error.js +1 -24
  51. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  52. package/dist/common/events/events-scope.js +0 -22
  53. package/dist/common/events/events-scope.js.map +1 -1
  54. package/dist/common/events/events.js +0 -23
  55. package/dist/common/events/events.js.map +1 -1
  56. package/dist/common/events/trigger-proxy.js +0 -12
  57. package/dist/common/events/trigger-proxy.js.map +1 -1
  58. package/dist/common/events/util.js +0 -15
  59. package/dist/common/events/util.js.map +1 -1
  60. package/dist/common/logs/logger-config.js +0 -4
  61. package/dist/common/logs/logger-config.js.map +1 -1
  62. package/dist/common/logs/logger-proxy.js +1 -8
  63. package/dist/common/logs/logger-proxy.js.map +1 -1
  64. package/dist/common/logs/request.js +35 -61
  65. package/dist/common/logs/request.js.map +1 -1
  66. package/dist/common/queue.js +4 -14
  67. package/dist/common/queue.js.map +1 -1
  68. package/dist/config.js +7 -13
  69. package/dist/config.js.map +1 -1
  70. package/dist/constants.js +208 -64
  71. package/dist/constants.js.map +1 -1
  72. package/dist/controls-options-manager/constants.js +14 -0
  73. package/dist/controls-options-manager/constants.js.map +1 -0
  74. package/dist/controls-options-manager/enums.js +27 -0
  75. package/dist/controls-options-manager/enums.js.map +1 -0
  76. package/dist/controls-options-manager/index.js +297 -0
  77. package/dist/controls-options-manager/index.js.map +1 -0
  78. package/dist/controls-options-manager/types.js +7 -0
  79. package/dist/controls-options-manager/types.js.map +1 -0
  80. package/dist/controls-options-manager/util.js +300 -0
  81. package/dist/controls-options-manager/util.js.map +1 -0
  82. package/dist/index.js +78 -17
  83. package/dist/index.js.map +1 -1
  84. package/dist/locus-info/controlsUtils.js +100 -29
  85. package/dist/locus-info/controlsUtils.js.map +1 -1
  86. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  87. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  88. package/dist/locus-info/fullState.js +0 -15
  89. package/dist/locus-info/fullState.js.map +1 -1
  90. package/dist/locus-info/hostUtils.js +4 -12
  91. package/dist/locus-info/hostUtils.js.map +1 -1
  92. package/dist/locus-info/index.js +387 -208
  93. package/dist/locus-info/index.js.map +1 -1
  94. package/dist/locus-info/infoUtils.js +0 -38
  95. package/dist/locus-info/infoUtils.js.map +1 -1
  96. package/dist/locus-info/mediaSharesUtils.js +54 -38
  97. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  98. package/dist/locus-info/parser.js +90 -126
  99. package/dist/locus-info/parser.js.map +1 -1
  100. package/dist/locus-info/selfUtils.js +93 -92
  101. package/dist/locus-info/selfUtils.js.map +1 -1
  102. package/dist/media/index.js +70 -219
  103. package/dist/media/index.js.map +1 -1
  104. package/dist/media/properties.js +74 -198
  105. package/dist/media/properties.js.map +1 -1
  106. package/dist/media/util.js +1 -8
  107. package/dist/media/util.js.map +1 -1
  108. package/dist/mediaQualityMetrics/config.js +505 -495
  109. package/dist/mediaQualityMetrics/config.js.map +1 -1
  110. package/dist/meeting/in-meeting-actions.js +79 -14
  111. package/dist/meeting/in-meeting-actions.js.map +1 -1
  112. package/dist/meeting/index.js +2685 -3324
  113. package/dist/meeting/index.js.map +1 -1
  114. package/dist/meeting/locusMediaRequest.js +291 -0
  115. package/dist/meeting/locusMediaRequest.js.map +1 -0
  116. package/dist/meeting/muteState.js +243 -185
  117. package/dist/meeting/muteState.js.map +1 -1
  118. package/dist/meeting/request.js +296 -342
  119. package/dist/meeting/request.js.map +1 -1
  120. package/dist/meeting/request.type.js +0 -1
  121. package/dist/meeting/request.type.js.map +1 -1
  122. package/dist/meeting/state.js +16 -26
  123. package/dist/meeting/state.js.map +1 -1
  124. package/dist/meeting/util.js +446 -585
  125. package/dist/meeting/util.js.map +1 -1
  126. package/dist/meeting-info/collection.js +3 -25
  127. package/dist/meeting-info/collection.js.map +1 -1
  128. package/dist/meeting-info/index.js +8 -31
  129. package/dist/meeting-info/index.js.map +1 -1
  130. package/dist/meeting-info/meeting-info-v2.js +261 -242
  131. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  132. package/dist/meeting-info/request.js +1 -16
  133. package/dist/meeting-info/request.js.map +1 -1
  134. package/dist/meeting-info/util.js +98 -183
  135. package/dist/meeting-info/util.js.map +1 -1
  136. package/dist/meeting-info/utilv2.js +156 -232
  137. package/dist/meeting-info/utilv2.js.map +1 -1
  138. package/dist/meetings/collection.js +24 -20
  139. package/dist/meetings/collection.js.map +1 -1
  140. package/dist/meetings/index.js +526 -372
  141. package/dist/meetings/index.js.map +1 -1
  142. package/dist/meetings/meetings.types.js +7 -0
  143. package/dist/meetings/meetings.types.js.map +1 -0
  144. package/dist/meetings/request.js +21 -40
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +172 -141
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.js +58 -57
  149. package/dist/member/index.js.map +1 -1
  150. package/dist/member/types.js +15 -0
  151. package/dist/member/types.js.map +1 -0
  152. package/dist/member/util.js +101 -69
  153. package/dist/member/util.js.map +1 -1
  154. package/dist/members/collection.js +12 -12
  155. package/dist/members/collection.js.map +1 -1
  156. package/dist/members/index.js +123 -162
  157. package/dist/members/index.js.map +1 -1
  158. package/dist/members/request.js +120 -85
  159. package/dist/members/request.js.map +1 -1
  160. package/dist/members/types.js +15 -0
  161. package/dist/members/types.js.map +1 -0
  162. package/dist/members/util.js +314 -260
  163. package/dist/members/util.js.map +1 -1
  164. package/dist/metrics/config.js +50 -16
  165. package/dist/metrics/config.js.map +1 -1
  166. package/dist/metrics/constants.js +4 -7
  167. package/dist/metrics/constants.js.map +1 -1
  168. package/dist/metrics/index.js +75 -147
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/multistream/mediaRequestManager.js +170 -50
  171. package/dist/multistream/mediaRequestManager.js.map +1 -1
  172. package/dist/multistream/receiveSlot.js +58 -65
  173. package/dist/multistream/receiveSlot.js.map +1 -1
  174. package/dist/multistream/receiveSlotManager.js +73 -94
  175. package/dist/multistream/receiveSlotManager.js.map +1 -1
  176. package/dist/multistream/remoteMedia.js +55 -74
  177. package/dist/multistream/remoteMedia.js.map +1 -1
  178. package/dist/multistream/remoteMediaGroup.js +66 -43
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +502 -442
  181. package/dist/multistream/remoteMediaManager.js.map +1 -1
  182. package/dist/networkQualityMonitor/index.js +24 -51
  183. package/dist/networkQualityMonitor/index.js.map +1 -1
  184. package/dist/personal-meeting-room/index.js +3 -38
  185. package/dist/personal-meeting-room/index.js.map +1 -1
  186. package/dist/personal-meeting-room/request.js +2 -33
  187. package/dist/personal-meeting-room/request.js.map +1 -1
  188. package/dist/personal-meeting-room/util.js +0 -13
  189. package/dist/personal-meeting-room/util.js.map +1 -1
  190. package/dist/reachability/index.js +190 -199
  191. package/dist/reachability/index.js.map +1 -1
  192. package/dist/reachability/request.js +14 -23
  193. package/dist/reachability/request.js.map +1 -1
  194. package/dist/reactions/constants.js +13 -0
  195. package/dist/reactions/constants.js.map +1 -0
  196. package/dist/reactions/reactions.js +2 -4
  197. package/dist/reactions/reactions.js.map +1 -1
  198. package/dist/reactions/reactions.type.js +18 -24
  199. package/dist/reactions/reactions.type.js.map +1 -1
  200. package/dist/reconnection-manager/index.js +356 -476
  201. package/dist/reconnection-manager/index.js.map +1 -1
  202. package/dist/recording-controller/enums.js +17 -0
  203. package/dist/recording-controller/enums.js.map +1 -0
  204. package/dist/recording-controller/index.js +343 -0
  205. package/dist/recording-controller/index.js.map +1 -0
  206. package/dist/recording-controller/util.js +63 -0
  207. package/dist/recording-controller/util.js.map +1 -0
  208. package/dist/roap/index.js +32 -75
  209. package/dist/roap/index.js.map +1 -1
  210. package/dist/roap/request.js +129 -136
  211. package/dist/roap/request.js.map +1 -1
  212. package/dist/roap/turnDiscovery.js +143 -103
  213. package/dist/roap/turnDiscovery.js.map +1 -1
  214. package/dist/statsAnalyzer/global.js +1 -95
  215. package/dist/statsAnalyzer/global.js.map +1 -1
  216. package/dist/statsAnalyzer/index.js +369 -462
  217. package/dist/statsAnalyzer/index.js.map +1 -1
  218. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  219. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  220. package/dist/transcription/index.js +9 -44
  221. package/dist/transcription/index.js.map +1 -1
  222. package/dist/types/annotation/annotation.types.d.ts +43 -0
  223. package/dist/types/annotation/constants.d.ts +31 -0
  224. package/dist/types/annotation/index.d.ts +124 -0
  225. package/dist/types/breakouts/breakout.d.ts +8 -0
  226. package/dist/types/breakouts/collection.d.ts +5 -0
  227. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  228. package/dist/types/breakouts/events.d.ts +2 -0
  229. package/dist/types/breakouts/index.d.ts +5 -0
  230. package/dist/types/breakouts/request.d.ts +22 -0
  231. package/dist/types/breakouts/utils.d.ts +15 -0
  232. package/dist/types/common/browser-detection.d.ts +9 -0
  233. package/dist/types/common/collection.d.ts +48 -0
  234. package/dist/types/common/config.d.ts +2 -0
  235. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  236. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  237. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  238. package/dist/types/common/errors/media.d.ts +15 -0
  239. package/dist/types/common/errors/parameter.d.ts +15 -0
  240. package/dist/types/common/errors/password-error.d.ts +15 -0
  241. package/dist/types/common/errors/permission.d.ts +14 -0
  242. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  243. package/dist/types/common/errors/reconnection.d.ts +15 -0
  244. package/dist/types/common/errors/stats.d.ts +15 -0
  245. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  246. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  247. package/dist/types/common/events/events-scope.d.ts +17 -0
  248. package/dist/types/common/events/events.d.ts +12 -0
  249. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  250. package/dist/types/common/events/util.d.ts +2 -0
  251. package/dist/types/common/logs/logger-config.d.ts +2 -0
  252. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  253. package/dist/types/common/logs/request.d.ts +34 -0
  254. package/dist/types/common/queue.d.ts +32 -0
  255. package/dist/types/config.d.ts +72 -0
  256. package/dist/types/constants.d.ts +978 -0
  257. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  258. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  259. package/dist/types/controls-options-manager/index.d.ts +136 -0
  260. package/dist/types/controls-options-manager/types.d.ts +43 -0
  261. package/dist/types/controls-options-manager/util.d.ts +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  264. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  265. package/dist/types/locus-info/fullState.d.ts +2 -0
  266. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  267. package/dist/types/locus-info/index.d.ts +315 -0
  268. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  269. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  270. package/dist/types/locus-info/parser.d.ts +212 -0
  271. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  272. package/dist/types/media/index.d.ts +34 -0
  273. package/dist/types/media/properties.d.ts +86 -0
  274. package/dist/types/media/util.d.ts +2 -0
  275. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  276. package/dist/types/meeting/in-meeting-actions.d.ts +149 -0
  277. package/dist/types/meeting/index.d.ts +1509 -0
  278. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  279. package/dist/types/meeting/muteState.d.ts +184 -0
  280. package/dist/types/meeting/request.d.ts +270 -0
  281. package/dist/types/meeting/request.type.d.ts +11 -0
  282. package/dist/types/meeting/state.d.ts +9 -0
  283. package/dist/types/meeting/util.d.ts +75 -0
  284. package/dist/types/meeting-info/collection.d.ts +20 -0
  285. package/dist/types/meeting-info/index.d.ts +57 -0
  286. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  287. package/dist/types/meeting-info/request.d.ts +22 -0
  288. package/dist/types/meeting-info/util.d.ts +2 -0
  289. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  290. package/dist/types/meetings/collection.d.ts +31 -0
  291. package/dist/types/meetings/index.d.ts +364 -0
  292. package/dist/types/meetings/meetings.types.d.ts +4 -0
  293. package/dist/types/meetings/request.d.ts +27 -0
  294. package/dist/types/meetings/util.d.ts +18 -0
  295. package/dist/types/member/index.d.ts +157 -0
  296. package/dist/types/member/types.d.ts +21 -0
  297. package/dist/types/member/util.d.ts +2 -0
  298. package/dist/types/members/collection.d.ts +29 -0
  299. package/dist/types/members/index.d.ts +353 -0
  300. package/dist/types/members/request.d.ts +114 -0
  301. package/dist/types/members/types.d.ts +24 -0
  302. package/dist/types/members/util.d.ts +210 -0
  303. package/dist/types/metrics/config.d.ts +195 -0
  304. package/dist/types/metrics/constants.d.ts +55 -0
  305. package/dist/types/metrics/index.d.ts +169 -0
  306. package/dist/types/multistream/mediaRequestManager.d.ts +104 -0
  307. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  308. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  309. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  310. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  311. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  312. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  313. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  314. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  315. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  316. package/dist/types/reachability/index.d.ts +152 -0
  317. package/dist/types/reachability/request.d.ts +37 -0
  318. package/dist/types/reactions/constants.d.ts +3 -0
  319. package/dist/types/reactions/reactions.d.ts +4 -0
  320. package/dist/types/reactions/reactions.type.d.ts +52 -0
  321. package/dist/types/reconnection-manager/index.d.ts +126 -0
  322. package/dist/types/recording-controller/enums.d.ts +7 -0
  323. package/dist/types/recording-controller/index.d.ts +193 -0
  324. package/dist/types/recording-controller/util.d.ts +13 -0
  325. package/dist/types/roap/index.d.ts +77 -0
  326. package/dist/types/roap/request.d.ts +36 -0
  327. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  328. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  329. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  330. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  331. package/dist/types/transcription/index.d.ts +64 -0
  332. package/package.json +28 -21
  333. package/src/annotation/annotation.types.ts +52 -0
  334. package/src/annotation/constants.ts +36 -0
  335. package/src/annotation/index.ts +343 -0
  336. package/src/breakouts/README.md +220 -0
  337. package/src/breakouts/breakout.ts +163 -0
  338. package/src/breakouts/collection.ts +19 -0
  339. package/src/breakouts/edit-lock-error.ts +25 -0
  340. package/src/breakouts/events.ts +37 -0
  341. package/src/breakouts/index.ts +921 -0
  342. package/src/breakouts/request.ts +55 -0
  343. package/src/breakouts/utils.ts +57 -0
  344. package/src/common/errors/webex-errors.ts +6 -2
  345. package/src/common/logs/logger-proxy.ts +1 -1
  346. package/src/config.ts +5 -7
  347. package/src/constants.ts +155 -20
  348. package/src/controls-options-manager/constants.ts +5 -0
  349. package/src/controls-options-manager/enums.ts +18 -0
  350. package/src/controls-options-manager/index.ts +278 -0
  351. package/src/controls-options-manager/types.ts +59 -0
  352. package/src/controls-options-manager/util.ts +286 -0
  353. package/src/index.ts +34 -0
  354. package/src/locus-info/controlsUtils.ts +108 -0
  355. package/src/locus-info/index.ts +310 -21
  356. package/src/locus-info/mediaSharesUtils.ts +48 -0
  357. package/src/locus-info/parser.ts +2 -1
  358. package/src/locus-info/selfUtils.ts +71 -1
  359. package/src/media/index.ts +70 -142
  360. package/src/media/properties.ts +41 -104
  361. package/src/mediaQualityMetrics/config.ts +379 -377
  362. package/src/meeting/in-meeting-actions.ts +156 -0
  363. package/src/meeting/index.ts +1730 -1768
  364. package/src/meeting/locusMediaRequest.ts +309 -0
  365. package/src/meeting/muteState.ts +228 -132
  366. package/src/meeting/request.ts +100 -91
  367. package/src/meeting/request.type.ts +2 -0
  368. package/src/meeting/util.ts +421 -421
  369. package/src/meeting-info/meeting-info-v2.ts +134 -13
  370. package/src/meeting-info/utilv2.ts +13 -3
  371. package/src/meetings/collection.ts +20 -0
  372. package/src/meetings/index.ts +375 -83
  373. package/src/meetings/meetings.types.ts +9 -0
  374. package/src/meetings/request.ts +3 -1
  375. package/src/meetings/util.ts +103 -4
  376. package/src/member/index.ts +40 -0
  377. package/src/member/types.ts +24 -0
  378. package/src/member/util.ts +81 -1
  379. package/src/members/collection.ts +8 -0
  380. package/src/members/index.ts +108 -6
  381. package/src/members/request.ts +98 -17
  382. package/src/members/types.ts +28 -0
  383. package/src/members/util.ts +319 -240
  384. package/src/metrics/config.ts +49 -10
  385. package/src/metrics/constants.ts +2 -4
  386. package/src/metrics/index.ts +43 -27
  387. package/src/multistream/mediaRequestManager.ts +210 -45
  388. package/src/multistream/receiveSlot.ts +68 -26
  389. package/src/multistream/receiveSlotManager.ts +61 -38
  390. package/src/multistream/remoteMedia.ts +29 -3
  391. package/src/multistream/remoteMediaGroup.ts +61 -2
  392. package/src/multistream/remoteMediaManager.ts +260 -66
  393. package/src/networkQualityMonitor/index.ts +6 -6
  394. package/src/reachability/index.ts +75 -25
  395. package/src/reachability/request.ts +10 -5
  396. package/src/reactions/constants.ts +4 -0
  397. package/src/reactions/reactions.ts +4 -4
  398. package/src/reactions/reactions.type.ts +28 -3
  399. package/src/reconnection-manager/index.ts +53 -32
  400. package/src/recording-controller/enums.ts +8 -0
  401. package/src/recording-controller/index.ts +315 -0
  402. package/src/recording-controller/util.ts +58 -0
  403. package/src/roap/index.ts +21 -30
  404. package/src/roap/request.ts +51 -52
  405. package/src/roap/turnDiscovery.ts +51 -27
  406. package/src/statsAnalyzer/global.ts +1 -94
  407. package/src/statsAnalyzer/index.ts +380 -390
  408. package/src/statsAnalyzer/mqaUtil.ts +106 -99
  409. package/test/integration/spec/converged-space-meetings.js +233 -0
  410. package/test/integration/spec/journey.js +332 -255
  411. package/test/integration/spec/space-meeting.js +78 -5
  412. package/test/integration/spec/transcription.js +1 -1
  413. package/test/unit/spec/annotation/index.ts +436 -0
  414. package/test/unit/spec/breakouts/breakout.ts +203 -0
  415. package/test/unit/spec/breakouts/collection.ts +15 -0
  416. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  417. package/test/unit/spec/breakouts/events.ts +77 -0
  418. package/test/unit/spec/breakouts/index.ts +1790 -0
  419. package/test/unit/spec/breakouts/request.ts +104 -0
  420. package/test/unit/spec/breakouts/utils.js +72 -0
  421. package/test/unit/spec/controls-options-manager/index.js +287 -0
  422. package/test/unit/spec/controls-options-manager/util.js +518 -0
  423. package/test/unit/spec/fixture/locus.js +1 -0
  424. package/test/unit/spec/locus-info/controlsUtils.js +303 -30
  425. package/test/unit/spec/locus-info/index.js +615 -4
  426. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  427. package/test/unit/spec/locus-info/selfConstant.js +38 -0
  428. package/test/unit/spec/locus-info/selfUtils.js +200 -0
  429. package/test/unit/spec/media/index.ts +118 -22
  430. package/test/unit/spec/media/properties.ts +9 -9
  431. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -0
  432. package/test/unit/spec/meeting/index.js +2394 -1381
  433. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  434. package/test/unit/spec/meeting/muteState.js +370 -208
  435. package/test/unit/spec/meeting/request.js +354 -42
  436. package/test/unit/spec/meeting/utils.js +268 -156
  437. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  438. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  439. package/test/unit/spec/meetings/collection.js +14 -0
  440. package/test/unit/spec/meetings/index.js +842 -128
  441. package/test/unit/spec/meetings/utils.js +206 -2
  442. package/test/unit/spec/member/index.js +24 -0
  443. package/test/unit/spec/member/util.js +384 -32
  444. package/test/unit/spec/members/index.js +320 -1
  445. package/test/unit/spec/members/request.js +206 -27
  446. package/test/unit/spec/members/utils.js +184 -0
  447. package/test/unit/spec/metrics/index.js +98 -0
  448. package/test/unit/spec/multistream/mediaRequestManager.ts +676 -105
  449. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  450. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  451. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  452. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  453. package/test/unit/spec/multistream/remoteMediaManager.ts +672 -65
  454. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  455. package/test/unit/spec/reachability/index.ts +176 -25
  456. package/test/unit/spec/reachability/request.js +66 -0
  457. package/test/unit/spec/reconnection-manager/index.js +46 -13
  458. package/test/unit/spec/recording-controller/index.js +231 -0
  459. package/test/unit/spec/recording-controller/util.js +102 -0
  460. package/test/unit/spec/roap/index.ts +21 -51
  461. package/test/unit/spec/roap/request.ts +187 -0
  462. package/test/unit/spec/roap/turnDiscovery.ts +73 -34
  463. package/test/unit/spec/stats-analyzer/index.js +94 -43
  464. package/test/utils/constants.js +9 -0
  465. package/test/utils/integrationTestUtils.js +46 -0
  466. package/test/utils/testUtils.js +0 -45
  467. package/test/utils/webex-config.js +4 -0
  468. package/test/utils/webex-test-users.js +7 -3
  469. package/tsconfig.json +6 -0
  470. package/dist/media/internal-media-core-wrapper.js +0 -22
  471. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  472. package/dist/meeting/effectsState.js +0 -334
  473. package/dist/meeting/effectsState.js.map +0 -1
  474. package/dist/multistream/multistreamMedia.js +0 -117
  475. package/dist/multistream/multistreamMedia.js.map +0 -1
  476. package/src/index.js +0 -15
  477. package/src/media/internal-media-core-wrapper.ts +0 -9
  478. package/src/meeting/effectsState.ts +0 -211
  479. package/src/multistream/multistreamMedia.ts +0 -93
  480. package/test/unit/spec/meeting/effectsState.js +0 -281
@@ -8,6 +8,7 @@ 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';
@@ -16,22 +17,12 @@ import {
16
17
  error,
17
18
  eventType,
18
19
  errorCodes as ERROR_CODE,
19
- OS_NAME,
20
20
  UNKNOWN,
21
21
  CLIENT_NAME,
22
22
  mediaType,
23
+ WebexAPIServiceErrorCodes,
23
24
  } from './config';
24
25
 
25
- const OSMap = {
26
- // @ts-ignore
27
- 'Chrome OS': OS_NAME.chrome,
28
- macOS: OS_NAME.MAC,
29
- Windows: OS_NAME.WINDOWS,
30
- iOS: OS_NAME.IOS,
31
- Android: OS_NAME.ANDROID,
32
- Linux: OS_NAME.LINUX,
33
- };
34
-
35
26
  const {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();
36
27
 
37
28
  // Apply a CIDR /28 format to the IPV4 and /96 to the IPV6 addresses
@@ -41,10 +32,10 @@ const anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);
41
32
  const triggerTimers = ({event, meeting, data}) => {
42
33
  switch (event) {
43
34
  case eventType.CALL_INITIATED:
44
- meeting.setStartCallInitiateJoinReq();
35
+ meeting.setStartCallInitJoinReq();
45
36
  break;
46
37
  case eventType.LOCUS_JOIN_REQUEST:
47
- meeting.setEndCallInitiateJoinReq();
38
+ meeting.setEndCallInitJoinReq();
48
39
  meeting.setStartJoinReqResp();
49
40
  break;
50
41
  case eventType.LOCUS_JOIN_RESPONSE:
@@ -199,13 +190,16 @@ class Metrics {
199
190
  name: 'endpoint',
200
191
  networkType: 'unknown',
201
192
  userAgent: this.userAgentToString(),
193
+ userType: options.userType,
194
+ loginType: options.loginType,
195
+ channel: options.channel,
202
196
  clientInfo: {
203
197
  clientType: options.clientType,
204
198
  clientVersion: `${CLIENT_NAME}/${this.webex.version}`,
205
199
  localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),
206
200
  osVersion: getOSVersion() || 'unknown',
207
201
  subClientType: options.subClientType,
208
- os: this.getOsName(),
202
+ os: getOSNameInternal(),
209
203
  browser: getBrowserName(),
210
204
  browserVersion: getBrowserVersion(),
211
205
  },
@@ -251,22 +245,16 @@ class Metrics {
251
245
  if (options.isRoapCallEnabled) {
252
246
  payload.event.isRoapCallEnabled = options.isRoapCallEnabled;
253
247
  }
248
+ ['breakoutMoveId', 'breakoutSessionId', 'breakoutGroupId'].forEach((item) => {
249
+ if (options[item]) {
250
+ payload.event.identifiers[item] = options[item];
251
+ }
252
+ });
254
253
  }
255
254
 
256
255
  return payload;
257
256
  }
258
257
 
259
- /**
260
- * returns metrics friendly OS versions
261
- * @param {String} osName Os name
262
- * @returns {String}
263
- * @private
264
- * @memberof Metrics
265
- */
266
- private getOsName() {
267
- return OSMap[getOSName()] ?? OS_NAME.OTHERS;
268
- }
269
-
270
258
  /**
271
259
  * get the payload specific for a media quality event through call analyzer
272
260
  * @param {String} eventType the event name
@@ -311,7 +299,7 @@ class Metrics {
311
299
  clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted
312
300
  clientVersion: `${CLIENT_NAME}/${this.webex.version}`,
313
301
  localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),
314
- os: this.getOsName(),
302
+ os: getOSNameInternal(),
315
303
  osVersion: getOSVersion() || UNKNOWN,
316
304
  subClientType: options.subClientType,
317
305
  browser: getBrowserName(),
@@ -465,6 +453,33 @@ class Metrics {
465
453
  return this.generateErrorPayload(errorCode, showToUser, error.name.LOCUS_RESPONSE, err);
466
454
  }
467
455
 
456
+ /**
457
+ * Pareses webex api error.
458
+ *
459
+ * @param {object} err
460
+ * @param {boolean} showToUser
461
+ * @returns {object | null}
462
+ */
463
+ parseWebexApiError(err: any, showToUser: boolean) {
464
+ const serviceErrorCode = err?.body?.code;
465
+ const clientCodeError = WebexAPIServiceErrorCodes[serviceErrorCode];
466
+
467
+ if (clientCodeError) {
468
+ return this.generateErrorPayload(clientCodeError, showToUser, error.name.OTHER, err);
469
+ }
470
+
471
+ return this.generateErrorPayload(4100, showToUser, error.name.OTHER, err);
472
+ }
473
+
474
+ /**
475
+ * Generates Error for the CA event
476
+ *
477
+ * @param {integer} errorCode
478
+ * @param {boolean} shownToUser
479
+ * @param {string} name
480
+ * @param {any} err
481
+ * @returns {any}
482
+ */
468
483
  generateErrorPayload(errorCode, shownToUser, name, err) {
469
484
  if (error.errors[errorCode]) {
470
485
  const errorPayload: any = {
@@ -474,10 +489,11 @@ class Metrics {
474
489
  errorCode,
475
490
  fatal: !includes(error.notFatalErrorList, errorCode),
476
491
  name: name || error.name.OTHER,
492
+ serviceErrorCode: err?.body?.code,
477
493
  };
478
494
 
479
495
  if (err && err.body) {
480
- errorPayload.errorData = err.body;
496
+ errorPayload.errorData = {error: err.body};
481
497
  }
482
498
 
483
499
  if (err && err.statusCode) {
@@ -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 {cloneDeep, 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,79 +60,206 @@ const CODEC_DEFAULTS = {
47
60
  },
48
61
  };
49
62
 
50
- type SendMediaRequestsCallback = (mediaRequests: MC.MediaRequest[]) => void;
63
+ const DEBOUNCED_SOURCE_UPDATE_TIME = 1000;
51
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
+ };
52
76
  export class MediaRequestManager {
53
77
  private sendMediaRequestsCallback: SendMediaRequestsCallback;
54
78
 
55
- private counter;
79
+ private kind: Kind;
80
+
81
+ private counter: number;
56
82
 
57
83
  private clientRequests: {[key: MediaRequestId]: MediaRequest};
58
84
 
59
- private slotsActiveInLastMediaRequest: {[key: ReceiveSlotId]: ReceiveSlot};
85
+ private degradationPreferences: DegradationPreferences;
60
86
 
61
- constructor(sendMediaRequestsCallback: SendMediaRequestsCallback) {
87
+ private sourceUpdateListener: () => void;
88
+
89
+ private debouncedSourceUpdateListener: () => void;
90
+
91
+ private previousStreamRequests: Array<StreamRequest> = [];
92
+
93
+ constructor(sendMediaRequestsCallback: SendMediaRequestsCallback, options: Options) {
62
94
  this.sendMediaRequestsCallback = sendMediaRequestsCallback;
63
95
  this.counter = 0;
64
96
  this.clientRequests = {};
65
- this.slotsActiveInLastMediaRequest = {};
97
+ this.degradationPreferences = options.degradationPreferences;
98
+ this.kind = options.kind;
99
+ this.sourceUpdateListener = this.commit.bind(this);
100
+ this.debouncedSourceUpdateListener = debounce(
101
+ this.sourceUpdateListener,
102
+ DEBOUNCED_SOURCE_UPDATE_TIME
103
+ );
66
104
  }
67
105
 
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
- );
106
+ public setDegradationPreferences(degradationPreferences: DegradationPreferences) {
107
+ this.degradationPreferences = degradationPreferences;
108
+ this.sendRequests(); // re-send requests after preferences are set
109
+ }
77
110
 
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}`
111
+ private getDegradedClientRequests() {
112
+ const clientRequests = cloneDeep(this.clientRequests);
113
+ const maxFsLimits = [
114
+ getMaxFs('best'),
115
+ getMaxFs('large'),
116
+ getMaxFs('medium'),
117
+ getMaxFs('small'),
118
+ getMaxFs('very small'),
119
+ getMaxFs('thumbnail'),
120
+ ];
121
+
122
+ // reduce max-fs until total macroblocks is below limit
123
+ for (let i = 0; i < maxFsLimits.length; i += 1) {
124
+ let totalMacroblocksRequested = 0;
125
+ Object.entries(clientRequests).forEach(([id, mr]) => {
126
+ if (mr.codecInfo) {
127
+ mr.codecInfo.maxFs = Math.min(
128
+ mr.preferredMaxFs || CODEC_DEFAULTS.h264.maxFs,
129
+ mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,
130
+ maxFsLimits[i]
131
+ );
132
+ // we only consider sources with "live" state
133
+ const slotsWithLiveSource = this.clientRequests[id].receiveSlots.filter(
134
+ (rs) => rs.sourceState === 'live'
135
+ );
136
+ totalMacroblocksRequested += mr.codecInfo.maxFs * slotsWithLiveSource.length;
137
+ }
138
+ });
139
+ if (totalMacroblocksRequested <= this.degradationPreferences.maxMacroblocksLimit) {
140
+ if (i !== 0) {
141
+ LoggerProxy.logger.warn(
142
+ `multistream:mediaRequestManager --> too many streams with high max-fs, frame size will be limited to ${maxFsLimits[i]}`
143
+ );
144
+ }
145
+ break;
146
+ } else if (i === maxFsLimits.length - 1) {
147
+ LoggerProxy.logger.warn(
148
+ `multistream:mediaRequestManager --> even with frame size limited to ${maxFsLimits[i]} you are still requesting too many streams, consider reducing the number of requests`
85
149
  );
86
- slot.resetSourceState();
87
150
  }
88
151
  }
89
152
 
90
- this.slotsActiveInLastMediaRequest = activeSlots;
153
+ return clientRequests;
154
+ }
155
+
156
+ /**
157
+ * Returns true if two stream requests are the same, false otherwise.
158
+ *
159
+ * @param {StreamRequest} streamRequestA - Stream request A for comparison.
160
+ * @param {StreamRequest} streamRequestB - Stream request B for comparison.
161
+ * @returns {boolean} - Whether they are equal.
162
+ */
163
+ // eslint-disable-next-line class-methods-use-this
164
+ public isEqual(streamRequestA: StreamRequest, streamRequestB: StreamRequest) {
165
+ return (
166
+ JSON.stringify(streamRequestA._toJmpStreamRequest()) ===
167
+ JSON.stringify(streamRequestB._toJmpStreamRequest())
168
+ );
169
+ }
170
+
171
+ /**
172
+ * Compares new stream requests to previous ones and determines
173
+ * if they are the same.
174
+ *
175
+ * @param {StreamRequest[]} newRequests - Array with new requests.
176
+ * @returns {boolean} - True if they are equal, false otherwise.
177
+ */
178
+ private checkIsNewRequestsEqualToPrev(newRequests: StreamRequest[]) {
179
+ return (
180
+ !isEmpty(this.previousStreamRequests) &&
181
+ this.previousStreamRequests.length === newRequests.length &&
182
+ this.previousStreamRequests.every((req, idx) => this.isEqual(req, newRequests[idx]))
183
+ );
184
+ }
185
+
186
+ /**
187
+ * Returns the maxPayloadBitsPerSecond per Stream
188
+ *
189
+ * If MediaRequestManager kind is "audio", a constant bitrate will be returned.
190
+ * If MediaRequestManager kind is "video", the bitrate will be calculated based
191
+ * on maxFs (default h264 maxFs as fallback if maxFs is not defined)
192
+ *
193
+ * @param {MediaRequest} mediaRequest - mediaRequest to take data from
194
+ * @returns {number} maxPayloadBitsPerSecond
195
+ */
196
+ private getMaxPayloadBitsPerSecond(mediaRequest: MediaRequest): number {
197
+ if (this.kind === 'audio') {
198
+ // return mono_music bitrate default if the kind of mediarequest manager is audio:
199
+ return RecommendedOpusBitrates.FB_MONO_MUSIC;
200
+ }
201
+
202
+ return getRecommendedMaxBitrateForFrameSize(
203
+ mediaRequest.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs
204
+ );
205
+ }
206
+
207
+ /**
208
+ * Returns the max Macro Blocks per second (maxMbps) per H264 Stream
209
+ *
210
+ * The maxMbps will be calculated based on maxFs and maxFps
211
+ * (default h264 maxFps as fallback if maxFps is not defined)
212
+ *
213
+ * @param {MediaRequest} mediaRequest - mediaRequest to take data from
214
+ * @returns {number} maxMbps
215
+ */
216
+ // eslint-disable-next-line class-methods-use-this
217
+ private getH264MaxMbps(mediaRequest: MediaRequest): number {
218
+ // fallback for maxFps (not needed for maxFs, since there is a fallback already in getDegradedClientRequests)
219
+ const maxFps = mediaRequest.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps;
220
+
221
+ // divided by 100 since maxFps is 3000 (for 30 frames per seconds)
222
+ return (mediaRequest.codecInfo.maxFs * maxFps) / 100;
223
+ }
224
+
225
+ /**
226
+ * Clears the previous stream requests.
227
+ *
228
+ * @returns {void}
229
+ */
230
+ public clearPreviousRequests(): void {
231
+ this.previousStreamRequests = [];
91
232
  }
92
233
 
93
234
  private sendRequests() {
94
- const wcmeMediaRequests: MC.MediaRequest[] = [];
235
+ const streamRequests: StreamRequest[] = [];
95
236
 
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;
237
+ const clientRequests = this.getDegradedClientRequests();
98
238
 
99
- // map all the client media requests to wcme media requests
100
- Object.values(this.clientRequests).forEach((mr) => {
101
- wcmeMediaRequests.push(
102
- new MC.MediaRequest(
239
+ // map all the client media requests to wcme stream requests
240
+ Object.values(clientRequests).forEach((mr) => {
241
+ streamRequests.push(
242
+ new StreamRequest(
103
243
  mr.policyInfo.policy === 'active-speaker'
104
- ? MC.Policy.ActiveSpeaker
105
- : MC.Policy.ReceiverSelected,
244
+ ? Policy.ActiveSpeaker
245
+ : Policy.ReceiverSelected,
106
246
  mr.policyInfo.policy === 'active-speaker'
107
- ? new MC.ActiveSpeakerInfo(
247
+ ? new ActiveSpeakerInfo(
108
248
  mr.policyInfo.priority,
109
249
  mr.policyInfo.crossPriorityDuplication,
110
250
  mr.policyInfo.crossPolicyDuplication,
111
251
  mr.policyInfo.preferLiveVideo
112
252
  )
113
- : new MC.ReceiverSelectedInfo(mr.policyInfo.csi),
253
+ : new ReceiverSelectedInfo(mr.policyInfo.csi),
114
254
  mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),
115
- maxPayloadBitsPerSecond,
255
+ this.getMaxPayloadBitsPerSecond(mr),
116
256
  mr.codecInfo && [
117
- new MC.CodecInfo(
257
+ new WcmeCodecInfo(
118
258
  0x80,
119
- new MC.H264Codec(
120
- mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,
259
+ new H264Codec(
260
+ mr.codecInfo.maxFs,
121
261
  mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,
122
- mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps,
262
+ this.getH264MaxMbps(mr),
123
263
  mr.codecInfo.maxWidth,
124
264
  mr.codecInfo.maxHeight
125
265
  )
@@ -129,9 +269,17 @@ export class MediaRequestManager {
129
269
  );
130
270
  });
131
271
 
132
- this.sendMediaRequestsCallback(wcmeMediaRequests);
133
-
134
- this.resetInactiveReceiveSlots();
272
+ //! IMPORTANT: this is only a temporary fix. This will soon be done in the jmp layer (@webex/json-multistream)
273
+ // https://jira-eng-gpk2.cisco.com/jira/browse/WEBEX-326713
274
+ if (!this.checkIsNewRequestsEqualToPrev(streamRequests)) {
275
+ this.sendMediaRequestsCallback(streamRequests);
276
+ this.previousStreamRequests = streamRequests;
277
+ LoggerProxy.logger.info(`multistream:sendRequests --> media requests sent. `);
278
+ } else {
279
+ LoggerProxy.logger.info(
280
+ `multistream:sendRequests --> detected duplicate WCME requests, skipping them... `
281
+ );
282
+ }
135
283
  }
136
284
 
137
285
  public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {
@@ -140,6 +288,17 @@ export class MediaRequestManager {
140
288
 
141
289
  this.clientRequests[newId] = mediaRequest;
142
290
 
291
+ const eventHandler = ({maxFs}) => {
292
+ mediaRequest.preferredMaxFs = maxFs;
293
+ this.debouncedSourceUpdateListener();
294
+ };
295
+ mediaRequest.handleMaxFs = eventHandler;
296
+
297
+ mediaRequest.receiveSlots.forEach((rs) => {
298
+ rs.on(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);
299
+ rs.on(ReceiveSlotEvents.MaxFsUpdate, mediaRequest.handleMaxFs);
300
+ });
301
+
143
302
  if (commit) {
144
303
  this.commit();
145
304
  }
@@ -148,6 +307,13 @@ export class MediaRequestManager {
148
307
  }
149
308
 
150
309
  public cancelRequest(requestId: MediaRequestId, commit = true) {
310
+ const mediaRequest = this.clientRequests[requestId];
311
+
312
+ mediaRequest?.receiveSlots.forEach((rs) => {
313
+ rs.off(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);
314
+ rs.off(ReceiveSlotEvents.MaxFsUpdate, mediaRequest.handleMaxFs);
315
+ });
316
+
151
317
  delete this.clientRequests[requestId];
152
318
 
153
319
  if (commit) {
@@ -161,6 +327,5 @@ export class MediaRequestManager {
161
327
 
162
328
  public reset() {
163
329
  this.clientRequests = {};
164
- this.slotsActiveInLastMediaRequest = {};
165
330
  }
166
331
  }
@@ -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
  }