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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (498) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +137 -0
  4. package/dist/breakouts/breakout.js.map +1 -0
  5. package/dist/breakouts/collection.js +23 -0
  6. package/dist/breakouts/collection.js.map +1 -0
  7. package/dist/breakouts/edit-lock-error.js +52 -0
  8. package/dist/breakouts/edit-lock-error.js.map +1 -0
  9. package/dist/breakouts/index.js +546 -0
  10. package/dist/breakouts/index.js.map +1 -0
  11. package/dist/breakouts/request.js +78 -0
  12. package/dist/breakouts/request.js.map +1 -0
  13. package/dist/breakouts/utils.js +48 -0
  14. package/dist/breakouts/utils.js.map +1 -0
  15. package/dist/common/browser-detection.js +1 -20
  16. package/dist/common/browser-detection.js.map +1 -1
  17. package/dist/common/collection.js +5 -20
  18. package/dist/common/collection.js.map +1 -1
  19. package/dist/common/config.js +0 -7
  20. package/dist/common/config.js.map +1 -1
  21. package/dist/common/errors/captcha-error.js +10 -24
  22. package/dist/common/errors/captcha-error.js.map +1 -1
  23. package/dist/common/errors/intent-to-join.js +11 -24
  24. package/dist/common/errors/intent-to-join.js.map +1 -1
  25. package/dist/common/errors/join-meeting.js +12 -25
  26. package/dist/common/errors/join-meeting.js.map +1 -1
  27. package/dist/common/errors/media.js +10 -24
  28. package/dist/common/errors/media.js.map +1 -1
  29. package/dist/common/errors/parameter.js +5 -33
  30. package/dist/common/errors/parameter.js.map +1 -1
  31. package/dist/common/errors/password-error.js +10 -24
  32. package/dist/common/errors/password-error.js.map +1 -1
  33. package/dist/common/errors/permission.js +9 -23
  34. package/dist/common/errors/permission.js.map +1 -1
  35. package/dist/common/errors/reconnection-in-progress.js +0 -17
  36. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  37. package/dist/common/errors/reconnection.js +10 -24
  38. package/dist/common/errors/reconnection.js.map +1 -1
  39. package/dist/common/errors/stats.js +10 -24
  40. package/dist/common/errors/stats.js.map +1 -1
  41. package/dist/common/errors/webex-errors.js +6 -41
  42. package/dist/common/errors/webex-errors.js.map +1 -1
  43. package/dist/common/errors/webex-meetings-error.js +5 -25
  44. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  45. package/dist/common/events/events-scope.js +0 -22
  46. package/dist/common/events/events-scope.js.map +1 -1
  47. package/dist/common/events/events.js +0 -23
  48. package/dist/common/events/events.js.map +1 -1
  49. package/dist/common/events/trigger-proxy.js +0 -12
  50. package/dist/common/events/trigger-proxy.js.map +1 -1
  51. package/dist/common/events/util.js +0 -15
  52. package/dist/common/events/util.js.map +1 -1
  53. package/dist/common/logs/logger-config.js +0 -4
  54. package/dist/common/logs/logger-config.js.map +1 -1
  55. package/dist/common/logs/logger-proxy.js +1 -8
  56. package/dist/common/logs/logger-proxy.js.map +1 -1
  57. package/dist/common/logs/request.js +37 -60
  58. package/dist/common/logs/request.js.map +1 -1
  59. package/dist/common/queue.js +4 -14
  60. package/dist/common/queue.js.map +1 -1
  61. package/dist/config.js +6 -6
  62. package/dist/config.js.map +1 -1
  63. package/dist/constants.js +109 -49
  64. package/dist/constants.js.map +1 -1
  65. package/dist/controls-options-manager/constants.js +14 -0
  66. package/dist/controls-options-manager/constants.js.map +1 -0
  67. package/dist/controls-options-manager/enums.js +15 -0
  68. package/dist/controls-options-manager/enums.js.map +1 -0
  69. package/dist/controls-options-manager/index.js +203 -0
  70. package/dist/controls-options-manager/index.js.map +1 -0
  71. package/dist/controls-options-manager/util.js +28 -0
  72. package/dist/controls-options-manager/util.js.map +1 -0
  73. package/dist/index.js +11 -18
  74. package/dist/index.js.map +1 -1
  75. package/dist/locus-info/controlsUtils.js +12 -29
  76. package/dist/locus-info/controlsUtils.js.map +1 -1
  77. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  78. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  79. package/dist/locus-info/fullState.js +0 -15
  80. package/dist/locus-info/fullState.js.map +1 -1
  81. package/dist/locus-info/hostUtils.js +4 -12
  82. package/dist/locus-info/hostUtils.js.map +1 -1
  83. package/dist/locus-info/index.js +186 -192
  84. package/dist/locus-info/index.js.map +1 -1
  85. package/dist/locus-info/infoUtils.js +3 -37
  86. package/dist/locus-info/infoUtils.js.map +1 -1
  87. package/dist/locus-info/mediaSharesUtils.js +12 -38
  88. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  89. package/dist/locus-info/parser.js +92 -118
  90. package/dist/locus-info/parser.js.map +1 -1
  91. package/dist/locus-info/selfUtils.js +34 -91
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.js +66 -153
  94. package/dist/media/index.js.map +1 -1
  95. package/dist/media/properties.js +83 -117
  96. package/dist/media/properties.js.map +1 -1
  97. package/dist/media/util.js +2 -9
  98. package/dist/media/util.js.map +1 -1
  99. package/dist/mediaQualityMetrics/config.js +505 -495
  100. package/dist/mediaQualityMetrics/config.js.map +1 -1
  101. package/dist/meeting/in-meeting-actions.js +13 -14
  102. package/dist/meeting/in-meeting-actions.js.map +1 -1
  103. package/dist/meeting/index.js +2141 -2210
  104. package/dist/meeting/index.js.map +1 -1
  105. package/dist/meeting/muteState.js +59 -82
  106. package/dist/meeting/muteState.js.map +1 -1
  107. package/dist/meeting/request.js +308 -264
  108. package/dist/meeting/request.js.map +1 -1
  109. package/dist/meeting/request.type.js +7 -0
  110. package/dist/meeting/request.type.js.map +1 -0
  111. package/dist/meeting/state.js +21 -31
  112. package/dist/meeting/state.js.map +1 -1
  113. package/dist/meeting/util.js +45 -217
  114. package/dist/meeting/util.js.map +1 -1
  115. package/dist/meeting-info/collection.js +6 -25
  116. package/dist/meeting-info/collection.js.map +1 -1
  117. package/dist/meeting-info/index.js +14 -32
  118. package/dist/meeting-info/index.js.map +1 -1
  119. package/dist/meeting-info/meeting-info-v2.js +193 -268
  120. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  121. package/dist/meeting-info/request.js +3 -15
  122. package/dist/meeting-info/request.js.map +1 -1
  123. package/dist/meeting-info/util.js +98 -183
  124. package/dist/meeting-info/util.js.map +1 -1
  125. package/dist/meeting-info/utilv2.js +137 -228
  126. package/dist/meeting-info/utilv2.js.map +1 -1
  127. package/dist/meetings/collection.js +5 -20
  128. package/dist/meetings/collection.js.map +1 -1
  129. package/dist/meetings/index.js +490 -560
  130. package/dist/meetings/index.js.map +1 -1
  131. package/dist/meetings/request.js +24 -41
  132. package/dist/meetings/request.js.map +1 -1
  133. package/dist/meetings/util.js +116 -155
  134. package/dist/meetings/util.js.map +1 -1
  135. package/dist/member/index.js +78 -86
  136. package/dist/member/index.js.map +1 -1
  137. package/dist/member/util.js +31 -68
  138. package/dist/member/util.js.map +1 -1
  139. package/dist/members/collection.js +3 -12
  140. package/dist/members/collection.js.map +1 -1
  141. package/dist/members/index.js +95 -200
  142. package/dist/members/index.js.map +1 -1
  143. package/dist/members/request.js +16 -39
  144. package/dist/members/request.js.map +1 -1
  145. package/dist/members/util.js +9 -38
  146. package/dist/members/util.js.map +1 -1
  147. package/dist/metrics/config.js +1 -13
  148. package/dist/metrics/config.js.map +1 -1
  149. package/dist/metrics/constants.js +1 -6
  150. package/dist/metrics/constants.js.map +1 -1
  151. package/dist/metrics/index.js +54 -156
  152. package/dist/metrics/index.js.map +1 -1
  153. package/dist/multistream/mediaRequestManager.js +74 -52
  154. package/dist/multistream/mediaRequestManager.js.map +1 -1
  155. package/dist/multistream/receiveSlot.js +48 -65
  156. package/dist/multistream/receiveSlot.js.map +1 -1
  157. package/dist/multistream/receiveSlotManager.js +60 -82
  158. package/dist/multistream/receiveSlotManager.js.map +1 -1
  159. package/dist/multistream/remoteMedia.js +60 -76
  160. package/dist/multistream/remoteMedia.js.map +1 -1
  161. package/dist/multistream/remoteMediaGroup.js +6 -40
  162. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  163. package/dist/multistream/remoteMediaManager.js +360 -413
  164. package/dist/multistream/remoteMediaManager.js.map +1 -1
  165. package/dist/networkQualityMonitor/index.js +40 -59
  166. package/dist/networkQualityMonitor/index.js.map +1 -1
  167. package/dist/personal-meeting-room/index.js +21 -45
  168. package/dist/personal-meeting-room/index.js.map +1 -1
  169. package/dist/personal-meeting-room/request.js +1 -31
  170. package/dist/personal-meeting-room/request.js.map +1 -1
  171. package/dist/personal-meeting-room/util.js +0 -13
  172. package/dist/personal-meeting-room/util.js.map +1 -1
  173. package/dist/reachability/index.js +147 -183
  174. package/dist/reachability/index.js.map +1 -1
  175. package/dist/reachability/request.js +15 -23
  176. package/dist/reachability/request.js.map +1 -1
  177. package/dist/reactions/constants.js +13 -0
  178. package/dist/reactions/constants.js.map +1 -0
  179. package/dist/reactions/reactions.js +109 -0
  180. package/dist/reactions/reactions.js.map +1 -0
  181. package/dist/reactions/reactions.type.js +36 -0
  182. package/dist/reactions/reactions.type.js.map +1 -0
  183. package/dist/reconnection-manager/index.js +322 -456
  184. package/dist/reconnection-manager/index.js.map +1 -1
  185. package/dist/recording-controller/enums.js +17 -0
  186. package/dist/recording-controller/enums.js.map +1 -0
  187. package/dist/recording-controller/index.js +343 -0
  188. package/dist/recording-controller/index.js.map +1 -0
  189. package/dist/recording-controller/util.js +63 -0
  190. package/dist/recording-controller/util.js.map +1 -0
  191. package/dist/roap/index.js +48 -70
  192. package/dist/roap/index.js.map +1 -1
  193. package/dist/roap/request.js +143 -131
  194. package/dist/roap/request.js.map +1 -1
  195. package/dist/roap/turnDiscovery.js +91 -98
  196. package/dist/roap/turnDiscovery.js.map +1 -1
  197. package/dist/statsAnalyzer/global.js +1 -95
  198. package/dist/statsAnalyzer/global.js.map +1 -1
  199. package/dist/statsAnalyzer/index.js +361 -449
  200. package/dist/statsAnalyzer/index.js.map +1 -1
  201. package/dist/statsAnalyzer/mqaUtil.js +137 -81
  202. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  203. package/dist/transcription/index.js +22 -47
  204. package/dist/transcription/index.js.map +1 -1
  205. package/dist/types/breakouts/breakout.d.ts +8 -0
  206. package/dist/types/breakouts/collection.d.ts +5 -0
  207. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  208. package/dist/types/breakouts/index.d.ts +5 -0
  209. package/dist/types/breakouts/request.d.ts +22 -0
  210. package/dist/types/breakouts/utils.d.ts +8 -0
  211. package/dist/types/common/browser-detection.d.ts +9 -0
  212. package/dist/types/common/collection.d.ts +48 -0
  213. package/dist/types/common/config.d.ts +2 -0
  214. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  215. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  216. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  217. package/dist/types/common/errors/media.d.ts +15 -0
  218. package/dist/types/common/errors/parameter.d.ts +15 -0
  219. package/dist/types/common/errors/password-error.d.ts +15 -0
  220. package/dist/types/common/errors/permission.d.ts +14 -0
  221. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  222. package/dist/types/common/errors/reconnection.d.ts +15 -0
  223. package/dist/types/common/errors/stats.d.ts +15 -0
  224. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  225. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  226. package/dist/types/common/events/events-scope.d.ts +17 -0
  227. package/dist/types/common/events/events.d.ts +12 -0
  228. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  229. package/dist/types/common/events/util.d.ts +2 -0
  230. package/dist/types/common/logs/logger-config.d.ts +2 -0
  231. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  232. package/dist/types/common/logs/request.d.ts +34 -0
  233. package/dist/types/common/queue.d.ts +32 -0
  234. package/dist/types/config.d.ts +77 -0
  235. package/dist/types/constants.d.ts +916 -0
  236. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  237. package/dist/types/controls-options-manager/enums.d.ts +5 -0
  238. package/dist/types/controls-options-manager/index.d.ts +120 -0
  239. package/dist/types/controls-options-manager/util.d.ts +7 -0
  240. package/dist/types/index.d.ts +6 -0
  241. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  242. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  243. package/dist/types/locus-info/fullState.d.ts +2 -0
  244. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  245. package/dist/types/locus-info/index.d.ts +269 -0
  246. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  247. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  248. package/dist/types/locus-info/parser.d.ts +212 -0
  249. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  250. package/dist/types/media/index.d.ts +32 -0
  251. package/dist/types/media/properties.d.ts +108 -0
  252. package/dist/types/media/util.d.ts +2 -0
  253. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  254. package/dist/types/meeting/in-meeting-actions.d.ts +83 -0
  255. package/dist/types/meeting/index.d.ts +1699 -0
  256. package/dist/types/meeting/muteState.d.ts +116 -0
  257. package/dist/types/meeting/request.d.ts +271 -0
  258. package/dist/types/meeting/request.type.d.ts +11 -0
  259. package/dist/types/meeting/state.d.ts +9 -0
  260. package/dist/types/meeting/util.d.ts +2 -0
  261. package/dist/types/meeting-info/collection.d.ts +20 -0
  262. package/dist/types/meeting-info/index.d.ts +57 -0
  263. package/dist/types/meeting-info/meeting-info-v2.d.ts +93 -0
  264. package/dist/types/meeting-info/request.d.ts +22 -0
  265. package/dist/types/meeting-info/util.d.ts +2 -0
  266. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  267. package/dist/types/meetings/collection.d.ts +23 -0
  268. package/dist/types/meetings/index.d.ts +297 -0
  269. package/dist/types/meetings/request.d.ts +27 -0
  270. package/dist/types/meetings/util.d.ts +18 -0
  271. package/dist/types/member/index.d.ts +146 -0
  272. package/dist/types/member/util.d.ts +2 -0
  273. package/dist/types/members/collection.d.ts +24 -0
  274. package/dist/types/members/index.d.ts +320 -0
  275. package/dist/types/members/request.d.ts +50 -0
  276. package/dist/types/members/util.d.ts +2 -0
  277. package/dist/types/metrics/config.d.ts +169 -0
  278. package/dist/types/metrics/constants.d.ts +53 -0
  279. package/dist/types/metrics/index.d.ts +152 -0
  280. package/dist/types/multistream/mediaRequestManager.d.ts +51 -0
  281. package/dist/types/multistream/receiveSlot.d.ts +64 -0
  282. package/dist/types/multistream/receiveSlotManager.d.ts +46 -0
  283. package/dist/types/multistream/remoteMedia.d.ts +100 -0
  284. package/dist/types/multistream/remoteMediaGroup.d.ts +56 -0
  285. package/dist/types/multistream/remoteMediaManager.d.ts +241 -0
  286. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  287. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  288. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  289. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  290. package/dist/types/reachability/index.d.ts +140 -0
  291. package/dist/types/reachability/request.d.ts +37 -0
  292. package/dist/types/reactions/constants.d.ts +3 -0
  293. package/dist/types/reactions/reactions.d.ts +4 -0
  294. package/dist/types/reactions/reactions.type.d.ts +52 -0
  295. package/dist/types/reconnection-manager/index.d.ts +117 -0
  296. package/dist/types/recording-controller/enums.d.ts +7 -0
  297. package/dist/types/recording-controller/index.d.ts +193 -0
  298. package/dist/types/recording-controller/util.d.ts +13 -0
  299. package/dist/types/roap/index.d.ts +77 -0
  300. package/dist/types/roap/request.d.ts +38 -0
  301. package/dist/types/roap/turnDiscovery.d.ts +74 -0
  302. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  303. package/dist/types/statsAnalyzer/index.d.ts +195 -0
  304. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  305. package/dist/types/transcription/index.d.ts +64 -0
  306. package/internal-README.md +7 -6
  307. package/package.json +27 -21
  308. package/src/breakouts/README.md +199 -0
  309. package/src/breakouts/breakout.ts +130 -0
  310. package/src/breakouts/collection.ts +19 -0
  311. package/src/breakouts/edit-lock-error.ts +25 -0
  312. package/src/breakouts/index.ts +504 -0
  313. package/src/breakouts/request.ts +55 -0
  314. package/src/breakouts/utils.ts +39 -0
  315. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  316. package/src/common/collection.ts +9 -7
  317. package/src/common/{config.js → config.ts} +1 -1
  318. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  319. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  320. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  321. package/src/common/errors/{media.js → media.ts} +11 -7
  322. package/src/common/errors/parameter.ts +11 -7
  323. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  324. package/src/common/errors/{permission.js → permission.ts} +10 -6
  325. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  326. package/src/common/errors/{stats.js → stats.ts} +11 -7
  327. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  328. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  329. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  330. package/src/common/events/{events.js → events.ts} +5 -1
  331. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  332. package/src/common/events/{util.js → util.ts} +2 -3
  333. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  334. package/src/common/logs/logger-proxy.ts +44 -0
  335. package/src/common/logs/{request.js → request.ts} +22 -9
  336. package/src/common/queue.ts +1 -2
  337. package/src/{config.js → config.ts} +17 -12
  338. package/src/constants.ts +62 -5
  339. package/src/controls-options-manager/constants.ts +5 -0
  340. package/src/controls-options-manager/enums.ts +6 -0
  341. package/src/controls-options-manager/index.ts +183 -0
  342. package/src/controls-options-manager/util.ts +20 -0
  343. package/src/index.js +4 -1
  344. package/src/locus-info/controlsUtils.ts +114 -0
  345. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  346. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  347. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  348. package/src/locus-info/{index.js → index.ts} +150 -66
  349. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  350. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  351. package/src/locus-info/{parser.js → parser.ts} +67 -79
  352. package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
  353. package/src/media/{index.js → index.ts} +182 -173
  354. package/src/media/{properties.js → properties.ts} +60 -37
  355. package/src/media/{util.js → util.ts} +2 -2
  356. package/src/mediaQualityMetrics/config.ts +384 -0
  357. package/src/meeting/in-meeting-actions.ts +31 -3
  358. package/src/meeting/{index.js → index.ts} +2512 -1579
  359. package/src/meeting/{muteState.js → muteState.ts} +95 -49
  360. package/src/meeting/{request.js → request.ts} +326 -142
  361. package/src/meeting/request.type.ts +13 -0
  362. package/src/meeting/{state.js → state.ts} +50 -35
  363. package/src/meeting/{util.js → util.ts} +117 -119
  364. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  365. package/src/meeting-info/{index.js → index.ts} +42 -36
  366. package/src/meeting-info/meeting-info-v2.ts +273 -0
  367. package/src/meeting-info/{request.js → request.ts} +14 -4
  368. package/src/meeting-info/{util.js → util.ts} +60 -51
  369. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  370. package/src/meetings/{collection.js → collection.ts} +6 -3
  371. package/src/meetings/index.ts +1159 -0
  372. package/src/meetings/{request.js → request.ts} +32 -25
  373. package/src/meetings/{util.js → util.ts} +58 -32
  374. package/src/member/{index.js → index.ts} +102 -56
  375. package/src/member/{util.js → util.ts} +52 -25
  376. package/src/members/{collection.js → collection.ts} +2 -2
  377. package/src/members/{index.js → index.ts} +221 -142
  378. package/src/members/{request.js → request.ts} +60 -16
  379. package/src/members/{util.js → util.ts} +50 -48
  380. package/src/metrics/{config.js → config.ts} +253 -92
  381. package/src/metrics/{constants.js → constants.ts} +0 -6
  382. package/src/metrics/{index.js → index.ts} +105 -94
  383. package/src/multistream/mediaRequestManager.ts +101 -39
  384. package/src/multistream/receiveSlot.ts +62 -26
  385. package/src/multistream/receiveSlotManager.ts +35 -21
  386. package/src/multistream/remoteMedia.ts +38 -5
  387. package/src/multistream/remoteMediaGroup.ts +4 -3
  388. package/src/multistream/remoteMediaManager.ts +152 -36
  389. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  390. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  391. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  392. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  393. package/src/reachability/{index.js → index.ts} +109 -85
  394. package/src/reachability/request.ts +46 -35
  395. package/src/reactions/constants.ts +4 -0
  396. package/src/reactions/reactions.ts +104 -0
  397. package/src/reactions/reactions.type.ts +62 -0
  398. package/src/reconnection-manager/{index.js → index.ts} +196 -103
  399. package/src/recording-controller/enums.ts +8 -0
  400. package/src/recording-controller/index.ts +315 -0
  401. package/src/recording-controller/util.ts +58 -0
  402. package/src/roap/{index.js → index.ts} +77 -60
  403. package/src/roap/request.ts +172 -0
  404. package/src/roap/turnDiscovery.ts +81 -41
  405. package/src/statsAnalyzer/global.ts +37 -0
  406. package/src/statsAnalyzer/index.ts +1234 -0
  407. package/src/statsAnalyzer/mqaUtil.ts +293 -0
  408. package/src/transcription/{index.js → index.ts} +46 -39
  409. package/test/integration/spec/converged-space-meetings.js +176 -0
  410. package/test/integration/spec/journey.js +665 -464
  411. package/test/integration/spec/space-meeting.js +320 -206
  412. package/test/integration/spec/transcription.js +7 -8
  413. package/test/unit/spec/breakouts/breakout.ts +147 -0
  414. package/test/unit/spec/breakouts/collection.ts +15 -0
  415. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  416. package/test/unit/spec/breakouts/index.ts +707 -0
  417. package/test/unit/spec/breakouts/request.ts +104 -0
  418. package/test/unit/spec/breakouts/utils.js +47 -0
  419. package/test/unit/spec/common/browser-detection.js +9 -28
  420. package/test/unit/spec/controls-options-manager/index.js +124 -0
  421. package/test/unit/spec/controls-options-manager/util.js +66 -0
  422. package/test/unit/spec/fixture/locus.js +92 -90
  423. package/test/unit/spec/locus-info/controlsUtils.js +25 -5
  424. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  425. package/test/unit/spec/locus-info/index.js +104 -2
  426. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  427. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  428. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  429. package/test/unit/spec/locus-info/parser.js +3 -9
  430. package/test/unit/spec/locus-info/selfConstant.js +97 -103
  431. package/test/unit/spec/locus-info/selfUtils.js +105 -12
  432. package/test/unit/spec/media/index.ts +39 -53
  433. package/test/unit/spec/media/properties.ts +9 -9
  434. package/test/unit/spec/meeting/in-meeting-actions.ts +13 -2
  435. package/test/unit/spec/meeting/index.js +2253 -811
  436. package/test/unit/spec/meeting/muteState.js +74 -55
  437. package/test/unit/spec/meeting/request.js +141 -43
  438. package/test/unit/spec/meeting/utils.js +106 -171
  439. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  440. package/test/unit/spec/meeting-info/request.js +7 -9
  441. package/test/unit/spec/meeting-info/util.js +11 -12
  442. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  443. package/test/unit/spec/meetings/collection.js +1 -1
  444. package/test/unit/spec/meetings/index.js +439 -257
  445. package/test/unit/spec/meetings/utils.js +14 -12
  446. package/test/unit/spec/member/index.js +0 -1
  447. package/test/unit/spec/member/util.js +31 -7
  448. package/test/unit/spec/members/index.js +104 -54
  449. package/test/unit/spec/members/request.js +29 -20
  450. package/test/unit/spec/members/utils.js +8 -5
  451. package/test/unit/spec/metrics/index.js +16 -21
  452. package/test/unit/spec/multistream/mediaRequestManager.ts +318 -64
  453. package/test/unit/spec/multistream/receiveSlot.ts +68 -17
  454. package/test/unit/spec/multistream/receiveSlotManager.ts +41 -13
  455. package/test/unit/spec/multistream/remoteMedia.ts +38 -2
  456. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  457. package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
  458. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  459. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  460. package/test/unit/spec/reachability/index.ts +70 -27
  461. package/test/unit/spec/reachability/request.js +66 -0
  462. package/test/unit/spec/reconnection-manager/index.js +58 -30
  463. package/test/unit/spec/recording-controller/index.js +231 -0
  464. package/test/unit/spec/recording-controller/util.js +102 -0
  465. package/test/unit/spec/roap/index.ts +12 -8
  466. package/test/unit/spec/roap/request.ts +217 -0
  467. package/test/unit/spec/roap/turnDiscovery.ts +72 -49
  468. package/test/unit/spec/stats-analyzer/index.js +86 -57
  469. package/test/utils/cmr.js +44 -42
  470. package/test/utils/constants.js +9 -0
  471. package/test/utils/testUtils.js +98 -77
  472. package/test/utils/webex-config.js +22 -18
  473. package/test/utils/webex-test-users.js +57 -50
  474. package/tsconfig.json +6 -0
  475. package/dist/media/internal-media-core-wrapper.js +0 -22
  476. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  477. package/dist/meeting/effectsState.js +0 -327
  478. package/dist/meeting/effectsState.js.map +0 -1
  479. package/dist/multistream/multistreamMedia.js +0 -116
  480. package/dist/multistream/multistreamMedia.js.map +0 -1
  481. package/dist/peer-connection-manager/util.js +0 -124
  482. package/dist/peer-connection-manager/util.js.map +0 -1
  483. package/src/common/logs/logger-proxy.js +0 -33
  484. package/src/locus-info/controlsUtils.js +0 -102
  485. package/src/media/internal-media-core-wrapper.ts +0 -9
  486. package/src/mediaQualityMetrics/config.js +0 -382
  487. package/src/meeting/effectsState.js +0 -205
  488. package/src/meeting-info/meeting-info-v2.js +0 -255
  489. package/src/meetings/index.js +0 -1015
  490. package/src/multistream/multistreamMedia.ts +0 -92
  491. package/src/peer-connection-manager/util.ts +0 -117
  492. package/src/roap/request.js +0 -127
  493. package/src/statsAnalyzer/global.js +0 -133
  494. package/src/statsAnalyzer/index.js +0 -1006
  495. package/src/statsAnalyzer/mqaUtil.js +0 -173
  496. package/test/unit/spec/meeting/effectsState.js +0 -291
  497. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  498. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -0,0 +1,293 @@
