@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.131

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 (519) hide show
  1. package/README.md +45 -1
  2. package/UPGRADING.md +9 -9
  3. package/browsers.js +19 -24
  4. package/dist/annotation/annotation.types.js +7 -0
  5. package/dist/annotation/annotation.types.js.map +1 -0
  6. package/dist/annotation/constants.js +48 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +355 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +193 -0
  11. package/dist/breakouts/breakout.js.map +1 -0
  12. package/dist/breakouts/collection.js +23 -0
  13. package/dist/breakouts/collection.js.map +1 -0
  14. package/dist/breakouts/edit-lock-error.js +52 -0
  15. package/dist/breakouts/edit-lock-error.js.map +1 -0
  16. package/dist/breakouts/events.js +43 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +994 -0
  19. package/dist/breakouts/index.js.map +1 -0
  20. package/dist/breakouts/request.js +78 -0
  21. package/dist/breakouts/request.js.map +1 -0
  22. package/dist/breakouts/utils.js +67 -0
  23. package/dist/breakouts/utils.js.map +1 -0
  24. package/dist/common/browser-detection.js +1 -20
  25. package/dist/common/browser-detection.js.map +1 -1
  26. package/dist/common/collection.js +5 -20
  27. package/dist/common/collection.js.map +1 -1
  28. package/dist/common/config.js +0 -7
  29. package/dist/common/config.js.map +1 -1
  30. package/dist/common/errors/captcha-error.js +5 -26
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +5 -26
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +6 -27
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +5 -26
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/parameter.js +5 -33
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +5 -26
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +4 -25
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reconnection-in-progress.js +0 -17
  45. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  46. package/dist/common/errors/reconnection.js +5 -26
  47. package/dist/common/errors/reconnection.js.map +1 -1
  48. package/dist/common/errors/stats.js +5 -26
  49. package/dist/common/errors/stats.js.map +1 -1
  50. package/dist/common/errors/webex-errors.js +6 -41
  51. package/dist/common/errors/webex-errors.js.map +1 -1
  52. package/dist/common/errors/webex-meetings-error.js +1 -24
  53. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  54. package/dist/common/events/events-scope.js +0 -22
  55. package/dist/common/events/events-scope.js.map +1 -1
  56. package/dist/common/events/events.js +0 -23
  57. package/dist/common/events/events.js.map +1 -1
  58. package/dist/common/events/trigger-proxy.js +0 -12
  59. package/dist/common/events/trigger-proxy.js.map +1 -1
  60. package/dist/common/events/util.js +0 -15
  61. package/dist/common/events/util.js.map +1 -1
  62. package/dist/common/logs/logger-config.js +0 -4
  63. package/dist/common/logs/logger-config.js.map +1 -1
  64. package/dist/common/logs/logger-proxy.js +1 -8
  65. package/dist/common/logs/logger-proxy.js.map +1 -1
  66. package/dist/common/logs/request.js +35 -61
  67. package/dist/common/logs/request.js.map +1 -1
  68. package/dist/common/queue.js +4 -14
  69. package/dist/common/queue.js.map +1 -1
  70. package/dist/config.js +6 -6
  71. package/dist/config.js.map +1 -1
  72. package/dist/constants.js +203 -53
  73. package/dist/constants.js.map +1 -1
  74. package/dist/controls-options-manager/constants.js +14 -0
  75. package/dist/controls-options-manager/constants.js.map +1 -0
  76. package/dist/controls-options-manager/enums.js +27 -0
  77. package/dist/controls-options-manager/enums.js.map +1 -0
  78. package/dist/controls-options-manager/index.js +297 -0
  79. package/dist/controls-options-manager/index.js.map +1 -0
  80. package/dist/controls-options-manager/types.js +7 -0
  81. package/dist/controls-options-manager/types.js.map +1 -0
  82. package/dist/controls-options-manager/util.js +294 -0
  83. package/dist/controls-options-manager/util.js.map +1 -0
  84. package/dist/index.js +72 -17
  85. package/dist/index.js.map +1 -1
  86. package/dist/locus-info/controlsUtils.js +100 -29
  87. package/dist/locus-info/controlsUtils.js.map +1 -1
  88. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  89. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  90. package/dist/locus-info/fullState.js +0 -15
  91. package/dist/locus-info/fullState.js.map +1 -1
  92. package/dist/locus-info/hostUtils.js +4 -12
  93. package/dist/locus-info/hostUtils.js.map +1 -1
  94. package/dist/locus-info/index.js +406 -216
  95. package/dist/locus-info/index.js.map +1 -1
  96. package/dist/locus-info/infoUtils.js +0 -38
  97. package/dist/locus-info/infoUtils.js.map +1 -1
  98. package/dist/locus-info/mediaSharesUtils.js +54 -38
  99. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  100. package/dist/locus-info/parser.js +88 -123
  101. package/dist/locus-info/parser.js.map +1 -1
  102. package/dist/locus-info/selfUtils.js +105 -91
  103. package/dist/locus-info/selfUtils.js.map +1 -1
  104. package/dist/media/index.js +55 -165
  105. package/dist/media/index.js.map +1 -1
  106. package/dist/media/properties.js +71 -117
  107. package/dist/media/properties.js.map +1 -1
  108. package/dist/media/util.js +2 -9
  109. package/dist/media/util.js.map +1 -1
  110. package/dist/mediaQualityMetrics/config.js +505 -495
  111. package/dist/mediaQualityMetrics/config.js.map +1 -1
  112. package/dist/meeting/in-meeting-actions.js +77 -14
  113. package/dist/meeting/in-meeting-actions.js.map +1 -1
  114. package/dist/meeting/index.js +2603 -2462
  115. package/dist/meeting/index.js.map +1 -1
  116. package/dist/meeting/locusMediaRequest.js +291 -0
  117. package/dist/meeting/locusMediaRequest.js.map +1 -0
  118. package/dist/meeting/muteState.js +292 -138
  119. package/dist/meeting/muteState.js.map +1 -1
  120. package/dist/meeting/request.js +315 -336
  121. package/dist/meeting/request.js.map +1 -1
  122. package/dist/meeting/request.type.js +7 -0
  123. package/dist/meeting/request.type.js.map +1 -0
  124. package/dist/meeting/state.js +21 -31
  125. package/dist/meeting/state.js.map +1 -1
  126. package/dist/meeting/util.js +463 -583
  127. package/dist/meeting/util.js.map +1 -1
  128. package/dist/meeting-info/collection.js +3 -25
  129. package/dist/meeting-info/collection.js.map +1 -1
  130. package/dist/meeting-info/index.js +10 -33
  131. package/dist/meeting-info/index.js.map +1 -1
  132. package/dist/meeting-info/meeting-info-v2.js +305 -286
  133. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  134. package/dist/meeting-info/request.js +1 -16
  135. package/dist/meeting-info/request.js.map +1 -1
  136. package/dist/meeting-info/util.js +98 -183
  137. package/dist/meeting-info/util.js.map +1 -1
  138. package/dist/meeting-info/utilv2.js +156 -232
  139. package/dist/meeting-info/utilv2.js.map +1 -1
  140. package/dist/meetings/collection.js +24 -20
  141. package/dist/meetings/collection.js.map +1 -1
  142. package/dist/meetings/index.js +692 -593
  143. package/dist/meetings/index.js.map +1 -1
  144. package/dist/meetings/request.js +23 -42
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +186 -155
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.js +89 -88
  149. package/dist/member/index.js.map +1 -1
  150. package/dist/member/types.js +15 -0
  151. package/dist/member/types.js.map +1 -0
  152. package/dist/member/util.js +101 -69
  153. package/dist/member/util.js.map +1 -1
  154. package/dist/members/collection.js +12 -12
  155. package/dist/members/collection.js.map +1 -1
  156. package/dist/members/index.js +166 -205
  157. package/dist/members/index.js.map +1 -1
  158. package/dist/members/request.js +120 -85
  159. package/dist/members/request.js.map +1 -1
  160. package/dist/members/types.js +15 -0
  161. package/dist/members/types.js.map +1 -0
  162. package/dist/members/util.js +314 -260
  163. package/dist/members/util.js.map +1 -1
  164. package/dist/metrics/config.js +50 -16
  165. package/dist/metrics/config.js.map +1 -1
  166. package/dist/metrics/constants.js +4 -7
  167. package/dist/metrics/constants.js.map +1 -1
  168. package/dist/metrics/index.js +93 -162
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/multistream/mediaRequestManager.js +167 -50
  171. package/dist/multistream/mediaRequestManager.js.map +1 -1
  172. package/dist/multistream/receiveSlot.js +58 -65
  173. package/dist/multistream/receiveSlot.js.map +1 -1
  174. package/dist/multistream/receiveSlotManager.js +74 -93
  175. package/dist/multistream/receiveSlotManager.js.map +1 -1
  176. package/dist/multistream/remoteMedia.js +55 -74
  177. package/dist/multistream/remoteMedia.js.map +1 -1
  178. package/dist/multistream/remoteMediaGroup.js +6 -40
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +466 -442
  181. package/dist/multistream/remoteMediaManager.js.map +1 -1
  182. package/dist/networkQualityMonitor/index.js +32 -59
  183. package/dist/networkQualityMonitor/index.js.map +1 -1
  184. package/dist/personal-meeting-room/index.js +10 -45
  185. package/dist/personal-meeting-room/index.js.map +1 -1
  186. package/dist/personal-meeting-room/request.js +2 -33
  187. package/dist/personal-meeting-room/request.js.map +1 -1
  188. package/dist/personal-meeting-room/util.js +0 -13
  189. package/dist/personal-meeting-room/util.js.map +1 -1
  190. package/dist/reachability/index.js +190 -199
  191. package/dist/reachability/index.js.map +1 -1
  192. package/dist/reachability/request.js +14 -23
  193. package/dist/reachability/request.js.map +1 -1
  194. package/dist/reactions/constants.js +13 -0
  195. package/dist/reactions/constants.js.map +1 -0
  196. package/dist/reactions/reactions.js +2 -4
  197. package/dist/reactions/reactions.js.map +1 -1
  198. package/dist/reactions/reactions.type.js +19 -23
  199. package/dist/reactions/reactions.type.js.map +1 -1
  200. package/dist/reconnection-manager/index.js +326 -465
  201. package/dist/reconnection-manager/index.js.map +1 -1
  202. package/dist/recording-controller/enums.js +17 -0
  203. package/dist/recording-controller/enums.js.map +1 -0
  204. package/dist/recording-controller/index.js +343 -0
  205. package/dist/recording-controller/index.js.map +1 -0
  206. package/dist/recording-controller/util.js +63 -0
  207. package/dist/recording-controller/util.js.map +1 -0
  208. package/dist/roap/index.js +31 -75
  209. package/dist/roap/index.js.map +1 -1
  210. package/dist/roap/request.js +129 -136
  211. package/dist/roap/request.js.map +1 -1
  212. package/dist/roap/turnDiscovery.js +143 -103
  213. package/dist/roap/turnDiscovery.js.map +1 -1
  214. package/dist/statsAnalyzer/global.js +1 -95
  215. package/dist/statsAnalyzer/global.js.map +1 -1
  216. package/dist/statsAnalyzer/index.js +369 -461
  217. package/dist/statsAnalyzer/index.js.map +1 -1
  218. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  219. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  220. package/dist/transcription/index.js +13 -45
  221. package/dist/transcription/index.js.map +1 -1
  222. package/dist/types/annotation/annotation.types.d.ts +35 -0
  223. package/dist/types/annotation/constants.d.ts +31 -0
  224. package/dist/types/annotation/index.d.ts +124 -0
  225. package/dist/types/breakouts/breakout.d.ts +8 -0
  226. package/dist/types/breakouts/collection.d.ts +5 -0
  227. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  228. package/dist/types/breakouts/events.d.ts +2 -0
  229. package/dist/types/breakouts/index.d.ts +5 -0
  230. package/dist/types/breakouts/request.d.ts +22 -0
  231. package/dist/types/breakouts/utils.d.ts +15 -0
  232. package/dist/types/common/browser-detection.d.ts +9 -0
  233. package/dist/types/common/collection.d.ts +48 -0
  234. package/dist/types/common/config.d.ts +2 -0
  235. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  236. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  237. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  238. package/dist/types/common/errors/media.d.ts +15 -0
  239. package/dist/types/common/errors/parameter.d.ts +15 -0
  240. package/dist/types/common/errors/password-error.d.ts +15 -0
  241. package/dist/types/common/errors/permission.d.ts +14 -0
  242. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  243. package/dist/types/common/errors/reconnection.d.ts +15 -0
  244. package/dist/types/common/errors/stats.d.ts +15 -0
  245. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  246. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  247. package/dist/types/common/events/events-scope.d.ts +17 -0
  248. package/dist/types/common/events/events.d.ts +12 -0
  249. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  250. package/dist/types/common/events/util.d.ts +2 -0
  251. package/dist/types/common/logs/logger-config.d.ts +2 -0
  252. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  253. package/dist/types/common/logs/request.d.ts +34 -0
  254. package/dist/types/common/queue.d.ts +32 -0
  255. package/dist/types/config.d.ts +78 -0
  256. package/dist/types/constants.d.ts +993 -0
  257. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  258. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  259. package/dist/types/controls-options-manager/index.d.ts +136 -0
  260. package/dist/types/controls-options-manager/types.d.ts +43 -0
  261. package/dist/types/controls-options-manager/util.d.ts +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  264. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  265. package/dist/types/locus-info/fullState.d.ts +2 -0
  266. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  267. package/dist/types/locus-info/index.d.ts +315 -0
  268. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  269. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  270. package/dist/types/locus-info/parser.d.ts +212 -0
  271. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  272. package/dist/types/media/index.d.ts +34 -0
  273. package/dist/types/media/properties.d.ts +108 -0
  274. package/dist/types/media/util.d.ts +2 -0
  275. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  276. package/dist/types/meeting/in-meeting-actions.d.ts +147 -0
  277. package/dist/types/meeting/index.d.ts +1762 -0
  278. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  279. package/dist/types/meeting/muteState.d.ts +186 -0
  280. package/dist/types/meeting/request.d.ts +269 -0
  281. package/dist/types/meeting/request.type.d.ts +11 -0
  282. package/dist/types/meeting/state.d.ts +9 -0
  283. package/dist/types/meeting/util.d.ts +76 -0
  284. package/dist/types/meeting-info/collection.d.ts +20 -0
  285. package/dist/types/meeting-info/index.d.ts +57 -0
  286. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  287. package/dist/types/meeting-info/request.d.ts +22 -0
  288. package/dist/types/meeting-info/util.d.ts +2 -0
  289. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  290. package/dist/types/meetings/collection.d.ts +31 -0
  291. package/dist/types/meetings/index.d.ts +345 -0
  292. package/dist/types/meetings/request.d.ts +27 -0
  293. package/dist/types/meetings/util.d.ts +18 -0
  294. package/dist/types/member/index.d.ts +157 -0
  295. package/dist/types/member/types.d.ts +21 -0
  296. package/dist/types/member/util.d.ts +2 -0
  297. package/dist/types/members/collection.d.ts +29 -0
  298. package/dist/types/members/index.d.ts +353 -0
  299. package/dist/types/members/request.d.ts +114 -0
  300. package/dist/types/members/types.d.ts +24 -0
  301. package/dist/types/members/util.d.ts +210 -0
  302. package/dist/types/metrics/config.d.ts +195 -0
  303. package/dist/types/metrics/constants.d.ts +55 -0
  304. package/dist/types/metrics/index.d.ts +169 -0
  305. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  306. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  307. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  308. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  309. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  310. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  311. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  312. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  313. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  314. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  315. package/dist/types/reachability/index.d.ts +152 -0
  316. package/dist/types/reachability/request.d.ts +37 -0
  317. package/dist/types/reactions/constants.d.ts +3 -0
  318. package/dist/types/reactions/reactions.d.ts +4 -0
  319. package/dist/types/reactions/reactions.type.d.ts +52 -0
  320. package/dist/types/reconnection-manager/index.d.ts +126 -0
  321. package/dist/types/recording-controller/enums.d.ts +7 -0
  322. package/dist/types/recording-controller/index.d.ts +193 -0
  323. package/dist/types/recording-controller/util.d.ts +13 -0
  324. package/dist/types/roap/index.d.ts +77 -0
  325. package/dist/types/roap/request.d.ts +36 -0
  326. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  327. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  328. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  329. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  330. package/dist/types/transcription/index.d.ts +64 -0
  331. package/internal-README.md +7 -6
  332. package/package.json +28 -21
  333. package/src/annotation/annotation.types.ts +42 -0
  334. package/src/annotation/constants.ts +36 -0
  335. package/src/annotation/index.ts +339 -0
  336. package/src/breakouts/README.md +220 -0
  337. package/src/breakouts/breakout.ts +163 -0
  338. package/src/breakouts/collection.ts +19 -0
  339. package/src/breakouts/edit-lock-error.ts +25 -0
  340. package/src/breakouts/events.ts +37 -0
  341. package/src/breakouts/index.ts +860 -0
  342. package/src/breakouts/request.ts +55 -0
  343. package/src/breakouts/utils.ts +57 -0
  344. package/src/common/browser-detection.ts +9 -6
  345. package/src/common/collection.ts +3 -1
  346. package/src/common/errors/captcha-error.ts +6 -6
  347. package/src/common/errors/intent-to-join.ts +6 -6
  348. package/src/common/errors/join-meeting.ts +12 -8
  349. package/src/common/errors/media.ts +6 -6
  350. package/src/common/errors/parameter.ts +9 -6
  351. package/src/common/errors/password-error.ts +6 -6
  352. package/src/common/errors/permission.ts +5 -5
  353. package/src/common/errors/reconnection.ts +6 -6
  354. package/src/common/errors/stats.ts +6 -6
  355. package/src/common/errors/webex-errors.ts +7 -5
  356. package/src/common/errors/webex-meetings-error.ts +1 -1
  357. package/src/common/events/events-scope.ts +5 -1
  358. package/src/common/events/events.ts +5 -1
  359. package/src/common/events/trigger-proxy.ts +8 -3
  360. package/src/common/events/util.ts +1 -2
  361. package/src/common/logs/logger-proxy.ts +21 -10
  362. package/src/common/logs/request.ts +11 -8
  363. package/src/config.ts +16 -12
  364. package/src/constants.ts +153 -7
  365. package/src/controls-options-manager/constants.ts +5 -0
  366. package/src/controls-options-manager/enums.ts +18 -0
  367. package/src/controls-options-manager/index.ts +278 -0
  368. package/src/controls-options-manager/types.ts +59 -0
  369. package/src/controls-options-manager/util.ts +281 -0
  370. package/src/index.ts +33 -0
  371. package/src/locus-info/controlsUtils.ts +142 -24
  372. package/src/locus-info/fullState.ts +15 -11
  373. package/src/locus-info/hostUtils.ts +4 -3
  374. package/src/locus-info/index.ts +346 -55
  375. package/src/locus-info/infoUtils.ts +12 -4
  376. package/src/locus-info/mediaSharesUtils.ts +52 -4
  377. package/src/locus-info/parser.ts +46 -68
  378. package/src/locus-info/selfUtils.ts +195 -56
  379. package/src/media/index.ts +139 -196
  380. package/src/media/properties.ts +43 -36
  381. package/src/media/util.ts +1 -1
  382. package/src/mediaQualityMetrics/config.ts +380 -378
  383. package/src/meeting/in-meeting-actions.ts +159 -3
  384. package/src/meeting/index.ts +2803 -1584
  385. package/src/meeting/locusMediaRequest.ts +309 -0
  386. package/src/meeting/muteState.ts +290 -72
  387. package/src/meeting/request.ts +247 -178
  388. package/src/meeting/request.type.ts +13 -0
  389. package/src/meeting/state.ts +45 -30
  390. package/src/meeting/util.ts +445 -395
  391. package/src/meeting-info/collection.ts +2 -1
  392. package/src/meeting-info/index.ts +32 -30
  393. package/src/meeting-info/meeting-info-v2.ts +235 -116
  394. package/src/meeting-info/request.ts +9 -3
  395. package/src/meeting-info/util.ts +54 -46
  396. package/src/meeting-info/utilv2.ts +71 -55
  397. package/src/meetings/collection.ts +21 -1
  398. package/src/meetings/index.ts +772 -437
  399. package/src/meetings/request.ts +29 -25
  400. package/src/meetings/util.ts +132 -33
  401. package/src/member/index.ts +95 -49
  402. package/src/member/types.ts +24 -0
  403. package/src/member/util.ts +106 -13
  404. package/src/members/collection.ts +8 -1
  405. package/src/members/index.ts +288 -130
  406. package/src/members/request.ts +144 -31
  407. package/src/members/types.ts +28 -0
  408. package/src/members/util.ts +316 -235
  409. package/src/metrics/config.ts +302 -90
  410. package/src/metrics/constants.ts +2 -6
  411. package/src/metrics/index.ts +124 -95
  412. package/src/multistream/mediaRequestManager.ts +203 -45
  413. package/src/multistream/receiveSlot.ts +69 -26
  414. package/src/multistream/receiveSlotManager.ts +62 -38
  415. package/src/multistream/remoteMedia.ts +30 -4
  416. package/src/multistream/remoteMediaGroup.ts +4 -3
  417. package/src/multistream/remoteMediaManager.ts +230 -66
  418. package/src/networkQualityMonitor/index.ts +24 -27
  419. package/src/personal-meeting-room/index.ts +12 -16
  420. package/src/personal-meeting-room/request.ts +10 -3
  421. package/src/personal-meeting-room/util.ts +3 -3
  422. package/src/reachability/index.ts +131 -79
  423. package/src/reachability/request.ts +43 -34
  424. package/src/reactions/constants.ts +4 -0
  425. package/src/reactions/reactions.ts +8 -8
  426. package/src/reactions/reactions.type.ts +31 -5
  427. package/src/reconnection-manager/index.ts +193 -111
  428. package/src/recording-controller/enums.ts +8 -0
  429. package/src/recording-controller/index.ts +315 -0
  430. package/src/recording-controller/util.ts +58 -0
  431. package/src/roap/index.ts +53 -53
  432. package/src/roap/request.ts +77 -64
  433. package/src/roap/turnDiscovery.ts +101 -48
  434. package/src/statsAnalyzer/global.ts +8 -104
  435. package/src/statsAnalyzer/index.ts +624 -376
  436. package/src/statsAnalyzer/mqaUtil.ts +203 -90
  437. package/src/transcription/index.ts +34 -32
  438. package/test/integration/spec/converged-space-meetings.js +177 -0
  439. package/test/integration/spec/journey.js +670 -466
  440. package/test/integration/spec/space-meeting.js +320 -204
  441. package/test/integration/spec/transcription.js +7 -8
  442. package/test/unit/spec/annotation/index.ts +433 -0
  443. package/test/unit/spec/breakouts/breakout.ts +203 -0
  444. package/test/unit/spec/breakouts/collection.ts +15 -0
  445. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  446. package/test/unit/spec/breakouts/events.ts +77 -0
  447. package/test/unit/spec/breakouts/index.ts +1609 -0
  448. package/test/unit/spec/breakouts/request.ts +104 -0
  449. package/test/unit/spec/breakouts/utils.js +72 -0
  450. package/test/unit/spec/common/browser-detection.js +9 -28
  451. package/test/unit/spec/controls-options-manager/index.js +287 -0
  452. package/test/unit/spec/controls-options-manager/util.js +504 -0
  453. package/test/unit/spec/fixture/locus.js +93 -90
  454. package/test/unit/spec/locus-info/controlsUtils.js +305 -32
  455. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  456. package/test/unit/spec/locus-info/index.js +636 -5
  457. package/test/unit/spec/locus-info/infoUtils.js +26 -33
  458. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  459. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  460. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  461. package/test/unit/spec/locus-info/parser.js +3 -9
  462. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  463. package/test/unit/spec/locus-info/selfUtils.js +252 -12
  464. package/test/unit/spec/media/index.ts +104 -8
  465. package/test/unit/spec/media/properties.ts +9 -9
  466. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -3
  467. package/test/unit/spec/meeting/index.js +3112 -921
  468. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  469. package/test/unit/spec/meeting/muteState.js +421 -94
  470. package/test/unit/spec/meeting/request.js +421 -79
  471. package/test/unit/spec/meeting/utils.js +326 -189
  472. package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
  473. package/test/unit/spec/meeting-info/request.js +7 -9
  474. package/test/unit/spec/meeting-info/util.js +11 -12
  475. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  476. package/test/unit/spec/meetings/collection.js +15 -1
  477. package/test/unit/spec/meetings/index.js +1126 -328
  478. package/test/unit/spec/meetings/utils.js +220 -14
  479. package/test/unit/spec/member/index.js +24 -1
  480. package/test/unit/spec/member/util.js +383 -32
  481. package/test/unit/spec/members/index.js +424 -55
  482. package/test/unit/spec/members/request.js +228 -40
  483. package/test/unit/spec/members/utils.js +191 -4
  484. package/test/unit/spec/metrics/index.js +113 -20
  485. package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
  486. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  487. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  488. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  489. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  490. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
  491. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  492. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  493. package/test/unit/spec/reachability/index.ts +176 -27
  494. package/test/unit/spec/reachability/request.js +66 -0
  495. package/test/unit/spec/reconnection-manager/index.js +62 -31
  496. package/test/unit/spec/recording-controller/index.js +231 -0
  497. package/test/unit/spec/recording-controller/util.js +102 -0
  498. package/test/unit/spec/roap/index.ts +19 -49
  499. package/test/unit/spec/roap/request.ts +187 -0
  500. package/test/unit/spec/roap/turnDiscovery.ts +92 -50
  501. package/test/unit/spec/stats-analyzer/index.js +116 -60
  502. package/test/utils/cmr.js +44 -42
  503. package/test/utils/constants.js +9 -0
  504. package/test/utils/integrationTestUtils.js +64 -0
  505. package/test/utils/testUtils.js +63 -99
  506. package/test/utils/webex-config.js +22 -18
  507. package/test/utils/webex-test-users.js +57 -50
  508. package/tsconfig.json +6 -0
  509. package/dist/media/internal-media-core-wrapper.js +0 -22
  510. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  511. package/dist/meeting/effectsState.js +0 -334
  512. package/dist/meeting/effectsState.js.map +0 -1
  513. package/dist/multistream/multistreamMedia.js +0 -116
  514. package/dist/multistream/multistreamMedia.js.map +0 -1
  515. package/src/index.js +0 -15
  516. package/src/media/internal-media-core-wrapper.ts +0 -9
  517. package/src/meeting/effectsState.ts +0 -211
  518. package/src/multistream/multistreamMedia.ts +0 -92
  519. package/test/unit/spec/meeting/effectsState.js +0 -291
