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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +178 -0
  4. package/dist/breakouts/breakout.js.map +1 -0
  5. package/dist/breakouts/collection.js +23 -0
  6. package/dist/breakouts/collection.js.map +1 -0
  7. package/dist/breakouts/edit-lock-error.js +52 -0
  8. package/dist/breakouts/edit-lock-error.js.map +1 -0
  9. package/dist/breakouts/index.js +843 -0
  10. package/dist/breakouts/index.js.map +1 -0
  11. package/dist/breakouts/request.js +78 -0
  12. package/dist/breakouts/request.js.map +1 -0
  13. package/dist/breakouts/utils.js +56 -0
  14. package/dist/breakouts/utils.js.map +1 -0
  15. package/dist/common/browser-detection.js +1 -20
  16. package/dist/common/browser-detection.js.map +1 -1
  17. package/dist/common/collection.js +5 -20
  18. package/dist/common/collection.js.map +1 -1
  19. package/dist/common/config.js +0 -7
  20. package/dist/common/config.js.map +1 -1
  21. package/dist/common/errors/captcha-error.js +10 -24
  22. package/dist/common/errors/captcha-error.js.map +1 -1
  23. package/dist/common/errors/intent-to-join.js +11 -24
  24. package/dist/common/errors/intent-to-join.js.map +1 -1
  25. package/dist/common/errors/join-meeting.js +12 -25
  26. package/dist/common/errors/join-meeting.js.map +1 -1
  27. package/dist/common/errors/media.js +10 -24
  28. package/dist/common/errors/media.js.map +1 -1
  29. package/dist/common/errors/parameter.js +5 -33
  30. package/dist/common/errors/parameter.js.map +1 -1
  31. package/dist/common/errors/password-error.js +10 -24
  32. package/dist/common/errors/password-error.js.map +1 -1
  33. package/dist/common/errors/permission.js +9 -23
  34. package/dist/common/errors/permission.js.map +1 -1
  35. package/dist/common/errors/reconnection-in-progress.js +0 -17
  36. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  37. package/dist/common/errors/reconnection.js +10 -24
  38. package/dist/common/errors/reconnection.js.map +1 -1
  39. package/dist/common/errors/stats.js +10 -24
  40. package/dist/common/errors/stats.js.map +1 -1
  41. package/dist/common/errors/webex-errors.js +6 -41
  42. package/dist/common/errors/webex-errors.js.map +1 -1
  43. package/dist/common/errors/webex-meetings-error.js +5 -25
  44. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  45. package/dist/common/events/events-scope.js +0 -22
  46. package/dist/common/events/events-scope.js.map +1 -1
  47. package/dist/common/events/events.js +0 -23
  48. package/dist/common/events/events.js.map +1 -1
  49. package/dist/common/events/trigger-proxy.js +0 -12
  50. package/dist/common/events/trigger-proxy.js.map +1 -1
  51. package/dist/common/events/util.js +0 -15
  52. package/dist/common/events/util.js.map +1 -1
  53. package/dist/common/logs/logger-config.js +0 -4
  54. package/dist/common/logs/logger-config.js.map +1 -1
  55. package/dist/common/logs/logger-proxy.js +1 -8
  56. package/dist/common/logs/logger-proxy.js.map +1 -1
  57. package/dist/common/logs/request.js +37 -60
  58. package/dist/common/logs/request.js.map +1 -1
  59. package/dist/common/queue.js +4 -14
  60. package/dist/common/queue.js.map +1 -1
  61. package/dist/config.js +6 -6
  62. package/dist/config.js.map +1 -1
  63. package/dist/constants.js +143 -52
  64. package/dist/constants.js.map +1 -1
  65. package/dist/controls-options-manager/constants.js +14 -0
  66. package/dist/controls-options-manager/constants.js.map +1 -0
  67. package/dist/controls-options-manager/enums.js +16 -0
  68. package/dist/controls-options-manager/enums.js.map +1 -0
  69. package/dist/controls-options-manager/index.js +261 -0
  70. package/dist/controls-options-manager/index.js.map +1 -0
  71. package/dist/controls-options-manager/util.js +39 -0
  72. package/dist/controls-options-manager/util.js.map +1 -0
  73. package/dist/index.js +11 -18
  74. package/dist/index.js.map +1 -1
  75. package/dist/locus-info/controlsUtils.js +31 -29
  76. package/dist/locus-info/controlsUtils.js.map +1 -1
  77. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  78. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  79. package/dist/locus-info/fullState.js +0 -15
  80. package/dist/locus-info/fullState.js.map +1 -1
  81. package/dist/locus-info/hostUtils.js +4 -12
  82. package/dist/locus-info/hostUtils.js.map +1 -1
  83. package/dist/locus-info/index.js +237 -198
  84. package/dist/locus-info/index.js.map +1 -1
  85. package/dist/locus-info/infoUtils.js +3 -37
  86. package/dist/locus-info/infoUtils.js.map +1 -1
  87. package/dist/locus-info/mediaSharesUtils.js +12 -38
  88. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  89. package/dist/locus-info/parser.js +92 -118
  90. package/dist/locus-info/parser.js.map +1 -1
  91. package/dist/locus-info/selfUtils.js +80 -89
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.js +56 -146
  94. package/dist/media/index.js.map +1 -1
  95. package/dist/media/properties.js +83 -117
  96. package/dist/media/properties.js.map +1 -1
  97. package/dist/media/util.js +2 -9
  98. package/dist/media/util.js.map +1 -1
  99. package/dist/mediaQualityMetrics/config.js +505 -495
  100. package/dist/mediaQualityMetrics/config.js.map +1 -1
  101. package/dist/meeting/in-meeting-actions.js +31 -14
  102. package/dist/meeting/in-meeting-actions.js.map +1 -1
  103. package/dist/meeting/index.js +2225 -2244
  104. package/dist/meeting/index.js.map +1 -1
  105. package/dist/meeting/muteState.js +102 -100
  106. package/dist/meeting/muteState.js.map +1 -1
  107. package/dist/meeting/request.js +308 -264
  108. package/dist/meeting/request.js.map +1 -1
  109. package/dist/meeting/request.type.js +7 -0
  110. package/dist/meeting/request.type.js.map +1 -0
  111. package/dist/meeting/state.js +21 -31
  112. package/dist/meeting/state.js.map +1 -1
  113. package/dist/meeting/util.js +63 -217
  114. package/dist/meeting/util.js.map +1 -1
  115. package/dist/meeting-info/collection.js +6 -25
  116. package/dist/meeting-info/collection.js.map +1 -1
  117. package/dist/meeting-info/index.js +14 -32
  118. package/dist/meeting-info/index.js.map +1 -1
  119. package/dist/meeting-info/meeting-info-v2.js +193 -268
  120. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  121. package/dist/meeting-info/request.js +3 -15
  122. package/dist/meeting-info/request.js.map +1 -1
  123. package/dist/meeting-info/util.js +98 -183
  124. package/dist/meeting-info/util.js.map +1 -1
  125. package/dist/meeting-info/utilv2.js +137 -228
  126. package/dist/meeting-info/utilv2.js.map +1 -1
  127. package/dist/meetings/collection.js +26 -19
  128. package/dist/meetings/collection.js.map +1 -1
  129. package/dist/meetings/index.js +565 -552
  130. package/dist/meetings/index.js.map +1 -1
  131. package/dist/meetings/request.js +26 -41
  132. package/dist/meetings/request.js.map +1 -1
  133. package/dist/meetings/util.js +151 -155
  134. package/dist/meetings/util.js.map +1 -1
  135. package/dist/member/index.js +100 -85
  136. package/dist/member/index.js.map +1 -1
  137. package/dist/member/types.js +15 -0
  138. package/dist/member/types.js.map +1 -0
  139. package/dist/member/util.js +90 -68
  140. package/dist/member/util.js.map +1 -1
  141. package/dist/members/collection.js +13 -12
  142. package/dist/members/collection.js.map +1 -1
  143. package/dist/members/index.js +152 -204
  144. package/dist/members/index.js.map +1 -1
  145. package/dist/members/request.js +35 -39
  146. package/dist/members/request.js.map +1 -1
  147. package/dist/members/types.js +15 -0
  148. package/dist/members/types.js.map +1 -0
  149. package/dist/members/util.js +76 -46
  150. package/dist/members/util.js.map +1 -1
  151. package/dist/metrics/config.js +4 -14
  152. package/dist/metrics/config.js.map +1 -1
  153. package/dist/metrics/constants.js +1 -6
  154. package/dist/metrics/constants.js.map +1 -1
  155. package/dist/metrics/index.js +59 -156
  156. package/dist/metrics/index.js.map +1 -1
  157. package/dist/multistream/mediaRequestManager.js +116 -52
  158. package/dist/multistream/mediaRequestManager.js.map +1 -1
  159. package/dist/multistream/receiveSlot.js +58 -65
  160. package/dist/multistream/receiveSlot.js.map +1 -1
  161. package/dist/multistream/receiveSlotManager.js +58 -93
  162. package/dist/multistream/receiveSlotManager.js.map +1 -1
  163. package/dist/multistream/remoteMedia.js +55 -74
  164. package/dist/multistream/remoteMedia.js.map +1 -1
  165. package/dist/multistream/remoteMediaGroup.js +6 -40
  166. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  167. package/dist/multistream/remoteMediaManager.js +466 -442
  168. package/dist/multistream/remoteMediaManager.js.map +1 -1
  169. package/dist/networkQualityMonitor/index.js +40 -59
  170. package/dist/networkQualityMonitor/index.js.map +1 -1
  171. package/dist/personal-meeting-room/index.js +21 -45
  172. package/dist/personal-meeting-room/index.js.map +1 -1
  173. package/dist/personal-meeting-room/request.js +1 -31
  174. package/dist/personal-meeting-room/request.js.map +1 -1
  175. package/dist/personal-meeting-room/util.js +0 -13
  176. package/dist/personal-meeting-room/util.js.map +1 -1
  177. package/dist/reachability/index.js +192 -191
  178. package/dist/reachability/index.js.map +1 -1
  179. package/dist/reachability/request.js +15 -23
  180. package/dist/reachability/request.js.map +1 -1
  181. package/dist/reactions/constants.js +13 -0
  182. package/dist/reactions/constants.js.map +1 -0
  183. package/dist/reactions/reactions.js +109 -0
  184. package/dist/reactions/reactions.js.map +1 -0
  185. package/dist/reactions/reactions.type.js +36 -0
  186. package/dist/reactions/reactions.type.js.map +1 -0
  187. package/dist/reconnection-manager/index.js +342 -460
  188. package/dist/reconnection-manager/index.js.map +1 -1
  189. package/dist/recording-controller/enums.js +17 -0
  190. package/dist/recording-controller/enums.js.map +1 -0
  191. package/dist/recording-controller/index.js +343 -0
  192. package/dist/recording-controller/index.js.map +1 -0
  193. package/dist/recording-controller/util.js +63 -0
  194. package/dist/recording-controller/util.js.map +1 -0
  195. package/dist/roap/index.js +48 -70
  196. package/dist/roap/index.js.map +1 -1
  197. package/dist/roap/request.js +143 -131
  198. package/dist/roap/request.js.map +1 -1
  199. package/dist/roap/turnDiscovery.js +91 -98
  200. package/dist/roap/turnDiscovery.js.map +1 -1
  201. package/dist/statsAnalyzer/global.js +1 -95
  202. package/dist/statsAnalyzer/global.js.map +1 -1
  203. package/dist/statsAnalyzer/index.js +372 -455
  204. package/dist/statsAnalyzer/index.js.map +1 -1
  205. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  206. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  207. package/dist/transcription/index.js +22 -47
  208. package/dist/transcription/index.js.map +1 -1
  209. package/dist/types/breakouts/breakout.d.ts +8 -0
  210. package/dist/types/breakouts/collection.d.ts +5 -0
  211. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  212. package/dist/types/breakouts/index.d.ts +5 -0
  213. package/dist/types/breakouts/request.d.ts +22 -0
  214. package/dist/types/breakouts/utils.d.ts +8 -0
  215. package/dist/types/common/browser-detection.d.ts +9 -0
  216. package/dist/types/common/collection.d.ts +48 -0
  217. package/dist/types/common/config.d.ts +2 -0
  218. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  219. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  220. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  221. package/dist/types/common/errors/media.d.ts +15 -0
  222. package/dist/types/common/errors/parameter.d.ts +15 -0
  223. package/dist/types/common/errors/password-error.d.ts +15 -0
  224. package/dist/types/common/errors/permission.d.ts +14 -0
  225. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  226. package/dist/types/common/errors/reconnection.d.ts +15 -0
  227. package/dist/types/common/errors/stats.d.ts +15 -0
  228. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  229. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  230. package/dist/types/common/events/events-scope.d.ts +17 -0
  231. package/dist/types/common/events/events.d.ts +12 -0
  232. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  233. package/dist/types/common/events/util.d.ts +2 -0
  234. package/dist/types/common/logs/logger-config.d.ts +2 -0
  235. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  236. package/dist/types/common/logs/request.d.ts +34 -0
  237. package/dist/types/common/queue.d.ts +32 -0
  238. package/dist/types/config.d.ts +77 -0
  239. package/dist/types/constants.d.ts +944 -0
  240. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  241. package/dist/types/controls-options-manager/enums.d.ts +6 -0
  242. package/dist/types/controls-options-manager/index.d.ts +128 -0
  243. package/dist/types/controls-options-manager/util.d.ts +9 -0
  244. package/dist/types/index.d.ts +6 -0
  245. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  246. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  247. package/dist/types/locus-info/fullState.d.ts +2 -0
  248. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  249. package/dist/types/locus-info/index.d.ts +276 -0
  250. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  251. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  252. package/dist/types/locus-info/parser.d.ts +212 -0
  253. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  254. package/dist/types/media/index.d.ts +32 -0
  255. package/dist/types/media/properties.d.ts +108 -0
  256. package/dist/types/media/util.d.ts +2 -0
  257. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  258. package/dist/types/meeting/in-meeting-actions.d.ts +101 -0
  259. package/dist/types/meeting/index.d.ts +1720 -0
  260. package/dist/types/meeting/muteState.d.ts +132 -0
  261. package/dist/types/meeting/request.d.ts +271 -0
  262. package/dist/types/meeting/request.type.d.ts +11 -0
  263. package/dist/types/meeting/state.d.ts +9 -0
  264. package/dist/types/meeting/util.d.ts +2 -0
  265. package/dist/types/meeting-info/collection.d.ts +20 -0
  266. package/dist/types/meeting-info/index.d.ts +57 -0
  267. package/dist/types/meeting-info/meeting-info-v2.d.ts +93 -0
  268. package/dist/types/meeting-info/request.d.ts +22 -0
  269. package/dist/types/meeting-info/util.d.ts +2 -0
  270. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  271. package/dist/types/meetings/collection.d.ts +31 -0
  272. package/dist/types/meetings/index.d.ts +315 -0
  273. package/dist/types/meetings/request.d.ts +27 -0
  274. package/dist/types/meetings/util.d.ts +18 -0
  275. package/dist/types/member/index.d.ts +156 -0
  276. package/dist/types/member/types.d.ts +21 -0
  277. package/dist/types/member/util.d.ts +2 -0
  278. package/dist/types/members/collection.d.ts +29 -0
  279. package/dist/types/members/index.d.ts +343 -0
  280. package/dist/types/members/request.d.ts +58 -0
  281. package/dist/types/members/types.d.ts +24 -0
  282. package/dist/types/members/util.d.ts +2 -0
  283. package/dist/types/metrics/config.d.ts +171 -0
  284. package/dist/types/metrics/constants.d.ts +53 -0
  285. package/dist/types/metrics/index.d.ts +152 -0
  286. package/dist/types/multistream/mediaRequestManager.d.ts +68 -0
  287. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  288. package/dist/types/multistream/receiveSlotManager.d.ts +49 -0
  289. package/dist/types/multistream/remoteMedia.d.ts +100 -0
  290. package/dist/types/multistream/remoteMediaGroup.d.ts +56 -0
  291. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  292. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  293. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  294. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  295. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  296. package/dist/types/reachability/index.d.ts +152 -0
  297. package/dist/types/reachability/request.d.ts +37 -0
  298. package/dist/types/reactions/constants.d.ts +3 -0
  299. package/dist/types/reactions/reactions.d.ts +4 -0
  300. package/dist/types/reactions/reactions.type.d.ts +52 -0
  301. package/dist/types/reconnection-manager/index.d.ts +126 -0
  302. package/dist/types/recording-controller/enums.d.ts +7 -0
  303. package/dist/types/recording-controller/index.d.ts +193 -0
  304. package/dist/types/recording-controller/util.d.ts +13 -0
  305. package/dist/types/roap/index.d.ts +77 -0
  306. package/dist/types/roap/request.d.ts +38 -0
  307. package/dist/types/roap/turnDiscovery.d.ts +74 -0
  308. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  309. package/dist/types/statsAnalyzer/index.d.ts +195 -0
  310. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  311. package/dist/types/transcription/index.d.ts +64 -0
  312. package/internal-README.md +7 -6
  313. package/package.json +27 -21
  314. package/src/breakouts/README.md +219 -0
  315. package/src/breakouts/breakout.ts +153 -0
  316. package/src/breakouts/collection.ts +19 -0
  317. package/src/breakouts/edit-lock-error.ts +25 -0
  318. package/src/breakouts/index.ts +745 -0
  319. package/src/breakouts/request.ts +55 -0
  320. package/src/breakouts/utils.ts +44 -0
  321. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  322. package/src/common/collection.ts +9 -7
  323. package/src/common/{config.js → config.ts} +1 -1
  324. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  325. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  326. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  327. package/src/common/errors/{media.js → media.ts} +11 -7
  328. package/src/common/errors/parameter.ts +11 -7
  329. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  330. package/src/common/errors/{permission.js → permission.ts} +10 -6
  331. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  332. package/src/common/errors/{stats.js → stats.ts} +11 -7
  333. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  334. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  335. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  336. package/src/common/events/{events.js → events.ts} +5 -1
  337. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  338. package/src/common/events/{util.js → util.ts} +2 -3
  339. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  340. package/src/common/logs/logger-proxy.ts +44 -0
  341. package/src/common/logs/{request.js → request.ts} +22 -9
  342. package/src/common/queue.ts +1 -2
  343. package/src/{config.js → config.ts} +17 -12
  344. package/src/constants.ts +92 -5
  345. package/src/controls-options-manager/constants.ts +5 -0
  346. package/src/controls-options-manager/enums.ts +7 -0
  347. package/src/controls-options-manager/index.ts +240 -0
  348. package/src/controls-options-manager/util.ts +30 -0
  349. package/src/index.js +4 -1
  350. package/src/locus-info/controlsUtils.ts +141 -0
  351. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  352. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  353. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  354. package/src/locus-info/{index.js → index.ts} +211 -71
  355. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  356. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  357. package/src/locus-info/{parser.js → parser.ts} +67 -79
  358. package/src/locus-info/{selfUtils.js → selfUtils.ts} +183 -67
  359. package/src/media/{index.js → index.ts} +179 -176
  360. package/src/media/{properties.js → properties.ts} +60 -37
  361. package/src/media/{util.js → util.ts} +2 -2
  362. package/src/mediaQualityMetrics/config.ts +384 -0
  363. package/src/meeting/in-meeting-actions.ts +67 -3
  364. package/src/meeting/{index.js → index.ts} +2605 -1605
  365. package/src/meeting/{muteState.js → muteState.ts} +138 -73
  366. package/src/meeting/{request.js → request.ts} +326 -142
  367. package/src/meeting/request.type.ts +13 -0
  368. package/src/meeting/{state.js → state.ts} +50 -35
  369. package/src/meeting/{util.js → util.ts} +131 -115
  370. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  371. package/src/meeting-info/{index.js → index.ts} +42 -36
  372. package/src/meeting-info/meeting-info-v2.ts +273 -0
  373. package/src/meeting-info/{request.js → request.ts} +14 -4
  374. package/src/meeting-info/{util.js → util.ts} +60 -51
  375. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  376. package/src/meetings/{collection.js → collection.ts} +26 -3
  377. package/src/meetings/index.ts +1275 -0
  378. package/src/meetings/{request.js → request.ts} +34 -25
  379. package/src/meetings/{util.js → util.ts} +99 -33
  380. package/src/member/{index.js → index.ts} +124 -56
  381. package/src/member/types.ts +24 -0
  382. package/src/member/{util.js → util.ts} +105 -25
  383. package/src/members/{collection.js → collection.ts} +10 -2
  384. package/src/members/{index.js → index.ts} +281 -144
  385. package/src/members/{request.js → request.ts} +80 -16
  386. package/src/members/types.ts +28 -0
  387. package/src/members/{util.js → util.ts} +108 -55
  388. package/src/metrics/{config.js → config.ts} +255 -92
  389. package/src/metrics/{constants.js → constants.ts} +0 -6
  390. package/src/metrics/{index.js → index.ts} +110 -94
  391. package/src/multistream/mediaRequestManager.ts +144 -40
  392. package/src/multistream/receiveSlot.ts +69 -26
  393. package/src/multistream/receiveSlotManager.ts +50 -38
  394. package/src/multistream/remoteMedia.ts +30 -4
  395. package/src/multistream/remoteMediaGroup.ts +4 -3
  396. package/src/multistream/remoteMediaManager.ts +230 -66
  397. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  398. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  399. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  400. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  401. package/src/reachability/{index.js → index.ts} +157 -94
  402. package/src/reachability/request.ts +46 -35
  403. package/src/reactions/constants.ts +4 -0
  404. package/src/reactions/reactions.ts +104 -0
  405. package/src/reactions/reactions.type.ts +62 -0
  406. package/src/reconnection-manager/{index.js → index.ts} +228 -120
  407. package/src/recording-controller/enums.ts +8 -0
  408. package/src/recording-controller/index.ts +315 -0
  409. package/src/recording-controller/util.ts +58 -0
  410. package/src/roap/{index.js → index.ts} +77 -60
  411. package/src/roap/request.ts +172 -0
  412. package/src/roap/turnDiscovery.ts +81 -41
  413. package/src/statsAnalyzer/global.ts +37 -0
  414. package/src/statsAnalyzer/index.ts +1242 -0
  415. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  416. package/src/transcription/{index.js → index.ts} +46 -39
  417. package/test/integration/spec/converged-space-meetings.js +176 -0
  418. package/test/integration/spec/journey.js +665 -464
  419. package/test/integration/spec/space-meeting.js +320 -206
  420. package/test/integration/spec/transcription.js +7 -8
  421. package/test/unit/spec/breakouts/breakout.ts +178 -0
  422. package/test/unit/spec/breakouts/collection.ts +15 -0
  423. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  424. package/test/unit/spec/breakouts/index.ts +1252 -0
  425. package/test/unit/spec/breakouts/request.ts +104 -0
  426. package/test/unit/spec/breakouts/utils.js +54 -0
  427. package/test/unit/spec/common/browser-detection.js +9 -28
  428. package/test/unit/spec/controls-options-manager/index.js +204 -0
  429. package/test/unit/spec/controls-options-manager/util.js +86 -0
  430. package/test/unit/spec/fixture/locus.js +92 -90
  431. package/test/unit/spec/locus-info/controlsUtils.js +133 -34
  432. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  433. package/test/unit/spec/locus-info/index.js +303 -2
  434. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  435. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  436. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  437. package/test/unit/spec/locus-info/parser.js +3 -9
  438. package/test/unit/spec/locus-info/selfConstant.js +101 -103
  439. package/test/unit/spec/locus-info/selfUtils.js +165 -12
  440. package/test/unit/spec/media/index.ts +72 -8
  441. package/test/unit/spec/media/properties.ts +9 -9
  442. package/test/unit/spec/meeting/in-meeting-actions.ts +29 -2
  443. package/test/unit/spec/meeting/index.js +2503 -802
  444. package/test/unit/spec/meeting/muteState.js +146 -61
  445. package/test/unit/spec/meeting/request.js +141 -43
  446. package/test/unit/spec/meeting/utils.js +135 -164
  447. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  448. package/test/unit/spec/meeting-info/request.js +7 -9
  449. package/test/unit/spec/meeting-info/util.js +11 -12
  450. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  451. package/test/unit/spec/meetings/collection.js +15 -1
  452. package/test/unit/spec/meetings/index.js +622 -263
  453. package/test/unit/spec/meetings/utils.js +65 -14
  454. package/test/unit/spec/member/index.js +24 -1
  455. package/test/unit/spec/member/util.js +359 -32
  456. package/test/unit/spec/members/index.js +294 -54
  457. package/test/unit/spec/members/request.js +50 -20
  458. package/test/unit/spec/members/utils.js +147 -4
  459. package/test/unit/spec/metrics/index.js +16 -21
  460. package/test/unit/spec/multistream/mediaRequestManager.ts +369 -68
  461. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  462. package/test/unit/spec/multistream/receiveSlotManager.ts +60 -38
  463. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  464. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  465. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
  466. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  467. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  468. package/test/unit/spec/reachability/index.ts +176 -27
  469. package/test/unit/spec/reachability/request.js +66 -0
  470. package/test/unit/spec/reconnection-manager/index.js +58 -30
  471. package/test/unit/spec/recording-controller/index.js +231 -0
  472. package/test/unit/spec/recording-controller/util.js +102 -0
  473. package/test/unit/spec/roap/index.ts +12 -8
  474. package/test/unit/spec/roap/request.ts +217 -0
  475. package/test/unit/spec/roap/turnDiscovery.ts +72 -49
  476. package/test/unit/spec/stats-analyzer/index.js +108 -57
  477. package/test/utils/cmr.js +44 -42
  478. package/test/utils/constants.js +9 -0
  479. package/test/utils/testUtils.js +98 -77
  480. package/test/utils/webex-config.js +22 -18
  481. package/test/utils/webex-test-users.js +57 -50
  482. package/tsconfig.json +6 -0
  483. package/dist/media/internal-media-core-wrapper.js +0 -22
  484. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  485. package/dist/meeting/effectsState.js +0 -327
  486. package/dist/meeting/effectsState.js.map +0 -1
  487. package/dist/multistream/multistreamMedia.js +0 -116
  488. package/dist/multistream/multistreamMedia.js.map +0 -1
  489. package/dist/peer-connection-manager/util.js +0 -124
  490. package/dist/peer-connection-manager/util.js.map +0 -1
  491. package/src/common/logs/logger-proxy.js +0 -33
  492. package/src/locus-info/controlsUtils.js +0 -102
  493. package/src/media/internal-media-core-wrapper.ts +0 -9
  494. package/src/mediaQualityMetrics/config.js +0 -382
  495. package/src/meeting/effectsState.js +0 -205
  496. package/src/meeting-info/meeting-info-v2.js +0 -255
  497. package/src/meetings/index.js +0 -1015
  498. package/src/multistream/multistreamMedia.ts +0 -92
  499. package/src/peer-connection-manager/util.ts +0 -117
  500. package/src/roap/request.js +0 -127
  501. package/src/statsAnalyzer/global.js +0 -133
  502. package/src/statsAnalyzer/index.js +0 -1006
  503. package/src/statsAnalyzer/mqaUtil.js +0 -173
  504. package/test/unit/spec/meeting/effectsState.js +0 -291
  505. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  506. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -0,0 +1,291 @@
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 || 0;
203
+ videoReceiver.streams[0].receivedWidth =
204
+ statsResults.resolutions[mediaType][sendrecvType].width || 0;
205
+ videoReceiver.streams[0].receivedFrameSize =
206
+ (videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;
207
+
208
+ videoReceiver.streams[0].receivedKeyFrames =
209
+ statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;
210
+ videoReceiver.streams[0].requestedKeyFrames =
211
+ statsResults[mediaType][sendrecvType].totalPliCount - lastPliCount || 0;
212
+ };
213
+
214
+ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, mediaType}) => {
215
+ const sendrecvType = STATS.SEND_DIRECTION;
216
+
217
+ const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;
218
+ const lastPacketsLost =
219
+ lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;
220
+ const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;
221
+ const lastKeyFramesEncoded =
222
+ lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
223
+ const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;
224
+ const lastFramesSent = lastMqaDataSent[mediaType]?.[sendrecvType].framesSent || 0;
225
+ const {csi} = statsResults[mediaType];
226
+ if (csi && !videoSender.streams[0].common.csi.includes(csi)) {
227
+ videoSender.streams[0].common.csi.push(csi);
228
+ }
229
+
230
+ videoSender.common.common.direction = statsResults[mediaType].direction;
231
+ videoSender.common.transportType = statsResults.connectionType.local.transport[0];
232
+
233
+ // @ts-ignore
234
+ videoSender.common.maxRemoteJitter =
235
+ // @ts-ignore
236
+ max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
237
+ videoSender.common.meanRemoteJitter =
238
+ mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
239
+
240
+ videoSender.common.rtpPackets =
241
+ statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
242
+ videoSender.common.availableBitrate =
243
+ statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;
244
+ // Calculate based on how much packets lost of received compated to how to the client sent
245
+
246
+ const totalpacketsLostForaMin =
247
+ statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;
248
+
249
+ videoSender.common.remoteLossRate =
250
+ totalpacketsLostForaMin > 0
251
+ ? (totalpacketsLostForaMin * 100) / (videoSender.common.rtpPackets + totalpacketsLostForaMin)
252
+ : 0; // This is the packets sent with in last min || 0;
253
+
254
+ videoSender.common.maxRoundTripTime =
255
+ // @ts-ignore
256
+ max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
257
+ videoSender.common.meanRoundTripTime =
258
+ mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
259
+ videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;
260
+
261
+ videoSender.streams[0].common.rtpPackets =
262
+ statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
263
+
264
+ // Calculate the outgoing bitrate
265
+ const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;
266
+
267
+ videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin
268
+ ? (totalBytesSentInaMin * 8) / 60
269
+ : 0;
270
+
271
+ videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;
272
+
273
+ videoSender.streams[0].transmittedKeyFrames =
274
+ statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastKeyFramesEncoded || 0;
275
+ videoSender.streams[0].requestedKeyFrames =
276
+ statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;
277
+
278
+ // From tracks //TODO: calculate a proper one
279
+ const totalFrameSentInaMin =
280
+ statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
281
+
282
+ videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin
283
+ ? (totalFrameSentInaMin * 100) / 60
284
+ : 0;
285
+ videoSender.streams[0].transmittedHeight =
286
+ statsResults.resolutions[mediaType][sendrecvType].height || 0;
287
+ videoSender.streams[0].transmittedWidth =
288
+ statsResults.resolutions[mediaType][sendrecvType].width || 0;
289
+ videoSender.streams[0].transmittedFrameSize =
290
+ (videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;
291
+ };
@@ -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
+ });