1
+ /* eslint-disable no-param-reassign, prefer-destructuring */
2
+
3
+ import {mean, max} from 'lodash';
4
+
5
+ import {STATS} from '../constants';
6
+
7
+ export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent, mediaType}) => {
8
+ const sendrecvType = STATS.RECEIVE_DIRECTION;
9
+
10
+ const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;
11
+ const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;
12
+ const lastPacketsDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesDecoded || 0;
13
+ const lastSamplesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesReceived || 0;
14
+ const lastConcealedSamples = lastMqaDataSent[mediaType]?.[sendrecvType].concealedSamples || 0;
15
+ const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;
16
+ const lastFecPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsReceived || 0;
17
+ const lastFecPacketsDiscarded =
18
+ lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsDiscarded || 0;
19
+
20
+ const {csi} = statsResults[mediaType];
21
+ if (csi && !audioReceiver.streams[0].common.csi.includes(csi)) {
22
+ audioReceiver.streams[0].common.csi.push(csi);
23
+ }
24
+
25
+ audioReceiver.common.common.direction = statsResults[mediaType].direction;
26
+ audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
27
+
28
+ // add rtpPacket info inside common as also for call analyzer
29
+ audioReceiver.common.rtpPackets =
30
+ statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
31
+ // Hop by hop are numbers and not percentage so we compare on what we sent the last min
32
+ // collect the packets received for the last min
33
+ audioReceiver.streams[0].common.rtpPackets = audioReceiver.common.rtpPackets;
34
+ audioReceiver.common.mediaHopByHopLost =
35
+ statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;
36
+ audioReceiver.common.rtpHopByHopLost =
37
+ statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;
38
+
39
+ audioReceiver.streams[0].common.maxRtpJitter =
40
+ // @ts-ignore
41
+ max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
42
+ audioReceiver.streams[0].common.meanRtpJitter =
43
+ mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
44
+ audioReceiver.streams[0].common.rtpJitter = audioReceiver.streams[0].common.maxRtpJitter;
45
+
46
+ // Fec packets do come in as part of the FEC only for audio
47
+ const fecRecovered =
48
+ statsResults[mediaType][sendrecvType].fecPacketsReceived -
49
+ lastFecPacketsReceived -
50
+ (statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastFecPacketsDiscarded);
51
+
52
+ audioReceiver.streams[0].common.rtpEndToEndLost =
53
+ statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost - fecRecovered || 0;
54
+
55
+ audioReceiver.streams[0].common.framesDropped =
56
+ statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastPacketsDecoded || 0;
57
+ audioReceiver.streams[0].common.renderedFrameRate =
58
+ (audioReceiver.streams[0].common.framesDropped * 100) / 60 || 0;
59
+
60
+ audioReceiver.streams[0].common.framesReceived =
61
+ statsResults[mediaType][sendrecvType].totalSamplesReceived - lastSamplesReceived || 0;
62
+ audioReceiver.streams[0].common.concealedFrames =
63
+ statsResults[mediaType][sendrecvType].concealedSamples - lastConcealedSamples || 0;
64
+ audioReceiver.streams[0].common.receivedBitrate =
65
+ ((statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived) * 8) / 60 || 0;
66
+
67
+ audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;
68
+ };
69
+
70
+ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, mediaType}) => {
71
+ const sendrecvType = STATS.SEND_DIRECTION;
72
+
73
+ const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;
74
+ const lastPacketsLost =
75
+ lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;
76
+ const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;
77
+ const lastFramesEncoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
78
+ const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;
79
+
80
+ const {csi} = statsResults[mediaType];
81
+ if (csi && !audioSender.streams[0].common.csi.includes(csi)) {
82
+ audioSender.streams[0].common.csi.push(csi);
83
+ }
84
+
85
+ audioSender.common.common.direction = statsResults[mediaType].direction;
86
+ audioSender.common.transportType = statsResults.connectionType.local.transport[0];
87
+
88
+ audioSender.common.maxRemoteJitter =
89
+ // @ts-ignore
90
+ max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
91
+ audioSender.common.meanRemoteJitter =
92
+ mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
93
+
94
+ audioSender.common.rtpPackets =
95
+ statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
96
+ audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;
97
+ // From candidate-pair
98
+ audioSender.common.availableBitrate =
99
+ statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;
100
+ // Calculate based on how much packets lost of received compated to how to the client sent
101
+
102
+ const totalpacketsLostForaMin =
103
+ statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;
104
+
105
+ audioSender.common.remoteLossRate =
106
+ totalpacketsLostForaMin > 0
107
+ ? (totalpacketsLostForaMin * 100) / audioSender.common.rtpPackets
108
+ : 0; // This is the packets sent with in last min || 0;
109
+
110
+ audioSender.common.maxRoundTripTime =
111
+ // @ts-ignore
112
+ max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
113
+ audioSender.common.meanRoundTripTime =
114
+ mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
115
+ audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;
116
+
117
+ // Calculate the outgoing bitrate
118
+ const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;
119
+
120
+ audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin
121
+ ? (totalBytesSentInaMin * 8) / 60
122
+ : 0;
123
+ audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;
124
+
125
+ audioSender.streams[0].transmittedKeyFrames =
126
+ statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastFramesEncoded || 0;
127
+ audioSender.streams[0].requestedKeyFrames =
128
+ statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;
129
+ };
130
+
131
+ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSent, mediaType}) => {
132
+ const sendrecvType = STATS.RECEIVE_DIRECTION;
133
+
134
+ const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;
135
+ const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;
136
+ const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;
137
+ const lastFramesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].framesReceived || 0;
138
+ const lastFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].framesDecoded || 0;
139
+ const lastFramesDropped = lastMqaDataSent[mediaType]?.[sendrecvType].framesDropped || 0;
140
+ const lastKeyFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].keyFramesDecoded || 0;
141
+ const lastPliCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalPliCount || 0;
142
+
143
+ const {csi} = statsResults[mediaType];
144
+ if (csi && !videoReceiver.streams[0].common.csi.includes(csi)) {
145
+ videoReceiver.streams[0].common.csi.push(csi);
146
+ }
147
+
148
+ videoReceiver.common.common.direction = statsResults[mediaType].direction;
149
+ videoReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
150
+ // collect the packets received for the last min
151
+ videoReceiver.common.rtpPackets =
152
+ statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
153
+ videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;
154
+
155
+ const totalPacketLoss =
156
+ statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;
157
+
158
+ // Hope by hop are numbers and not percentage so we compare on what we sent the last min
159
+ // this is including packet lost
160
+ videoReceiver.common.mediaHopByHopLost = totalPacketLoss;
161
+ videoReceiver.common.rtpHopByHopLost = totalPacketLoss;
162
+
163
+ // End to end packetloss is after recovery
164
+ videoReceiver.streams[0].common.rtpEndToEndLost = totalPacketLoss;
165
+
166
+ // calculate this values
167
+
168
+ videoReceiver.common.maxRemoteJitter =
169
+ // @ts-ignore
170
+ max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
171
+ videoReceiver.common.meanRemoteJitter =
172
+ mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
173
+
174
+ videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;
175
+ // videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferEmittedCount) * 1000 || 0;
176
+
177
+ // Calculate the outgoing bitrate
178
+ const totalBytesReceivedInaMin =
179
+ statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived;
180
+
181
+ videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin
182
+ ? (totalBytesReceivedInaMin * 8) / 60
183
+ : 0;
184
+ videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;
185
+
186
+ // From tracks //TODO: calculate a proper one
187
+ const totalFrameReceivedInaMin =
188
+ statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastFramesReceived;
189
+ const totalFrameDecodedInaMin =
190
+ statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;
191
+
192
+ videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin
193
+ ? (totalFrameReceivedInaMin * 100) / 60
194
+ : 0;
195
+ videoReceiver.streams[0].common.renderedFrameRate = totalFrameDecodedInaMin
196
+ ? (totalFrameDecodedInaMin * 100) / 60
197
+ : 0;
198
+
199
+ videoReceiver.streams[0].common.framesDropped =
200
+ statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;
201
+ videoReceiver.streams[0].receivedHeight =
202
+ statsResults.resolutions[mediaType][sendrecvType].height;
203
+ videoReceiver.streams[0].receivedWidth = statsResults.resolutions[mediaType][sendrecvType].width;
204
+ videoReceiver.streams[0].receivedFrameSize =
205
+ (statsResults.resolutions[mediaType][sendrecvType].height *
206
+ statsResults.resolutions[mediaType][sendrecvType].height) /
207
+ 256;
208
+
209
+ videoReceiver.streams[0].receivedKeyFrames =
210
+ statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;
211
+ videoReceiver.streams[0].requestedKeyFrames =
212
+ statsResults[mediaType][sendrecvType].totalPliCount - lastPliCount || 0;
213
+ };
214
+
215
+ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, mediaType}) => {
216
+ const sendrecvType = STATS.SEND_DIRECTION;
217
+
218
+ const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;
219
+ const lastPacketsLost =
220
+ lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;
221
+ const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;
222
+ const lastKeyFramesEncoded =
223
+ lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
224
+ const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;
225
+ const lastFramesSent = lastMqaDataSent[mediaType]?.[sendrecvType].framesSent || 0;
226
+ const {csi} = statsResults[mediaType];
227
+ if (csi && !videoSender.streams[0].common.csi.includes(csi)) {
228
+ videoSender.streams[0].common.csi.push(csi);
229
+ }
230
+
231
+ videoSender.common.common.direction = statsResults[mediaType].direction;
232
+ videoSender.common.transportType = statsResults.connectionType.local.transport[0];
233
+
234
+ // @ts-ignore
235
+ videoSender.common.maxRemoteJitter =
236
+ // @ts-ignore
237
+ max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
238
+ videoSender.common.meanRemoteJitter =
239
+ mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
240
+
241
+ videoSender.common.rtpPackets =
242
+ statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
243
+ videoSender.common.availableBitrate =
244
+ statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;
245
+ // Calculate based on how much packets lost of received compated to how to the client sent
246
+
247
+ const totalpacketsLostForaMin =
248
+ statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;
249
+
250
+ videoSender.common.remoteLossRate =
251
+ totalpacketsLostForaMin > 0
252
+ ? (totalpacketsLostForaMin * 100) / (videoSender.common.rtpPackets + totalpacketsLostForaMin)
253
+ : 0; // This is the packets sent with in last min || 0;
254
+
255
+ videoSender.common.maxRoundTripTime =
256
+ // @ts-ignore
257
+ max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
258
+ videoSender.common.meanRoundTripTime =
259
+ mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
260
+ videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;
261
+
262
+ videoSender.streams[0].common.rtpPackets =
263
+ statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
264
+
265
+ // Calculate the outgoing bitrate
266
+ const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;
267
+
268
+ videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin
269
+ ? (totalBytesSentInaMin * 8) / 60
270
+ : 0;
271
+
272
+ videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;
273
+
274
+ videoSender.streams[0].transmittedKeyFrames =
275
+ statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastKeyFramesEncoded || 0;
276
+ videoSender.streams[0].requestedKeyFrames =
277
+ statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;
278
+
279
+ // From tracks //TODO: calculate a proper one
280
+ const totalFrameSentInaMin =
281
+ statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
282
+
283
+ videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin
284
+ ? (totalFrameSentInaMin * 100) / 60
285
+ : 0;
286
+ videoSender.streams[0].transmittedHeight =
287
+ statsResults.resolutions[mediaType][sendrecvType].height;
288
+ videoSender.streams[0].transmittedWidth = statsResults.resolutions[mediaType][sendrecvType].width;
289
+ videoSender.streams[0].transmittedFrameSize =
290
+ (statsResults.resolutions[mediaType][sendrecvType].height *
291
+ statsResults.resolutions[mediaType][sendrecvType].width) /
292
+ 254;
293
+ };
@@ -6,6 +6,12 @@ import {v4 as uuidv4} from 'uuid';
6
6
  * @class Transcription