@@ -25,28 +25,34 @@ describe('TurnDiscovery', () => {
25
25
  sinon.stub(Metrics, 'sendBehavioralMetric');
26
26
 
27
27
  mockRoapRequest = {
28
- sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS})
28
+ sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS}),
29
29
  } as unknown as RoapRequest;
30
30
 
31
31
  testMeeting = {
32
32
  id: 'fake meeting id',
33
33
  config: {
34
34
  experimental: {
35
- enableTurnDiscovery: true
36
- }
35
+ enableTurnDiscovery: true,
36
+ },
37
37
  },
38
38
  correlationId: 'fake correlation id',
39
39
  selfUrl: 'fake self url',
40
40
  mediaId: 'fake media id',
41
41
  locusUrl: `https://locus-a.wbx2.com/locus/api/v1/loci/${FAKE_LOCUS_ID}`,
42
42
  roapSeq: -1,
43
- isAudioMuted: () => true,
44
- isVideoMuted: () => false,
43
+ audio:{
44
+ isLocallyMuted: () => true,
45
+ },
46
+ video:{
47
+ isLocallyMuted: () => false,
48
+ },
45
49
  setRoapSeq: sinon.fake((newSeq) => {
46
50
  testMeeting.roapSeq = newSeq;
47
51
  }),