7
7
  */
8
8
  export default class Transcription {
9
+ webSocketUrl: any;
10
+ sessionID: any;
11
+ members: any;
12
+ memberCSIs: any;
13
+ webSocket: any;
14
+
9
15
  /**
10
16
  * @param {string} webSocketUrl
11
17
  * @param {sessionID} sessionId
@@ -13,7 +19,7 @@ export default class Transcription {
13
19
  * @constructor
14
20
  * @memberof Transcription
15
21
  */
16
- constructor(webSocketUrl, sessionId, members) {
22
+ constructor(webSocketUrl: string, sessionId: any, members: object) {
17
23
  this.webSocketUrl = webSocketUrl;
18
24
  this.sessionID = sessionId;
19
25
  this.members = members;
@@ -32,24 +38,26 @@ export default class Transcription {
32
38
  * @param {string} sessionID
33
39
  * @returns {void}
34
40
  */
35
- connect(token) {
41
+ connect(token: string) {
36
42
  this.webSocket.onopen = () => {
37
- this.webSocket.send(JSON.stringify({
38
- id: uuidv4(),
39
- type: 'authorization',
40
- data: {token: `Bearer ${token}`},
41
- trackingId: `webex-js-sdk_${this.sessionID}${Date.now.toString()}`
42
- }));
43
+ this.webSocket.send(
44
+ JSON.stringify({
45
+ id: uuidv4(),
46
+ type: 'authorization',
47
+ data: {token: `Bearer ${token}`},
48
+ trackingId: `webex-js-sdk_${this.sessionID}${Date.now.toString()}`,
49
+ })
50
+ );
43
51
  };
44
52
  }
45
53
 
46
54
  /**
47
55
  * Sets callback to invoke when the web socket connection is closed.
48
56
  *
49
- * @param {function} callback
57
+ * @param {Function} callback
50
58
  * @returns {void}
51
59
  */
52
- onCloseSocket(callback) {
60
+ onCloseSocket(callback: any) {
53
61
  if (callback) {
54
62
  this.webSocket.onclose = (event) => {
55
63
  callback(event);
@@ -61,10 +69,10 @@ export default class Transcription {
61
69
  * Sets callback to invoke when a web socket connection error occurs.
62
70
  * An event parameter will be send to the callback.
63
71
  *
64
- * @param {function} callback
72
+ * @param {Function} callback
65
73
  * @returns {void}
66
74
  */
67
- onErrorSocket(callback) {
75
+ onErrorSocket(callback: any) {
68
76
  if (callback) {
69
77
  this.webSocket.onerror = (event) => {
70
78
  callback(event);
@@ -79,7 +87,7 @@ export default class Transcription {
79
87
  * @param {object} csis
80
88
  * @returns {object}
81
89
  */
82
- getSpeaker(csis) {
90
+ private getSpeaker(csis: any) {
83
91
  for (const csi of csis) {
84
92
  const member = this.memberCSIs[csi];
85
93
 
@@ -88,31 +96,33 @@ export default class Transcription {
88
96
  }
89
97
  }
90
98
 
91
- return Object.values(this.members.membersCollection.members)
92
- .find((member) => {
93
- const memberCSIs = member.participant.status.csis;
94
- let selfIsSpeaking = false;
95
-
96
- for (const csi of csis) {
97
- if (memberCSIs.includes(csi)) {
98
- this.memberCSIs[csi] = member;
99
- selfIsSpeaking = true;
100
- break;
101
- }
99
+ return Object.values(this.members.membersCollection.members).find((member: any) => {
100
+ const memberCSIs = member.participant.status.csis;
101
+ let selfIsSpeaking = false;
102
+
103
+ for (const csi of csis) {
104
+ if (memberCSIs.includes(csi)) {
105
+ this.memberCSIs[csi] = member;
106
+ selfIsSpeaking = true;
107
+ break;
102
108
  }
109
+ }
103
110
 
104
- return selfIsSpeaking;
105
- });
111
+ return selfIsSpeaking;
112
+ });
106
113
  }
107
114
 
108
115
  /**
109
116
  * Sends transcription data to given callback as it arrives.
110
117
  *
111
- * @param {function} callback
118
+ * @param {Function} callback
112
119
  * @returns {void}
113
120
  */
114
- subscribe(callback) {
115
- let data, csis, speaker, transcription;
121
+ subscribe(callback: any) {
122
+ let data;
123
+ let csis;
124
+ let speaker;
125
+ let transcription;
116
126
 
117
127
  this.webSocket.onmessage = (event) => {
118
128
  data = JSON.parse(event.data);
@@ -123,15 +133,13 @@ export default class Transcription {
123
133
  this.webSocket.send(JSON.stringify({messageID: data.id, type: 'ack'}));
124
134
 
125
135
  if (transcription) {
126
- callback(
127
- {
128
- id: data.data?.voiceaPayload?.transcript_id,
129
- personID: speaker?.id,
130
- transcription,
131
- timestamp: data.timestamp,
132
- type: data?.data?.voiceaPayload?.type
133
- }
134
- );
136
+ callback({
137
+ id: data.data?.voiceaPayload?.transcript_id,
138
+ personID: speaker?.id,
139
+ transcription,
140
+ timestamp: data.timestamp,
141
+ type: data?.data?.voiceaPayload?.type,
142
+ });
135
143
  }
136
144
  };
137
145
  }
@@ -144,4 +152,3 @@ export default class Transcription {
144
152
  this.webSocket.close();
145
153
  }
146
154
  }
147
-
@@ -0,0 +1,176 @@
1
+ import { config } from 'dotenv';
2
+ import 'jsdom-global/register';
3
+ import {assert} from '@webex/test-helper-chai';
4
+ import {skipInNode} from '@webex/test-helper-mocha';
5
+ import BrowserDetection from '@webex/plugin-meetings/dist/common/browser-detection';
6
+
7
+ import {MEDIA_SERVERS} from '../../utils/constants';
8
+ import testUtils from '../../utils/testUtils';
9
+ import webexTestUsers from '../../utils/webex-test-users';
10
+
11
+ config();
12
+
13
+ skipInNode(describe)('plugin-meetings', () => {
14
+ const {isBrowser} = BrowserDetection();
15
+
16
+ // `addMedia()` fails on FF, this needs to be debuged and fixed in a later change
17
+ if (!isBrowser('firefox')) {
18
+ describe('converged-space-meeting', () => {
19
+ let shouldSkip = false;
20
+ let users, alice, bob, chris;
21
+ let meeting = null;
22
+ let space = null;
23
+ let mediaReadyListener = null;
24
+
25
+ before('setup users', async () => {
26
+ const userSet = await webexTestUsers.generateTestUsers({
27
+ count: 3,
28
+ whistler: process.env.WHISTLER || process.env.JENKINS,
29
+ config
30
+ });
31
+
32
+ users = userSet;
33
+ alice = users[0];
34
+ bob = users[1];
35
+ chris = users[2];
36
+ alice.name = 'alice';
37
+ bob.name = 'bob';
38
+ chris.name = 'chris';
39
+
40
+ const aliceSync = testUtils.syncAndEndMeeting(alice);
41
+ const bobSync = testUtils.syncAndEndMeeting(bob);
42
+ const chrisSync = testUtils.syncAndEndMeeting(chris);
43
+
44
+ await aliceSync;
45
+ await bobSync;
46
+ await chrisSync;
47
+ });
48
+
49
+ // Skip a test in this series if one failed.
50
+ // This beforeEach() instance function must use the `function` declaration to preserve the
51
+ // `this` context. `() => {}` will not generate the correct `this` context
52
+ beforeEach('check if should skip test', function() {
53
+ if (shouldSkip) {
54
+ this.skip();
55
+ }
56
+ });
57
+
58
+ // Store to the describe scope if a test has failed for skipping.
59
+ // This beforeEach() instance function must use the `function` declaration to preserve the
60
+ // `this` context. `() => {}` will not generate the correct `this` context
61
+ afterEach('check if test failed', function() {
62
+ if (this.currentTest.state === 'failed') {
63
+ shouldSkip = true;
64
+ }
65
+ });
66
+
67
+ it('user "alice" starts a space', async () => {
68
+ const conversation = await alice.webex.internal.conversation.create({
69
+ participants: [bob, chris],
70
+ });
71
+
72
+ assert.lengthOf(conversation.participants.items, 3);
73
+ assert.lengthOf(conversation.activities.items, 1);
74
+
75
+ space = conversation;
76
+
77
+ const destinationWithType = await alice.webex.meetings.meetingInfo.fetchMeetingInfo(space.url, 'CONVERSATION_URL');
78
+ const destinationWithoutType = await alice.webex.meetings.meetingInfo.fetchMeetingInfo(space.url);
79
+
80
+ assert.exists(destinationWithoutType);
81
+ assert.exists(destinationWithType);
82
+ assert.exists(destinationWithoutType.body.meetingNumber);
83
+ assert.exists(destinationWithType.body.meetingNumber);
84
+ });
85
+
86
+ it('user "alice" starts a meeting', async () => {
87
+ const wait = testUtils.waitForEvents([{
88
+ scope: alice.webex.meetings,
89
+ event: 'meeting:added',
90
+ user: alice,
91
+ }]);
92
+
93
+ const createdMeeting = await testUtils.delayedPromise(alice.webex.meetings.create(space.url));
94
+
95
+ await wait;
96
+
97
+ assert.exists(createdMeeting);
98
+
99
+ meeting = createdMeeting;
100
+ });
101
+
102
+ it('user "alice" joins the meeting', async () => {
103
+ const wait = testUtils.waitForEvents([
104
+ {scope: bob.webex.meetings, event: 'meeting:added', user: bob},
105
+ {scope: chris.webex.meetings, event: 'meeting:added', user: chris},
106
+ ]);
107
+
108
+ await testUtils.delayedPromise(alice.meeting.join({enableMultistream: true}));
109
+
110
+ await wait;
111
+
112
+ assert.isTrue(!!alice.webex.meetings.meetingCollection.meetings[meeting.id].joinedWith);
113
+ });
114
+
115
+ it('users "bob" and "chris" join the meeting', async () => {
116
+ await testUtils.waitForStateChange(alice.meeting, 'JOINED');
117
+
118
+ const bobIdle = testUtils.waitForStateChange(bob.meeting, 'IDLE');
119
+ const chrisIdle = testUtils.waitForStateChange(chris.meeting, 'IDLE');
120
+
121
+ await bobIdle;
122
+ await chrisIdle;
123
+
124
+ const bobJoined = testUtils.waitForStateChange(bob.meeting, 'JOINED');
125
+ const chrisJoined = testUtils.waitForStateChange(chris.meeting, 'JOINED');
126
+ const bobJoin = bob.meeting.join({enableMultistream: true});
127
+ const chrisJoin = chris.meeting.join({enableMultistream: true});
128
+
129
+ await bobJoin;
130
+ await chrisJoin;
131
+ await bobJoined;
132
+ await chrisJoined;
133
+
134
+ assert.exists(bob.meeting.joinedWith);
135
+ assert.exists(chris.meeting.joinedWith);
136
+ });
137
+
138
+ it('users "alice", "bob", and "chris" add media', async () => {
139
+ mediaReadyListener = testUtils.waitForEvents([
140
+ {scope: alice.meeting, event: 'media:negotiated'},
141
+ {scope: bob.meeting, event: 'media:negotiated'},
142
+ {scope: chris.meeting, event: 'media:negotiated'},
143
+ ]);
144
+
145
+ const addMediaAlice = testUtils.addMedia(alice, {multistream: true, expectedMediaReadyTypes: ['local']});
146
+ const addMediaBob = testUtils.addMedia(bob, {multistream: true, expectedMediaReadyTypes: ['local']});
147
+ const addMediaChris = testUtils.addMedia(chris, {multistream: true, expectedMediaReadyTypes: ['local']});
148
+
149
+ await addMediaAlice;
150
+ await addMediaBob;
151
+ await addMediaChris;
152
+
153
+ assert.isTrue(alice.meeting.mediaProperties.mediaDirection.sendAudio);
154
+ assert.isTrue(alice.meeting.mediaProperties.mediaDirection.sendVideo);
155
+ assert.isTrue(alice.meeting.mediaProperties.mediaDirection.receiveAudio);
156
+ assert.isTrue(alice.meeting.mediaProperties.mediaDirection.receiveVideo);
157
+ assert.isTrue(bob.meeting.mediaProperties.mediaDirection.sendAudio);
158
+ assert.isTrue(bob.meeting.mediaProperties.mediaDirection.sendVideo);
159
+ assert.isTrue(bob.meeting.mediaProperties.mediaDirection.receiveAudio);
160
+ assert.isTrue(bob.meeting.mediaProperties.mediaDirection.receiveVideo);
161
+ assert.isTrue(chris.meeting.mediaProperties.mediaDirection.sendAudio);
162
+ assert.isTrue(chris.meeting.mediaProperties.mediaDirection.sendVideo);
163
+ assert.isTrue(chris.meeting.mediaProperties.mediaDirection.receiveAudio);
164
+ assert.isTrue(chris.meeting.mediaProperties.mediaDirection.receiveVideo);
165
+ });
166
+
167
+ it(`users "alice", "bob", and "chris" should be using the "${MEDIA_SERVERS.HOMER}" media server`, async () => {
168
+ await mediaReadyListener;
169
+
170
+ assert.equal(alice.meeting.mediaProperties.webrtcMediaConnection.mediaServer, MEDIA_SERVERS.HOMER);
171
+ assert.equal(bob.meeting.mediaProperties.webrtcMediaConnection.mediaServer, MEDIA_SERVERS.HOMER);
172
+ assert.equal(chris.meeting.mediaProperties.webrtcMediaConnection.mediaServer, MEDIA_SERVERS.HOMER);
173
+ });
174
+ });
175
+ }
176
+ });