48
52
  updateMediaConnections: sinon.stub(),
49
- webex: {meetings: {reachability: {isAnyClusterReachable: () => false}}}
53
+ webex: {meetings: {reachability: {isAnyClusterReachable: () => Promise.resolve(false)}}},
54
+ isMultistream: false,
55
+ locusMediaRequest: { fake: true },
50
56
  };
51
57
  });
52
58
 
@@ -55,7 +61,11 @@ describe('TurnDiscovery', () => {
55
61
  sinon.restore();
56
62
  });
57
63
 
58
- const checkRoapMessageSent = async (messageType, expectedSeq, expectedMediaId = testMeeting.mediaId) => {
64
+ const checkRoapMessageSent = async (
65
+ messageType,
66
+ expectedSeq,
67
+ expectedMediaId = testMeeting.mediaId
68
+ ) => {
59
69
  await testUtils.flushPromises();
60
70
 
61
71
  assert.calledOnce(mockRoapRequest.sendRoap);
@@ -65,12 +75,10 @@ describe('TurnDiscovery', () => {
65
75
  version: '2',
66
76
  seq: expectedSeq,
67
77
  },
68
- correlationId: testMeeting.correlationId,
69
78
  locusSelfUrl: testMeeting.selfUrl,
70
79
  mediaId: expectedMediaId,
71
- audioMuted: testMeeting.isAudioMuted(),
72
- videoMuted: testMeeting.isVideoMuted(),
73
- meetingId: testMeeting.id
80
+ meetingId: testMeeting.id,
81
+ locusMediaRequest: testMeeting.locusMediaRequest
74
82
  });
75
83
 
76
84
  if (messageType === 'TURN_DISCOVERY_REQUEST') {
@@ -93,39 +101,44 @@ describe('TurnDiscovery', () => {
93
101
  };
94
102
 
95
103
  describe('doTurnDiscovery', () => {
96
- it('sends TURN_DISCOVERY_REQUEST, waits for response and sends OK', async () => {
97
- const td = new TurnDiscovery(mockRoapRequest);
104
+ [false, true].forEach(function (enabledMultistream ) {
105
+ it('sends TURN_DISCOVERY_REQUEST'+ (enabledMultistream ? ' when enable Multistream':'') + ', waits for response and sends OK', async () => {
106
+ testMeeting.isMultistream = enabledMultistream;
98
107
 
99
- const result = td.doTurnDiscovery(testMeeting, false);
108
+ const td = new TurnDiscovery(mockRoapRequest);
100
109
 
101
- // check that TURN_DISCOVERY_REQUEST was sent
102
- await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
110
+ const result = td.doTurnDiscovery(testMeeting, false);
103
111
 
104
- mockRoapRequest.sendRoap.resetHistory();
112
+ // check that TURN_DISCOVERY_REQUEST was sent
113
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
105
114
 
106
- // simulate the response
107
- td.handleTurnDiscoveryResponse({
108
- headers: [
109
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
110
- `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
111
- `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
112
- ]
113
- });
115
+ // @ts-ignore
116
+ mockRoapRequest.sendRoap.resetHistory();
114
117
 
115
- await testUtils.flushPromises();
118
+ // simulate the response
119
+ td.handleTurnDiscoveryResponse({
120
+ headers: [
121
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
122
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
123
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
124
+ ]
125
+ });
116
126
 
117
- // check that we've sent OK
118
- await checkRoapMessageSent('OK', 0);
127
+ await testUtils.flushPromises();
119
128
 
120
- const {turnServerInfo, turnDiscoverySkippedReason} = await result;
129
+ // check that we've sent OK
130
+ await checkRoapMessageSent('OK', 0);
121
131
 
122
- assert.deepEqual(turnServerInfo, {
123
- url: FAKE_TURN_URL,
124
- username: FAKE_TURN_USERNAME,
125
- password: FAKE_TURN_PASSWORD
126
- });
132
+ const {turnServerInfo, turnDiscoverySkippedReason} = await result;
127
133
 
128
- assert.isUndefined(turnDiscoverySkippedReason);
134
+ assert.deepEqual(turnServerInfo, {
135
+ url: FAKE_TURN_URL,
136
+ username: FAKE_TURN_USERNAME,
137
+ password: FAKE_TURN_PASSWORD
138
+ });
139
+
140
+ assert.isUndefined(turnDiscoverySkippedReason);
141
+ });
129
142
  });
130
143
 
131
144
  it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
@@ -137,6 +150,7 @@ describe('TurnDiscovery', () => {
137
150
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0, '');
138
151
 
139
152
  // the main part of the test is complete now, checking the remaining part of the flow just for completeness
153
+ // @ts-ignore
140
154
  mockRoapRequest.sendRoap.resetHistory();
141
155
 
142
156
  // simulate the response
@@ -145,7 +159,7 @@ describe('TurnDiscovery', () => {
145
159
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
146
160
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
147
161
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
148
- ]
162
+ ],
149
163
  });
150
164
 
151
165
  await testUtils.flushPromises();
@@ -158,7 +172,7 @@ describe('TurnDiscovery', () => {
158
172
  assert.deepEqual(turnServerInfo, {
159
173
  url: FAKE_TURN_URL,
160
174
  username: FAKE_TURN_USERNAME,
161
- password: FAKE_TURN_PASSWORD
175
+ password: FAKE_TURN_PASSWORD,
162
176
  });
163
177
  assert.isUndefined(turnDiscoverySkippedReason);
164
178
  });
@@ -169,7 +183,7 @@ describe('TurnDiscovery', () => {
169
183
 
170
184
  // check that TURN_DISCOVERY_REQUEST was sent
171
185
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
172
-
186
+ // @ts-ignore
173
187
  mockRoapRequest.sendRoap.resetHistory();
174
188
 
175
189
  // simulate the response with some extra headers
@@ -181,7 +195,7 @@ describe('TurnDiscovery', () => {
181
195
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
182
196
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
183
197
  'another-header-at-the-end=12345',
184
- ]
198
+ ],
185
199
  });
186
200
 
187
201
  await testUtils.flushPromises();
@@ -193,7 +207,7 @@ describe('TurnDiscovery', () => {
193
207
  assert.deepEqual(turnServerInfo, {
194
208
  url: FAKE_TURN_URL,
195
209
  username: FAKE_TURN_USERNAME,
196
- password: FAKE_TURN_PASSWORD
210
+ password: FAKE_TURN_PASSWORD,
197
211
  });
198
212
  assert.isUndefined(turnDiscoverySkippedReason);
199
213
  });
@@ -202,7 +216,7 @@ describe('TurnDiscovery', () => {
202
216
  const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
203
217
 
204
218
  testMeeting.config.experimental.enableTurnDiscovery = false;
205
-
219
+ // @ts-ignore
206
220
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
207
221
 
208
222
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -232,7 +246,7 @@ describe('TurnDiscovery', () => {
232
246
 
233
247
  it('resolves with undefined when cluster is reachable', async () => {
234
248
  const prev = testMeeting.webex.meetings.reachability.isAnyClusterReachable;
235
- testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => true;
249
+ testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => Promise.resolve(true);
236
250
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
237
251
 
238
252
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -242,10 +256,9 @@ describe('TurnDiscovery', () => {
242
256
  assert.notCalled(mockRoapRequest.sendRoap);
243
257
  assert.notCalled(Metrics.sendBehavioralMetric);
244
258
  testMeeting.webex.meetings.reachability.isAnyClusterReachable = prev;
245
-
246
259
  });
247
260
 
248
- it('resolves with undefined if we don\'t get a response within 10s', async () => {
261
+ it("resolves with undefined if we don't get a response within 10s", async () => {
249
262
  const td = new TurnDiscovery(mockRoapRequest);
250
263
 
251
264
  const promise = td.doTurnDiscovery(testMeeting, false);
@@ -264,12 +277,14 @@ describe('TurnDiscovery', () => {
264
277
  const td = new TurnDiscovery(mockRoapRequest);
265
278
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
266
279
 
280
+ await testUtils.flushPromises();
281
+
267
282
  // simulate the response without the password
268
283
  td.handleTurnDiscoveryResponse({
269
284
  headers: [
270
285
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
271
286
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
272
- ]
287
+ ],
273
288
  });
274
289
  await testUtils.flushPromises();
275
290
  const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
@@ -283,6 +298,8 @@ describe('TurnDiscovery', () => {
283
298
  const td = new TurnDiscovery(mockRoapRequest);
284
299
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
285
300
 
301
+ await testUtils.flushPromises();
302
+
286
303
  // simulate the response without the headers
287
304
  td.handleTurnDiscoveryResponse({});
288
305
 
@@ -298,11 +315,13 @@ describe('TurnDiscovery', () => {
298
315
  const td = new TurnDiscovery(mockRoapRequest);
299
316
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
300
317
 
318
+ await testUtils.flushPromises();
319
+
301
320
  // simulate the response without the headers
302
321
  td.handleTurnDiscoveryResponse({headers: []});
303
322
 
304
323
  await testUtils.flushPromises();
305
- const {turnServerInfo, turnDiscoverySkippedReason}= await turnDiscoveryPromise;
324
+ const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
306
325
 
307
326
  assert.isUndefined(turnServerInfo);
308
327
  assert.isUndefined(turnDiscoverySkippedReason);
@@ -314,9 +333,11 @@ describe('TurnDiscovery', () => {
314
333
 
315
334
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
316
335
 
336
+ await testUtils.flushPromises();
337
+
317
338
  // check that TURN_DISCOVERY_REQUEST was sent
318
339
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
319
-
340
+ // @ts-ignore
320
341
  mockRoapRequest.sendRoap.resetHistory();
321
342
 
322
343
  // setup the mock so that sending of OK fails
@@ -328,7 +349,7 @@ describe('TurnDiscovery', () => {
328
349
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
329
350
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
330
351
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
331
- ]
352
+ ],
332
353
  });
333
354
 
334
355
  await testUtils.flushPromises();
@@ -344,8 +365,29 @@ describe('TurnDiscovery', () => {
344
365
  });
345
366
  });
346
367
 
368
+ describe('isSkipped', () => {
369
+ [
370
+ {enabledInConfig: true, isAnyClusterReachable: true, expectedIsSkipped: true},
371
+ {enabledInConfig: true, isAnyClusterReachable: false, expectedIsSkipped: false},
372
+ {enabledInConfig: false, isAnyClusterReachable: true, expectedIsSkipped: true},
373
+ {enabledInConfig: false, isAnyClusterReachable: false, expectedIsSkipped: true},
374
+ ].forEach(({enabledInConfig, isAnyClusterReachable, expectedIsSkipped}) => {
375
+ it(`returns ${expectedIsSkipped} when TURN discovery is ${enabledInConfig ? '' : 'not '} enabled in config and isAnyClusterReachable() returns ${isAnyClusterReachable ? 'true' : 'false'}`, async () => {
376
+ testMeeting.config.experimental.enableTurnDiscovery = enabledInConfig;
377
+
378
+ sinon.stub(testMeeting.webex.meetings.reachability, 'isAnyClusterReachable').resolves(isAnyClusterReachable);
379
+
380
+ const td = new TurnDiscovery(mockRoapRequest);
381
+
382
+ const isSkipped = await td.isSkipped(testMeeting);
383
+
384
+ assert.equal(isSkipped, expectedIsSkipped);
385
+ })
386
+ })
387
+ })
388
+
347
389
  describe('handleTurnDiscoveryResponse', () => {
348
- it('doesn\'t do anything if turn discovery was not started', () => {
390
+ it("doesn't do anything if turn discovery was not started", () => {
349
391
  const td = new TurnDiscovery(mockRoapRequest);
350
392
 
351
393
  // there is not much we can check, but we mainly want to make
@@ -355,7 +397,7 @@ describe('TurnDiscovery', () => {
355
397
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
356
398
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
357
399
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
358
- ]
400
+ ],
359
401
  });
360
402
 
361
403
  assert.notCalled(mockRoapRequest.sendRoap);
@@ -2,7 +2,7 @@ import 'jsdom-global/register';
2
2
  import chai from 'chai';
3
3
  import chaiAsPromised from 'chai-as-promised';
4
4
  import sinon from 'sinon';
5
- import {MediaConnection as MC} from '@webex/internal-media-core';
5
+ import {ConnectionState} from '@webex/internal-media-core';
6
6
 
7
7
  import {StatsAnalyzer, EVENTS} from '../../../../src/statsAnalyzer';
8
8
  import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
@@ -20,31 +20,32 @@ describe('plugin-meetings', () => {
20
20
  let sandBoxSpy;
21
21
 
22
22
  const initialConfig = {
23
- videoPacketLossRatioThreshold: 9
23
+ videoPacketLossRatioThreshold: 9,
24
24
  };
25
25
 
26
26
  const defaultStats = {
27
+ resolutions: {},
27
28
  internal: {
28
- video: {
29
+ 'video-send-1': {
29
30
  send: {
30
- totalPacketsLostOnReceiver: 10
31
- }
32
- }
31
+ totalPacketsLostOnReceiver: 10,
32
+ },
33
+ },
33
34
  },
34
- video: {
35
+ 'video-send-1': {
35
36
  send: {
36
37
  packetsSent: 2,
37
38
  meanRemoteJitter: [],
38
- meanRoundTripTime: []
39
- }
40
- }
39
+ meanRoundTripTime: [],
40
+ },
41
+ },
41
42
  };
42
43
 
43
44
  const statusResult = {
44
45
  type: 'remote-inbound-rtp',
45
46
  packetsLost: 11,
46
47
  rttThreshold: 501,
47
- jitterThreshold: 501
48
+ jitterThreshold: 501,
48
49
  };
49
50
 
50
51
  const sandbox = sinon.createSandbox();
@@ -52,9 +53,17 @@ describe('plugin-meetings', () => {
52
53
  beforeEach(() => {
53
54
  const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
54
55
 
55
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor, defaultStats);
56
-
57
- sandBoxSpy = sandbox.spy(statsAnalyzer.networkQualityMonitor, 'determineUplinkNetworkQuality');
56
+ statsAnalyzer = new StatsAnalyzer(
57
+ initialConfig,
58
+ () => ({}),
59
+ networkQualityMonitor,
60
+ defaultStats
61
+ );
62
+
63
+ sandBoxSpy = sandbox.spy(
64
+ statsAnalyzer.networkQualityMonitor,
65
+ 'determineUplinkNetworkQuality'
66
+ );
58
67
  });
59
68
 
60
69
  afterEach(() => {
@@ -62,14 +71,16 @@ describe('plugin-meetings', () => {
62
71
  });
63
72
 
64
73
  it('should trigger determineUplinkNetworkQuality with specific arguments', async () => {
65
- await statsAnalyzer.parseGetStatsResult(statusResult, 'video');
74
+ await statsAnalyzer.parseGetStatsResult(statusResult, 'video-send-1', true);
66
75
 
67
76
  assert.calledOnce(statsAnalyzer.networkQualityMonitor.determineUplinkNetworkQuality);
68
- assert(sandBoxSpy.calledWith({
69
- mediaType: 'video',
70
- remoteRtpResults: statusResult,
71
- statsAnalyzerCurrentStats: statsAnalyzer.statsResults
72
- }));
77
+ assert(
78
+ sandBoxSpy.calledWith({
79
+ mediaType: 'video-send-1',
80
+ remoteRtpResults: statusResult,
81
+ statsAnalyzerCurrentStats: statsAnalyzer.statsResults,
82
+ })
83
+ );
73
84
  });
74
85
  });
75
86
 
@@ -78,6 +89,7 @@ describe('plugin-meetings', () => {
78
89
  let pc;
79
90
  let networkQualityMonitor;
80
91
  let statsAnalyzer;
92
+ let mqeData;
81
93
 
82
94
  let receivedEventsData = {
83
95
  local: {},
@@ -105,57 +117,83 @@ describe('plugin-meetings', () => {
105
117
  // bytesReceived and bytesSent need to be non-zero in order for StatsAnalyzer to parse any other values
106
118
  fakeStats = {
107
119
  audio: {
108
- receiver: {
109
- type: 'inbound-rtp',
110
- packetsReceived: 0,
111
- bytesReceived: 1,
112
- },
113
- sender: {
114
- type: 'outbound-rtp',
115
- packetsSent: 0,
116
- bytesSent: 1,
117
- }
120
+ senders: [
121
+ {
122
+ report: [
123
+ {
124
+ type: 'outbound-rtp',
125
+ packetsSent: 0,
126
+ bytesSent: 1,
127
+ },
128
+ ],
129
+ },
130
+ ],
131
+ receivers: [
132
+ {
133
+ report: [
134
+ {
135
+ type: 'inbound-rtp',
136
+ packetsReceived: 0,
137
+ bytesReceived: 1,
138
+ },
139
+ ],
140
+ },
141
+ ],
118
142
  },
119
143
  video: {
120
- receiver: {
121
- type: 'inbound-rtp',
122
- framesDecoded: 0,
123
- bytesReceived: 1,
124
- },
125
- sender: {
126
- type: 'outbound-rtp',
127
- framesSent: 0,
128
- bytesSent: 1,
129
- }
130
- }
144
+ senders: [
145
+ {
146
+ report: [
147
+ {
148
+ type: 'outbound-rtp',
149
+ framesSent: 0,
150
+ bytesSent: 1,
151
+ },
152
+ ],
153
+ },
154
+ ],
155
+ receivers: [
156
+ {
157
+ report: [
158
+ {
159
+ type: 'inbound-rtp',
160
+ framesDecoded: 0,
161
+ bytesReceived: 1,
162
+ frameHeight: 720,
163
+ frameWidth: 1280,
164
+ framesReceived: 1,
165
+ },
166
+ ],
167
+ },
168
+ ],
169
+ },
131
170
  };
132
171
 
133
172
  pc = {
134
- getConnectionState: sinon.stub().returns(MC.ConnectionState.Connected),
173
+ getConnectionState: sinon.stub().returns(ConnectionState.Connected),
135
174
  getTransceiverStats: sinon.stub().resolves({
136
175
  audio: {
137
- sender: [fakeStats.audio.sender],
138
- receiver: [fakeStats.audio.receiver],
139
- currentDirection: 'sendrecv',
140
- localTrackLabel: 'fake mic',
176
+ senders: [fakeStats.audio.senders[0]],
177
+ receivers: [fakeStats.audio.receivers[0]],
141
178
  },
142
179
  video: {
143
- sender: [fakeStats.video.sender],
144
- receiver: [fakeStats.video.receiver],
145
- currentDirection: 'sendrecv',
146
- localTrackLabel: 'fake camera',
180
+ senders: [fakeStats.video.senders[0]],
181
+ receivers: [fakeStats.video.receivers[0]],
182
+ },
183
+ screenShareAudio: {
184
+ senders: [],
185
+ receivers: [],
147
186
  },
148
187
  screenShareVideo: {
149
- sender: [],
150
- receiver: [],
151
- currentDirection: 'sendrecv'
152
- }
153
- })
188
+ senders: [],
189
+ receivers: [],
190
+ },
191
+ }),
154
192
  };
155
193
 
156
194
  networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
157
195
 
158
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor);
196
+ statsAnalyzer = new StatsAnalyzer(initialConfig, () => ({}), networkQualityMonitor);
159
197
 
160
198
  statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STARTED, (data) => {
161
199
  receivedEventsData.local.started = data;
@@ -169,6 +207,9 @@ describe('plugin-meetings', () => {
169
207
  statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
170
208
  receivedEventsData.remote.stopped = data;
171
209
  });
210
+ statsAnalyzer.on(EVENTS.MEDIA_QUALITY, ({data}) => {
211
+ mqeData = data;
212
+ });
172
213
  });
173
214
 
174
215
  afterEach(() => {
@@ -195,6 +236,12 @@ describe('plugin-meetings', () => {
195
236
  assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
196
237
  };
197
238
 
239
+ const checkMqeData = () => {
240
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedFrameSize, 3600);
241
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedHeight, 720);
242
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedWidth, 1280);
243
+ };
244
+
198
245
  it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
199
246
  await startStatsAnalyzer({expected: {sendAudio: true}});
200
247
 
@@ -202,7 +249,7 @@ describe('plugin-meetings', () => {
202
249
  checkReceivedEvent({expected: {}});
203
250
 
204
251
  // setup a mock to return some values higher the previous ones
205
- fakeStats.audio.sender.packetsSent += 10;
252
+ fakeStats.audio.senders[0].report[0].packetsSent += 10;
206
253
 
207
254
  await progressTime();
208
255
 
@@ -222,7 +269,7 @@ describe('plugin-meetings', () => {
222
269
  checkReceivedEvent({expected: {}});
223
270
 
224
271
  // setup a mock to return some values higher the previous ones
225
- fakeStats.video.sender.framesSent += 1;
272
+ fakeStats.video.senders[0].report[0].framesSent += 1;
226
273
 
227
274
  await progressTime();
228
275
 
@@ -242,7 +289,7 @@ describe('plugin-meetings', () => {
242
289
  checkReceivedEvent({expected: {}});
243
290
 
244
291
  // setup a mock to return some values higher the previous ones
245
- fakeStats.audio.receiver.packetsReceived += 5;
292
+ fakeStats.audio.receivers[0].report[0].packetsReceived += 5;
246
293
 
247
294
  await progressTime();
248
295
  // check that we got the REMOTE_MEDIA_STARTED event for audio
@@ -262,7 +309,7 @@ describe('plugin-meetings', () => {
262
309
  checkReceivedEvent({expected: {}});
263
310
 
264
311
  // setup a mock to return some values higher the previous ones
265
- fakeStats.video.receiver.framesDecoded += 1;
312
+ fakeStats.video.receivers[0].report[0].framesDecoded += 1;
266
313
 
267
314
  await progressTime();
268
315
  // check that we got the REMOTE_MEDIA_STARTED event for video
@@ -274,6 +321,15 @@ describe('plugin-meetings', () => {
274
321
 
275
322
  checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
276
323
  });
324
+
325
+ it('emits the correct MEDIA_QUALITY events', async () => {
326
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
327
+
328
+ await progressTime();
329
+
330
+ // Check that the mqe data has been emitted and is correctly computed.
331
+ checkMqeData();
332
+ });
277
333
  });
278
334
  });
279
335
  });