@webex/plugin-meetings 2.60.0 → 2.60.1-next.2

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 (535) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.d.ts +42 -0
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.d.ts +31 -0
  6. package/dist/annotation/constants.js +41 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.d.ts +117 -0
  9. package/dist/annotation/index.js +357 -0
  10. package/dist/annotation/index.js.map +1 -0
  11. package/dist/breakouts/breakout.d.ts +8 -0
  12. package/dist/breakouts/breakout.js +215 -0
  13. package/dist/breakouts/breakout.js.map +1 -0
  14. package/dist/breakouts/collection.d.ts +5 -0
  15. package/dist/breakouts/collection.js +22 -0
  16. package/dist/breakouts/collection.js.map +1 -0
  17. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  18. package/dist/breakouts/edit-lock-error.js +51 -0
  19. package/dist/breakouts/edit-lock-error.js.map +1 -0
  20. package/dist/breakouts/events.d.ts +8 -0
  21. package/dist/breakouts/events.js +44 -0
  22. package/dist/breakouts/events.js.map +1 -0
  23. package/dist/breakouts/index.d.ts +5 -0
  24. package/dist/breakouts/index.js +1047 -0
  25. package/dist/breakouts/index.js.map +1 -0
  26. package/dist/breakouts/request.d.ts +22 -0
  27. package/dist/breakouts/request.js +77 -0
  28. package/dist/breakouts/request.js.map +1 -0
  29. package/dist/breakouts/utils.d.ts +15 -0
  30. package/dist/breakouts/utils.js +64 -0
  31. package/dist/breakouts/utils.js.map +1 -0
  32. package/dist/common/browser-detection.js +2 -3
  33. package/dist/common/browser-detection.js.map +1 -1
  34. package/dist/common/collection.js +3 -4
  35. package/dist/common/collection.js.map +1 -1
  36. package/dist/common/config.js +1 -2
  37. package/dist/common/config.js.map +1 -1
  38. package/dist/common/errors/captcha-error.js +1 -2
  39. package/dist/common/errors/captcha-error.js.map +1 -1
  40. package/dist/common/errors/intent-to-join.js +1 -2
  41. package/dist/common/errors/intent-to-join.js.map +1 -1
  42. package/dist/common/errors/join-meeting.js +1 -2
  43. package/dist/common/errors/join-meeting.js.map +1 -1
  44. package/dist/common/errors/media.js +1 -2
  45. package/dist/common/errors/media.js.map +1 -1
  46. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  47. package/dist/common/errors/no-meeting-info.js +50 -0
  48. package/dist/common/errors/no-meeting-info.js.map +1 -0
  49. package/dist/common/errors/parameter.js +3 -4
  50. package/dist/common/errors/parameter.js.map +1 -1
  51. package/dist/common/errors/password-error.js +1 -2
  52. package/dist/common/errors/password-error.js.map +1 -1
  53. package/dist/common/errors/permission.js +1 -2
  54. package/dist/common/errors/permission.js.map +1 -1
  55. package/dist/common/errors/{reclaim-host-role-error.js → reclaim-host-role-errors.js} +7 -11
  56. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  57. package/dist/common/errors/reconnection-in-progress.js +1 -2
  58. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  59. package/dist/common/errors/reconnection.js +1 -2
  60. package/dist/common/errors/reconnection.js.map +1 -1
  61. package/dist/common/errors/stats.js +1 -2
  62. package/dist/common/errors/stats.js.map +1 -1
  63. package/dist/common/errors/webex-errors.d.ts +20 -8
  64. package/dist/common/errors/webex-errors.js +48 -28
  65. package/dist/common/errors/webex-errors.js.map +1 -1
  66. package/dist/common/errors/webex-meetings-error.js +1 -2
  67. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  68. package/dist/common/events/events-scope.js +1 -2
  69. package/dist/common/events/events-scope.js.map +1 -1
  70. package/dist/common/events/events.js +1 -2
  71. package/dist/common/events/events.js.map +1 -1
  72. package/dist/common/events/trigger-proxy.js +1 -2
  73. package/dist/common/events/trigger-proxy.js.map +1 -1
  74. package/dist/common/events/util.js +1 -2
  75. package/dist/common/events/util.js.map +1 -1
  76. package/dist/common/logs/logger-config.js +1 -2
  77. package/dist/common/logs/logger-config.js.map +1 -1
  78. package/dist/common/logs/logger-proxy.js +2 -3
  79. package/dist/common/logs/logger-proxy.js.map +1 -1
  80. package/dist/common/logs/request.d.ts +3 -1
  81. package/dist/common/logs/request.js +8 -5
  82. package/dist/common/logs/request.js.map +1 -1
  83. package/dist/common/queue.d.ts +9 -7
  84. package/dist/common/queue.js +22 -9
  85. package/dist/common/queue.js.map +1 -1
  86. package/dist/config.d.ts +6 -7
  87. package/dist/config.js +8 -10
  88. package/dist/config.js.map +1 -1
  89. package/dist/constants.d.ts +217 -97
  90. package/dist/constants.js +416 -441
  91. package/dist/constants.js.map +1 -1
  92. package/dist/controls-options-manager/constants.js +3 -6
  93. package/dist/controls-options-manager/constants.js.map +1 -1
  94. package/dist/controls-options-manager/enums.d.ts +11 -1
  95. package/dist/controls-options-manager/enums.js +15 -6
  96. package/dist/controls-options-manager/enums.js.map +1 -1
  97. package/dist/controls-options-manager/index.d.ts +17 -1
  98. package/dist/controls-options-manager/index.js +127 -38
  99. package/dist/controls-options-manager/index.js.map +1 -1
  100. package/dist/controls-options-manager/types.d.ts +43 -0
  101. package/dist/controls-options-manager/types.js +7 -0
  102. package/dist/controls-options-manager/types.js.map +1 -0
  103. package/dist/controls-options-manager/util.d.ts +1 -7
  104. package/dist/controls-options-manager/util.js +309 -19
  105. package/dist/controls-options-manager/util.js.map +1 -1
  106. package/dist/index.d.ts +6 -3
  107. package/dist/index.js +121 -5
  108. package/dist/index.js.map +1 -1
  109. package/dist/interceptors/index.d.ts +2 -0
  110. package/dist/interceptors/index.js +15 -0
  111. package/dist/interceptors/index.js.map +1 -0
  112. package/dist/interceptors/locusRetry.d.ts +27 -0
  113. package/dist/interceptors/locusRetry.js +94 -0
  114. package/dist/interceptors/locusRetry.js.map +1 -0
  115. package/dist/interpretation/collection.d.ts +5 -0
  116. package/dist/interpretation/collection.js +22 -0
  117. package/dist/interpretation/collection.js.map +1 -0
  118. package/dist/interpretation/index.d.ts +5 -0
  119. package/dist/interpretation/index.js +365 -0
  120. package/dist/interpretation/index.js.map +1 -0
  121. package/dist/interpretation/siLanguage.d.ts +5 -0
  122. package/dist/interpretation/siLanguage.js +24 -0
  123. package/dist/interpretation/siLanguage.js.map +1 -0
  124. package/dist/locus-info/controlsUtils.js +100 -11
  125. package/dist/locus-info/controlsUtils.js.map +1 -1
  126. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  127. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  128. package/dist/locus-info/fullState.js +1 -2
  129. package/dist/locus-info/fullState.js.map +1 -1
  130. package/dist/locus-info/hostUtils.js +1 -2
  131. package/dist/locus-info/hostUtils.js.map +1 -1
  132. package/dist/locus-info/index.d.ts +57 -4
  133. package/dist/locus-info/index.js +425 -84
  134. package/dist/locus-info/index.js.map +1 -1
  135. package/dist/locus-info/infoUtils.js +13 -5
  136. package/dist/locus-info/infoUtils.js.map +1 -1
  137. package/dist/locus-info/mediaSharesUtils.js +58 -3
  138. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  139. package/dist/locus-info/parser.d.ts +66 -6
  140. package/dist/locus-info/parser.js +253 -80
  141. package/dist/locus-info/parser.js.map +1 -1
  142. package/dist/locus-info/selfUtils.js +97 -13
  143. package/dist/locus-info/selfUtils.js.map +1 -1
  144. package/dist/media/index.d.ts +2 -0
  145. package/dist/media/index.js +107 -319
  146. package/dist/media/index.js.map +1 -1
  147. package/dist/media/properties.d.ts +38 -53
  148. package/dist/media/properties.js +96 -153
  149. package/dist/media/properties.js.map +1 -1
  150. package/dist/media/util.js +1 -22
  151. package/dist/media/util.js.map +1 -1
  152. package/dist/mediaQualityMetrics/config.d.ts +234 -230
  153. package/dist/mediaQualityMetrics/config.js +302 -498
  154. package/dist/mediaQualityMetrics/config.js.map +1 -1
  155. package/dist/meeting/in-meeting-actions.d.ts +88 -0
  156. package/dist/meeting/in-meeting-actions.js +94 -3
  157. package/dist/meeting/in-meeting-actions.js.map +1 -1
  158. package/dist/meeting/index.d.ts +591 -494
  159. package/dist/meeting/index.js +4732 -2990
  160. package/dist/meeting/index.js.map +1 -1
  161. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  162. package/dist/meeting/locusMediaRequest.js +291 -0
  163. package/dist/meeting/locusMediaRequest.js.map +1 -0
  164. package/dist/meeting/muteState.d.ts +93 -25
  165. package/dist/meeting/muteState.js +224 -133
  166. package/dist/meeting/muteState.js.map +1 -1
  167. package/dist/meeting/request.d.ts +82 -47
  168. package/dist/meeting/request.js +297 -199
  169. package/dist/meeting/request.js.map +1 -1
  170. package/dist/meeting/request.type.d.ts +11 -0
  171. package/dist/meeting/request.type.js +7 -0
  172. package/dist/meeting/request.type.js.map +1 -0
  173. package/dist/meeting/state.js +1 -2
  174. package/dist/meeting/state.js.map +1 -1
  175. package/dist/meeting/util.d.ts +102 -1
  176. package/dist/meeting/util.js +605 -435
  177. package/dist/meeting/util.js.map +1 -1
  178. package/dist/meeting-info/collection.js +3 -4
  179. package/dist/meeting-info/collection.js.map +1 -1
  180. package/dist/meeting-info/index.d.ts +13 -1
  181. package/dist/meeting-info/index.js +74 -7
  182. package/dist/meeting-info/index.js.map +1 -1
  183. package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
  184. package/dist/meeting-info/meeting-info-v2.js +200 -63
  185. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  186. package/dist/meeting-info/request.js +1 -2
  187. package/dist/meeting-info/request.js.map +1 -1
  188. package/dist/meeting-info/util.js +2 -3
  189. package/dist/meeting-info/util.js.map +1 -1
  190. package/dist/meeting-info/utilv2.js +39 -41
  191. package/dist/meeting-info/utilv2.js.map +1 -1
  192. package/dist/meetings/collection.d.ts +17 -0
  193. package/dist/meetings/collection.js +42 -4
  194. package/dist/meetings/collection.js.map +1 -1
  195. package/dist/meetings/index.d.ts +93 -21
  196. package/dist/meetings/index.js +490 -127
  197. package/dist/meetings/index.js.map +1 -1
  198. package/dist/meetings/meetings.types.d.ts +4 -0
  199. package/dist/meetings/meetings.types.js +7 -0
  200. package/dist/meetings/meetings.types.js.map +1 -0
  201. package/dist/meetings/request.js +4 -3
  202. package/dist/meetings/request.js.map +1 -1
  203. package/dist/meetings/util.js +107 -6
  204. package/dist/meetings/util.js.map +1 -1
  205. package/dist/member/index.d.ts +13 -1
  206. package/dist/member/index.js +45 -2
  207. package/dist/member/index.js.map +1 -1
  208. package/dist/member/member.types.js +3 -4
  209. package/dist/member/member.types.js.map +1 -1
  210. package/dist/member/types.d.ts +32 -0
  211. package/dist/member/types.js +23 -0
  212. package/dist/member/types.js.map +1 -0
  213. package/dist/member/util.js +120 -29
  214. package/dist/member/util.js.map +1 -1
  215. package/dist/members/collection.d.ts +5 -0
  216. package/dist/members/collection.js +11 -2
  217. package/dist/members/collection.js.map +1 -1
  218. package/dist/members/index.d.ts +56 -11
  219. package/dist/members/index.js +174 -47
  220. package/dist/members/index.js.map +1 -1
  221. package/dist/members/request.d.ts +67 -11
  222. package/dist/members/request.js +102 -54
  223. package/dist/members/request.js.map +1 -1
  224. package/dist/members/types.js +3 -4
  225. package/dist/members/types.js.map +1 -1
  226. package/dist/members/util.d.ts +214 -1
  227. package/dist/members/util.js +327 -284
  228. package/dist/members/util.js.map +1 -1
  229. package/dist/metrics/constants.d.ts +15 -6
  230. package/dist/metrics/constants.js +17 -9
  231. package/dist/metrics/constants.js.map +1 -1
  232. package/dist/metrics/index.d.ts +4 -111
  233. package/dist/metrics/index.js +4 -452
  234. package/dist/metrics/index.js.map +1 -1
  235. package/dist/multistream/mediaRequestManager.d.ts +118 -0
  236. package/dist/multistream/mediaRequestManager.js +344 -0
  237. package/dist/multistream/mediaRequestManager.js.map +1 -0
  238. package/dist/multistream/receiveSlot.d.ts +68 -0
  239. package/dist/multistream/receiveSlot.js +200 -0
  240. package/dist/multistream/receiveSlot.js.map +1 -0
  241. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  242. package/dist/multistream/receiveSlotManager.js +174 -0
  243. package/dist/multistream/receiveSlotManager.js.map +1 -0
  244. package/dist/multistream/remoteMedia.d.ts +72 -0
  245. package/dist/multistream/remoteMedia.js +268 -0
  246. package/dist/multistream/remoteMedia.js.map +1 -0
  247. package/dist/multistream/remoteMediaGroup.d.ts +47 -0
  248. package/dist/multistream/remoteMediaGroup.js +267 -0
  249. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  250. package/dist/multistream/remoteMediaManager.d.ts +285 -0
  251. package/dist/multistream/remoteMediaManager.js +1211 -0
  252. package/dist/multistream/remoteMediaManager.js.map +1 -0
  253. package/dist/multistream/sendSlotManager.d.ts +61 -0
  254. package/dist/multistream/sendSlotManager.js +236 -0
  255. package/dist/multistream/sendSlotManager.js.map +1 -0
  256. package/dist/networkQualityMonitor/index.js +5 -4
  257. package/dist/networkQualityMonitor/index.js.map +1 -1
  258. package/dist/personal-meeting-room/index.js +2 -3
  259. package/dist/personal-meeting-room/index.js.map +1 -1
  260. package/dist/personal-meeting-room/request.js +2 -3
  261. package/dist/personal-meeting-room/request.js.map +1 -1
  262. package/dist/personal-meeting-room/util.js +1 -2
  263. package/dist/personal-meeting-room/util.js.map +1 -1
  264. package/dist/reachability/clusterReachability.d.ts +109 -0
  265. package/dist/reachability/clusterReachability.js +357 -0
  266. package/dist/reachability/clusterReachability.js.map +1 -0
  267. package/dist/reachability/index.d.ts +61 -95
  268. package/dist/reachability/index.js +300 -393
  269. package/dist/reachability/index.js.map +1 -1
  270. package/dist/reachability/request.d.ts +7 -3
  271. package/dist/reachability/request.js +18 -10
  272. package/dist/reachability/request.js.map +1 -1
  273. package/dist/reachability/util.d.ts +8 -0
  274. package/dist/reachability/util.js +29 -0
  275. package/dist/reachability/util.js.map +1 -0
  276. package/dist/reactions/constants.d.ts +3 -0
  277. package/dist/reactions/constants.js +12 -0
  278. package/dist/reactions/constants.js.map +1 -0
  279. package/dist/reactions/reactions.d.ts +2 -2
  280. package/dist/reactions/reactions.js +4 -6
  281. package/dist/reactions/reactions.js.map +1 -1
  282. package/dist/reactions/reactions.type.d.ts +23 -3
  283. package/dist/reactions/reactions.type.js +21 -23
  284. package/dist/reactions/reactions.type.js.map +1 -1
  285. package/dist/reconnection-manager/index.d.ts +32 -8
  286. package/dist/reconnection-manager/index.js +282 -231
  287. package/dist/reconnection-manager/index.js.map +1 -1
  288. package/dist/recording-controller/enums.js +4 -5
  289. package/dist/recording-controller/enums.js.map +1 -1
  290. package/dist/recording-controller/index.d.ts +15 -1
  291. package/dist/recording-controller/index.js +57 -46
  292. package/dist/recording-controller/index.js.map +1 -1
  293. package/dist/recording-controller/util.d.ts +5 -4
  294. package/dist/recording-controller/util.js +10 -10
  295. package/dist/recording-controller/util.js.map +1 -1
  296. package/dist/roap/index.d.ts +9 -47
  297. package/dist/roap/index.js +101 -235
  298. package/dist/roap/index.js.map +1 -1
  299. package/dist/roap/request.d.ts +18 -12
  300. package/dist/roap/request.js +126 -180
  301. package/dist/roap/request.js.map +1 -1
  302. package/dist/roap/turnDiscovery.d.ts +27 -16
  303. package/dist/roap/turnDiscovery.js +115 -105
  304. package/dist/roap/turnDiscovery.js.map +1 -1
  305. package/dist/rtcMetrics/constants.d.ts +4 -0
  306. package/dist/rtcMetrics/constants.js +11 -0
  307. package/dist/rtcMetrics/constants.js.map +1 -0
  308. package/dist/rtcMetrics/index.d.ts +54 -0
  309. package/dist/rtcMetrics/index.js +140 -0
  310. package/dist/rtcMetrics/index.js.map +1 -0
  311. package/dist/statsAnalyzer/global.d.ts +1 -83
  312. package/dist/statsAnalyzer/global.js +2 -85
  313. package/dist/statsAnalyzer/global.js.map +1 -1
  314. package/dist/statsAnalyzer/index.d.ts +50 -30
  315. package/dist/statsAnalyzer/index.js +435 -510
  316. package/dist/statsAnalyzer/index.js.map +1 -1
  317. package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
  318. package/dist/statsAnalyzer/mqaUtil.js +120 -83
  319. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  320. package/dist/transcription/index.js +1 -2
  321. package/dist/transcription/index.js.map +1 -1
  322. package/dist/webinar/collection.d.ts +16 -0
  323. package/dist/webinar/collection.js +43 -0
  324. package/dist/webinar/collection.js.map +1 -0
  325. package/dist/webinar/index.d.ts +5 -0
  326. package/dist/webinar/index.js +68 -0
  327. package/dist/webinar/index.js.map +1 -0
  328. package/package.json +38 -26
  329. package/src/annotation/annotation.types.ts +50 -0
  330. package/src/annotation/constants.ts +36 -0
  331. package/src/annotation/index.ts +328 -0
  332. package/src/breakouts/README.md +220 -0
  333. package/src/breakouts/breakout.ts +188 -0
  334. package/src/breakouts/collection.ts +19 -0
  335. package/src/breakouts/edit-lock-error.ts +25 -0
  336. package/src/breakouts/events.ts +56 -0
  337. package/src/breakouts/index.ts +925 -0
  338. package/src/breakouts/request.ts +55 -0
  339. package/src/breakouts/utils.ts +57 -0
  340. package/src/common/errors/no-meeting-info.ts +24 -0
  341. package/src/common/errors/webex-errors.ts +36 -12
  342. package/src/common/logs/logger-proxy.ts +1 -1
  343. package/src/common/logs/request.ts +5 -1
  344. package/src/common/queue.ts +22 -8
  345. package/src/config.ts +6 -7
  346. package/src/constants.ts +244 -97
  347. package/src/controls-options-manager/enums.ts +12 -0
  348. package/src/controls-options-manager/index.ts +116 -21
  349. package/src/controls-options-manager/types.ts +59 -0
  350. package/src/controls-options-manager/util.ts +294 -14
  351. package/src/index.ts +44 -0
  352. package/src/interceptors/index.ts +3 -0
  353. package/src/interceptors/locusRetry.ts +67 -0
  354. package/src/interpretation/README.md +60 -0
  355. package/src/interpretation/collection.ts +19 -0
  356. package/src/interpretation/index.ts +332 -0
  357. package/src/interpretation/siLanguage.ts +18 -0
  358. package/src/locus-info/controlsUtils.ts +110 -0
  359. package/src/locus-info/index.ts +449 -61
  360. package/src/locus-info/infoUtils.ts +14 -2
  361. package/src/locus-info/mediaSharesUtils.ts +64 -0
  362. package/src/locus-info/parser.ts +258 -47
  363. package/src/locus-info/selfUtils.ts +85 -2
  364. package/src/media/index.ts +153 -370
  365. package/src/media/properties.ts +106 -136
  366. package/src/media/util.ts +0 -21
  367. package/src/mediaQualityMetrics/config.ts +244 -377
  368. package/src/meeting/in-meeting-actions.ts +176 -0
  369. package/src/meeting/index.ts +3944 -2489
  370. package/src/meeting/locusMediaRequest.ts +313 -0
  371. package/src/meeting/muteState.ts +224 -138
  372. package/src/meeting/request.ts +207 -127
  373. package/src/meeting/request.type.ts +13 -0
  374. package/src/meeting/util.ts +590 -423
  375. package/src/meeting-info/index.ts +81 -8
  376. package/src/meeting-info/meeting-info-v2.ts +163 -13
  377. package/src/meeting-info/util.ts +1 -1
  378. package/src/meeting-info/utilv2.ts +28 -28
  379. package/src/meetings/collection.ts +33 -0
  380. package/src/meetings/index.ts +487 -126
  381. package/src/meetings/meetings.types.ts +12 -0
  382. package/src/meetings/request.ts +2 -0
  383. package/src/meetings/util.ts +116 -5
  384. package/src/member/index.ts +43 -1
  385. package/src/member/types.ts +38 -0
  386. package/src/member/util.ts +125 -28
  387. package/src/members/collection.ts +8 -0
  388. package/src/members/index.ts +187 -52
  389. package/src/members/request.ts +87 -27
  390. package/src/members/util.ts +332 -291
  391. package/src/metrics/constants.ts +15 -6
  392. package/src/metrics/index.ts +1 -471
  393. package/src/multistream/mediaRequestManager.ts +440 -0
  394. package/src/multistream/receiveSlot.ts +184 -0
  395. package/src/multistream/receiveSlotManager.ts +166 -0
  396. package/src/multistream/remoteMedia.ts +254 -0
  397. package/src/multistream/remoteMediaGroup.ts +284 -0
  398. package/src/multistream/remoteMediaManager.ts +1145 -0
  399. package/src/multistream/sendSlotManager.ts +170 -0
  400. package/src/networkQualityMonitor/index.ts +6 -6
  401. package/src/reachability/clusterReachability.ts +320 -0
  402. package/src/reachability/index.ts +243 -347
  403. package/src/reachability/request.ts +17 -8
  404. package/src/reachability/util.ts +24 -0
  405. package/src/reactions/constants.ts +4 -0
  406. package/src/reactions/reactions.ts +4 -4
  407. package/src/reactions/reactions.type.ts +30 -4
  408. package/src/reconnection-manager/index.ts +168 -156
  409. package/src/recording-controller/index.ts +20 -3
  410. package/src/recording-controller/util.ts +26 -9
  411. package/src/roap/index.ts +98 -241
  412. package/src/roap/request.ts +74 -148
  413. package/src/roap/turnDiscovery.ts +62 -56
  414. package/src/rtcMetrics/constants.ts +3 -0
  415. package/src/rtcMetrics/index.ts +124 -0
  416. package/src/statsAnalyzer/global.ts +1 -84
  417. package/src/statsAnalyzer/index.ts +477 -643
  418. package/src/statsAnalyzer/mqaUtil.ts +115 -114
  419. package/src/webinar/collection.ts +31 -0
  420. package/src/webinar/index.ts +62 -0
  421. package/test/integration/spec/converged-space-meetings.js +233 -0
  422. package/test/integration/spec/journey.js +320 -264
  423. package/test/integration/spec/space-meeting.js +77 -4
  424. package/test/unit/spec/annotation/index.ts +418 -0
  425. package/test/unit/spec/breakouts/breakout.ts +237 -0
  426. package/test/unit/spec/breakouts/collection.ts +15 -0
  427. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  428. package/test/unit/spec/breakouts/events.ts +89 -0
  429. package/test/unit/spec/breakouts/index.ts +1790 -0
  430. package/test/unit/spec/breakouts/request.ts +104 -0
  431. package/test/unit/spec/breakouts/utils.js +72 -0
  432. package/test/unit/spec/common/queue.js +31 -2
  433. package/test/unit/spec/controls-options-manager/index.js +163 -0
  434. package/test/unit/spec/controls-options-manager/util.js +576 -60
  435. package/test/unit/spec/fixture/locus.js +1 -0
  436. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  437. package/test/unit/spec/interpretation/collection.ts +15 -0
  438. package/test/unit/spec/interpretation/index.ts +589 -0
  439. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  440. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  441. package/test/unit/spec/locus-info/index.js +1390 -16
  442. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  443. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  444. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  445. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  446. package/test/unit/spec/locus-info/parser.js +116 -35
  447. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  448. package/test/unit/spec/media/index.ts +290 -0
  449. package/test/unit/spec/media/properties.ts +75 -84
  450. package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
  451. package/test/unit/spec/meeting/index.js +8187 -2769
  452. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  453. package/test/unit/spec/meeting/muteState.js +409 -213
  454. package/test/unit/spec/meeting/request.js +512 -42
  455. package/test/unit/spec/meeting/utils.js +741 -24
  456. package/test/unit/spec/meeting-info/index.js +300 -0
  457. package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
  458. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  459. package/test/unit/spec/meetings/collection.js +26 -0
  460. package/test/unit/spec/meetings/index.js +1313 -243
  461. package/test/unit/spec/meetings/utils.js +202 -2
  462. package/test/unit/spec/member/index.js +32 -9
  463. package/test/unit/spec/member/util.js +499 -61
  464. package/test/unit/spec/members/index.js +394 -5
  465. package/test/unit/spec/members/request.js +206 -27
  466. package/test/unit/spec/members/utils.js +173 -38
  467. package/test/unit/spec/metrics/index.js +1 -50
  468. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  469. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  470. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  471. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  472. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  473. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  474. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  475. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  476. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  477. package/test/unit/spec/reachability/index.ts +531 -24
  478. package/test/unit/spec/reachability/request.js +68 -0
  479. package/test/unit/spec/reachability/util.ts +40 -0
  480. package/test/unit/spec/reconnection-manager/index.js +162 -24
  481. package/test/unit/spec/recording-controller/index.js +293 -218
  482. package/test/unit/spec/recording-controller/util.js +223 -96
  483. package/test/unit/spec/roap/index.ts +200 -76
  484. package/test/unit/spec/roap/request.ts +255 -0
  485. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  486. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  487. package/test/unit/spec/stats-analyzer/index.js +261 -167
  488. package/test/unit/spec/webinar/collection.ts +13 -0
  489. package/test/unit/spec/webinar/index.ts +60 -0
  490. package/test/utils/constants.js +9 -0
  491. package/test/utils/integrationTestUtils.js +46 -0
  492. package/test/utils/testUtils.js +0 -45
  493. package/test/utils/webex-config.js +4 -0
  494. package/test/utils/webex-test-users.js +7 -3
  495. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  496. package/dist/meeting/effectsState.d.ts +0 -42
  497. package/dist/meeting/effectsState.js +0 -260
  498. package/dist/meeting/effectsState.js.map +0 -1
  499. package/dist/metrics/config.d.ts +0 -169
  500. package/dist/metrics/config.js +0 -289
  501. package/dist/metrics/config.js.map +0 -1
  502. package/dist/peer-connection-manager/index.d.ts +0 -6
  503. package/dist/peer-connection-manager/index.js +0 -671
  504. package/dist/peer-connection-manager/index.js.map +0 -1
  505. package/dist/peer-connection-manager/util.d.ts +0 -6
  506. package/dist/peer-connection-manager/util.js +0 -110
  507. package/dist/peer-connection-manager/util.js.map +0 -1
  508. package/dist/roap/collection.d.ts +0 -10
  509. package/dist/roap/collection.js +0 -63
  510. package/dist/roap/collection.js.map +0 -1
  511. package/dist/roap/handler.d.ts +0 -47
  512. package/dist/roap/handler.js +0 -279
  513. package/dist/roap/handler.js.map +0 -1
  514. package/dist/roap/state.d.ts +0 -9
  515. package/dist/roap/state.js +0 -127
  516. package/dist/roap/state.js.map +0 -1
  517. package/dist/roap/util.d.ts +0 -2
  518. package/dist/roap/util.js +0 -76
  519. package/dist/roap/util.js.map +0 -1
  520. package/src/index.js +0 -15
  521. package/src/meeting/effectsState.ts +0 -209
  522. package/src/metrics/config.ts +0 -485
  523. package/src/peer-connection-manager/index.ts +0 -847
  524. package/src/peer-connection-manager/util.ts +0 -119
  525. package/src/roap/collection.ts +0 -62
  526. package/src/roap/handler.ts +0 -294
  527. package/src/roap/state.ts +0 -156
  528. package/src/roap/util.ts +0 -100
  529. package/test/unit/spec/meeting/effectsState.js +0 -281
  530. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  531. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  532. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  533. package/test/unit/spec/roap/util.js +0 -30
  534. /package/dist/common/errors/{reclaim-host-role-error.d.ts → reclaim-host-role-errors.d.ts} +0 -0
  535. /package/src/common/errors/{reclaim-host-role-error.ts → reclaim-host-role-errors.ts} +0 -0
@@ -2,10 +2,12 @@ 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 {ConnectionState} from '@webex/internal-media-core';
5
6
 
6
7
  import {StatsAnalyzer, EVENTS} from '../../../../src/statsAnalyzer';
7
8
  import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
8
9
  import testUtils from '../../../utils/testUtils';
10
+ import {MEDIA_DEVICES, _UNKNOWN_} from '@webex/plugin-meetings/src/constants';
9
11
 
10
12
  const {assert} = chai;
11
13
 
@@ -23,14 +25,15 @@ describe('plugin-meetings', () => {
23
25
  };
24
26
 
25
27
  const defaultStats = {
28
+ resolutions: {},
26
29
  internal: {
27
- video: {
30
+ 'video-send-1': {
28
31
  send: {
29
32
  totalPacketsLostOnReceiver: 10,
30
33
  },
31
34
  },
32
35
  },
33
- video: {
36
+ 'video-send-1': {
34
37
  send: {
35
38
  packetsSent: 2,
36
39
  meanRemoteJitter: [],
@@ -51,7 +54,12 @@ describe('plugin-meetings', () => {
51
54
  beforeEach(() => {
52
55
  const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
53
56
 
54
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor, defaultStats);
57
+ statsAnalyzer = new StatsAnalyzer(
58
+ initialConfig,
59
+ () => ({}),
60
+ networkQualityMonitor,
61
+ defaultStats
62
+ );
55
63
 
56
64
  sandBoxSpy = sandbox.spy(
57
65
  statsAnalyzer.networkQualityMonitor,
@@ -64,12 +72,12 @@ describe('plugin-meetings', () => {
64
72
  });
65
73
 
66
74
  it('should trigger determineUplinkNetworkQuality with specific arguments', async () => {
67
- await statsAnalyzer.parseGetStatsResult(statusResult, 'video');
75
+ await statsAnalyzer.parseGetStatsResult(statusResult, 'video-send-1', true);
68
76
 
69
77
  assert.calledOnce(statsAnalyzer.networkQualityMonitor.determineUplinkNetworkQuality);
70
78
  assert(
71
79
  sandBoxSpy.calledWith({
72
- mediaType: 'video',
80
+ mediaType: 'video-send-1',
73
81
  remoteRtpResults: statusResult,
74
82
  statsAnalyzerCurrentStats: statsAnalyzer.statsResults,
75
83
  })
@@ -82,22 +90,7 @@ describe('plugin-meetings', () => {
82
90
  let pc;
83
91
  let networkQualityMonitor;
84
92
  let statsAnalyzer;
85
- const statusResultOutboundRTP = {
86
- type: 'outbound-rtp',
87
- frameHeight: 720,
88
- frameWidth: 1280,
89
- packetsLost: 11,
90
- framesSent: 105,
91
- hugeFramesSent: 1,
92
- framesEncoded: 102,
93
- rttThreshold: 501,
94
- jitterThreshold: 501,
95
- jitterBufferDelay: 288.131459,
96
- jitterBufferEmittedCount: 4013,
97
- trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
98
- bytesSent: 1233,
99
- totalPacketsSent: 100,
100
- };
93
+ let mqeData;
101
94
 
102
95
  let receivedEventsData = {
103
96
  local: {},
@@ -125,61 +118,145 @@ describe('plugin-meetings', () => {
125
118
  // bytesReceived and bytesSent need to be non-zero in order for StatsAnalyzer to parse any other values
126
119
  fakeStats = {
127
120
  audio: {
128
- receiver: {
129
- type: 'inbound-rtp',
130
- packetsReceived: 0,
131
- bytesReceived: 1,
132
- },
133
- sender: {
134
- type: 'outbound-rtp',
135
- packetsSent: 0,
136
- bytesSent: 1,
137
- },
121
+ senders: [
122
+ {
123
+ localTrackLabel: 'fake-microphone',
124
+ report: [
125
+ {
126
+ type: 'outbound-rtp',
127
+ packetsSent: 0,
128
+ bytesSent: 1,
129
+ },
130
+ {
131
+ type: 'candidate-pair',
132
+ state: 'succeeded',
133
+ localCandidateId: 'fake-candidate-id',
134
+ },
135
+ {
136
+ type: 'candidate-pair',
137
+ state: 'failed',
138
+ localCandidateId: 'bad-candidate-id',
139
+ },
140
+ {
141
+ type: 'local-candidate',
142
+ id: 'fake-candidate-id',
143
+ protocol: 'tcp',
144
+ },
145
+ ],
146
+ },
147
+ ],
148
+ receivers: [
149
+ {
150
+ report: [
151
+ {
152
+ type: 'inbound-rtp',
153
+ packetsReceived: 0,
154
+ bytesReceived: 1,
155
+ },
156
+ {
157
+ type: 'candidate-pair',
158
+ state: 'succeeded',
159
+ localCandidateId: 'fake-candidate-id',
160
+ },
161
+ {
162
+ type: 'candidate-pair',
163
+ state: 'failed',
164
+ localCandidateId: 'bad-candidate-id',
165
+ },
166
+ {
167
+ type: 'local-candidate',
168
+ id: 'fake-candidate-id',
169
+ protocol: 'tcp',
170
+ },
171
+ ],
172
+ },
173
+ ],
138
174
  },
139
175
  video: {
140
- receiver: {
141
- type: 'inbound-rtp',
142
- framesDecoded: 0,
143
- bytesReceived: 1,
144
- },
145
- sender: {
146
- type: 'outbound-rtp',
147
- framesSent: 0,
148
- bytesSent: 1,
149
- },
176
+ senders: [
177
+ {
178
+ localTrackLabel: 'fake-camera',
179
+ report: [
180
+ {
181
+ type: 'outbound-rtp',
182
+ framesSent: 1500,
183
+ bytesSent: 1,
184
+ },
185
+ {
186
+ type: 'candidate-pair',
187
+ state: 'succeeded',
188
+ localCandidateId: 'fake-candidate-id',
189
+ },
190
+ {
191
+ type: 'candidate-pair',
192
+ state: 'failed',
193
+ localCandidateId: 'bad-candidate-id',
194
+ },
195
+ {
196
+ type: 'local-candidate',
197
+ id: 'fake-candidate-id',
198
+ protocol: 'tcp',
199
+ },
200
+ ],
201
+ },
202
+ ],
203
+ receivers: [
204
+ {
205
+ report: [
206
+ {
207
+ type: 'inbound-rtp',
208
+ framesDecoded: 0,
209
+ bytesReceived: 1,
210
+ frameHeight: 720,
211
+ frameWidth: 1280,
212
+ framesReceived: 1500,
213
+ },
214
+ {
215
+ type: 'candidate-pair',
216
+ state: 'succeeded',
217
+ localCandidateId: 'fake-candidate-id',
218
+ },
219
+ {
220
+ type: 'candidate-pair',
221
+ state: 'failed',
222
+ localCandidateId: 'bad-candidate-id',
223
+ },
224
+ {
225
+ type: 'local-candidate',
226
+ id: 'fake-candidate-id',
227
+ protocol: 'tcp',
228
+ },
229
+ ],
230
+ },
231
+ ],
150
232
  },
151
233
  };
152
234
 
153
235
  pc = {
154
- audioTransceiver: {
155
- sender: {
156
- getStats: sinon.stub().resolves([fakeStats.audio.sender]),
157
- },
158
- receiver: {
159
- getStats: sinon.stub().resolves([fakeStats.audio.receiver]),
160
- },
161
- },
162
- videoTransceiver: {
163
- sender: {
164
- getStats: sinon.stub().resolves([fakeStats.video.sender]),
236
+ getConnectionState: sinon.stub().returns(ConnectionState.Connected),
237
+ getTransceiverStats: sinon.stub().resolves({
238
+ audio: {
239
+ senders: [fakeStats.audio.senders[0]],
240
+ receivers: [fakeStats.audio.receivers[0]],
165
241
  },
166
- receiver: {
167
- getStats: sinon.stub().resolves([fakeStats.video.receiver]),
242
+ video: {
243
+ senders: [fakeStats.video.senders[0]],
244
+ receivers: [fakeStats.video.receivers[0]],
168
245
  },
169
- },
170
- shareTransceiver: {
171
- sender: {
172
- getStats: sinon.stub().resolves([]),
246
+ screenShareAudio: {
247
+ senders: [fakeStats.audio.senders[0]],
248
+ receivers: [fakeStats.audio.receivers[0]],
173
249
  },
174
- receiver: {
175
- getStats: sinon.stub().resolves([]),
250
+ screenShareVideo: {
251
+ senders: [fakeStats.video.senders[0]],
252
+ receivers: [fakeStats.video.receivers[0]],
176
253
  },
177
- },
254
+ }),
178
255
  };
179
256
 
180
257
  networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
181
258
 
182
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor);
259
+ statsAnalyzer = new StatsAnalyzer(initialConfig, () => ({}), networkQualityMonitor);
183
260
 
184
261
  statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STARTED, (data) => {
185
262
  receivedEventsData.local.started = data;
@@ -193,11 +270,8 @@ describe('plugin-meetings', () => {
193
270
  statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
194
271
  receivedEventsData.remote.stopped = data;
195
272
  });
196
- statsAnalyzer.on(EVENTS.NO_FRAMES_SENT, (data) => {
197
- receivedEventsData.noFramesSent = data;
198
- });
199
- statsAnalyzer.on(EVENTS.NO_VIDEO_ENCODED, (data) => {
200
- receivedEventsData.noVideoEncoded = data;
273
+ statsAnalyzer.on(EVENTS.MEDIA_QUALITY, ({data}) => {
274
+ mqeData = data;
201
275
  });
202
276
  });
203
277
 
@@ -212,6 +286,19 @@ describe('plugin-meetings', () => {
212
286
  await testUtils.flushPromises();
213
287
  };
214
288
 
289
+ const mergeProperties = (target, properties, keyValue = 'fake-candidate-id', matchKey= 'type', matchValue = 'local-candidate') => {
290
+ for (let key in target) {
291
+ if (target.hasOwnProperty(key)) {
292
+ if (typeof target[key] === 'object') {
293
+ mergeProperties(target[key], properties, keyValue, matchKey, matchValue);
294
+ }
295
+ if (key === 'id' && target[key] === keyValue && target[matchKey] === matchValue) {
296
+ Object.assign(target, properties);
297
+ }
298
+ }
299
+ }
300
+ }
301
+
215
302
  const progressTime = async () => {
216
303
  await clock.tickAsync(initialConfig.analyzerInterval);
217
304
  await testUtils.flushPromises();
@@ -225,6 +312,23 @@ describe('plugin-meetings', () => {
225
312
  assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
226
313
  };
227
314
 
315
+ const checkMqeData = () => {
316
+ for (const data of [
317
+ mqeData.audioTransmit,
318
+ mqeData.audioReceive,
319
+ mqeData.videoTransmit,
320
+ mqeData.videoReceive,
321
+ ]) {
322
+ assert.strictEqual(data.length, 2);
323
+ assert.strictEqual(data[0].common.common.isMain, true);
324
+ assert.strictEqual(data[1].common.common.isMain, false);
325
+ }
326
+
327
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedFrameSize, 3600);
328
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedHeight, 720);
329
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedWidth, 1280);
330
+ };
331
+
228
332
  it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
229
333
  await startStatsAnalyzer({expected: {sendAudio: true}});
230
334
 
@@ -232,7 +336,7 @@ describe('plugin-meetings', () => {
232
336
  checkReceivedEvent({expected: {}});
233
337
 
234
338
  // setup a mock to return some values higher the previous ones
235
- fakeStats.audio.sender.packetsSent += 10;
339
+ fakeStats.audio.senders[0].report[0].packetsSent += 10;
236
340
 
237
341
  await progressTime();
238
342
 
@@ -252,7 +356,7 @@ describe('plugin-meetings', () => {
252
356
  checkReceivedEvent({expected: {}});
253
357
 
254
358
  // setup a mock to return some values higher the previous ones
255
- fakeStats.video.sender.framesSent += 1;
359
+ fakeStats.video.senders[0].report[0].framesSent += 1;
256
360
 
257
361
  await progressTime();
258
362
 
@@ -272,7 +376,7 @@ describe('plugin-meetings', () => {
272
376
  checkReceivedEvent({expected: {}});
273
377
 
274
378
  // setup a mock to return some values higher the previous ones
275
- fakeStats.audio.receiver.packetsReceived += 5;
379
+ fakeStats.audio.receivers[0].report[0].packetsReceived += 5;
276
380
 
277
381
  await progressTime();
278
382
  // check that we got the REMOTE_MEDIA_STARTED event for audio
@@ -292,7 +396,7 @@ describe('plugin-meetings', () => {
292
396
  checkReceivedEvent({expected: {}});
293
397
 
294
398
  // setup a mock to return some values higher the previous ones
295
- fakeStats.video.receiver.framesDecoded += 1;
399
+ fakeStats.video.receivers[0].report[0].framesDecoded += 1;
296
400
 
297
401
  await progressTime();
298
402
  // check that we got the REMOTE_MEDIA_STARTED event for video
@@ -305,133 +409,123 @@ describe('plugin-meetings', () => {
305
409
  checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
306
410
  });
307
411
 
308
- const checkStats = (type) => {
309
- const statsResult = {
310
- height: 720,
311
- width: 1280,
312
- jitterBufferDelay: 288.131459,
313
- jitterBufferEmittedCount: 4013,
314
- trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
315
- avgJitterDelay: 0.07179951632195365,
316
- };
317
- if (type === 'inbound-rtp') {
318
- statsResult.framesDecoded = 4013;
319
- statsResult.framesDropped = 0;
320
- statsResult.framesReceived = 4016;
321
- assert.deepEqual(statsAnalyzer.statsResults.resolutions.video.recv, statsResult);
322
- } else if (type === 'outbound-rtp') {
323
- statsResult.framesSent = 105;
324
- statsResult.hugeFramesSent = 1;
325
- assert.deepEqual(statsAnalyzer.statsResults.resolutions.video.send, statsResult);
326
- }
327
- };
328
-
329
- it('processes track results and populate statsResults.resolutions object when type is inbound-rtp with video', async () => {
412
+ it('emits the correct MEDIA_QUALITY events', async () => {
330
413
  await startStatsAnalyzer({expected: {receiveVideo: true}});
331
- const statusResultInboundRTP = {
332
- type: 'inbound-rtp',
333
- frameHeight: 720,
334
- frameWidth: 1280,
335
- packetsLost: 11,
336
- rttThreshold: 501,
337
- jitterThreshold: 501,
338
- framesDecoded: 4013,
339
- framesDropped: 0,
340
- framesReceived: 4016,
341
- jitterBufferDelay: 288.131459,
342
- jitterBufferEmittedCount: 4013,
343
- trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
344
- };
345
- await statsAnalyzer.parseGetStatsResult(statusResultInboundRTP, 'video');
346
- checkStats('inbound-rtp');
414
+
415
+ await progressTime();
416
+
417
+ // Check that the mqe data has been emitted and is correctly computed.
418
+ checkMqeData();
347
419
  });
348
- it('processes track results and populate statsResults.resolutions object when type is outbound-rtp with video', async () => {
420
+
421
+ it('emits the correct transportType in MEDIA_QUALITY events', async () => {
349
422
  await startStatsAnalyzer({expected: {receiveVideo: true}});
350
423
 
351
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
352
- checkStats('outbound-rtp');
353
- });
424
+ await progressTime();
354
425
 
355
- it('doesnot processes track results with audio', async () => {
356
- await startStatsAnalyzer({expected: {receiveAudio: true}});
357
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'audio');
358
- assert.deepEqual(statsAnalyzer.statsResults.resolutions.audio, undefined);
426
+ assert.strictEqual(mqeData.audioTransmit[0].common.transportType, 'TCP');
427
+ assert.strictEqual(mqeData.videoReceive[0].common.transportType, 'TCP');
359
428
  });
360
429
 
361
- it('emits NO_FRAMES_ENCODED when frames are not being encoded', async () => {
362
- const expected = {mediaType: 'video'};
363
- await startStatsAnalyzer({expected: {sendVideo: true}});
430
+ it('emits the correct transportType in MEDIA_QUALITY events when using a TURN server', async () => {
431
+ fakeStats.audio.senders[0].report[3].relayProtocol = 'tls';
432
+ fakeStats.video.senders[0].report[3].relayProtocol = 'tls';
433
+ fakeStats.audio.receivers[0].report[3].relayProtocol = 'tls';
434
+ fakeStats.video.receivers[0].report[3].relayProtocol = 'tls';
364
435
 
365
- statsAnalyzer.lastStatsResults.video.send = {framesEncoded: 102, totalPacketsSent: 106};
436
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
366
437
 
367
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
438
+ await progressTime();
368
439
 
369
- statsAnalyzer.compareLastStatsResult();
370
- assert.deepEqual(receivedEventsData.noVideoEncoded, expected);
440
+ assert.strictEqual(mqeData.audioTransmit[0].common.transportType, 'TLS');
441
+ assert.strictEqual(mqeData.videoReceive[0].common.transportType, 'TLS');
371
442
  });
372
443
 
373
- it('emits NO_FRAMES_SENT when frames are not being sent but frames are being encoded', async () => {
374
- await startStatsAnalyzer({expected: {sendVideo: true}});
375
-
376
- const expected = {mediaType: 'video'};
444
+ it('emits the correct peripherals in MEDIA_QUALITY events', async () => {
445
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
377
446
 
378
- statsAnalyzer.lastStatsResults.video.send = {
379
- framesEncoded: 10,
380
- framesSent: 105,
381
- totalPacketsSent: 106,
382
- };
383
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
447
+ await progressTime();
384
448
 
385
- statsAnalyzer.compareLastStatsResult();
386
- assert.deepEqual(receivedEventsData.noFramesSent, expected);
449
+ assert.strictEqual(
450
+ mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.MICROPHONE)
451
+ .information,
452
+ 'fake-microphone'
453
+ );
454
+ assert.strictEqual(
455
+ mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.CAMERA)
456
+ .information,
457
+ 'fake-camera'
458
+ );
387
459
  });
388
460
 
389
- it('doesnot emits NO_FRAMES_SENT when last emitted event is LOCAL_MEDIA_STOPPED', async () => {
390
- statsAnalyzer.lastEmittedStartStopEvent.video.local = EVENTS.LOCAL_MEDIA_STOPPED;
461
+ it('emits the correct peripherals in MEDIA_QUALITY events when localTrackLabel is undefined', async () => {
462
+ fakeStats.audio.senders[0].localTrackLabel = undefined;
463
+ fakeStats.video.senders[0].localTrackLabel = undefined;
391
464
 
392
- await startStatsAnalyzer({expected: {sendVideo: true}});
393
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
465
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
466
+
467
+ await progressTime();
394
468
 
395
- statsAnalyzer.compareLastStatsResult();
396
- assert.deepEqual(receivedEventsData.noFramesSent, undefined);
469
+ assert.strictEqual(
470
+ mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.MICROPHONE)
471
+ .information,
472
+ _UNKNOWN_
473
+ );
474
+ assert.strictEqual(
475
+ mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.CAMERA)
476
+ .information,
477
+ _UNKNOWN_
478
+ );
397
479
  });
398
480
 
399
- it('emits NO_FRAMES_ENCODED when frames are not being encoded for share', async () => {
400
- const expected = {mediaType: 'share'};
401
- await startStatsAnalyzer({expected: {sendShare: true}});
481
+ it('emits the correct frameRate', async () => {
482
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
402
483
 
403
- statsAnalyzer.lastStatsResults.share.send = {framesEncoded: 102, totalPacketsSent: 106};
484
+ await progressTime();
485
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 25);
486
+ fakeStats.video.receivers[0].framesReceived = 3000;
487
+ await progressTime();
488
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 25);
489
+ });
404
490
 
405
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
491
+ it('has the correct localIpAddress set when the candidateType is host', async () => {
492
+ await startStatsAnalyzer();
406
493
 
407
- statsAnalyzer.compareLastStatsResult();
408
- assert.deepEqual(receivedEventsData.noVideoEncoded, expected);
494
+ await progressTime();
495
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
496
+ mergeProperties(fakeStats, {address: 'test', candidateType: 'host'});
497
+ await progressTime();
498
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), 'test');
409
499
  });
410
500
 
411
- it('emits NO_FRAMES_SENT when frames are not being sent but frames are being encoded for share', async () => {
412
- const expected = {mediaType: 'share'};
413
- await startStatsAnalyzer({expected: {sendShare: true}});
501
+ it('has the correct localIpAddress set when the candidateType is prflx and relayProtocol is set', async () => {
502
+ await startStatsAnalyzer();
414
503
 
415
- statsAnalyzer.lastStatsResults.share.send = {
416
- framesEncoded: 10,
417
- framesSent: 105,
418
- totalPacketsSent: 106,
419
- };
504
+ await progressTime();
505
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
506
+ mergeProperties(fakeStats, {relayProtocol: 'test', address: 'test2', candidateType: 'prflx'});
507
+ await progressTime();
508
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), 'test2');
509
+ });
420
510
 
421
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
511
+ it('has the correct localIpAddress set when the candidateType is prflx and relayProtocol is not set', async () => {
512
+ await startStatsAnalyzer();
422
513
 
423
- statsAnalyzer.compareLastStatsResult();
424
- assert.deepEqual(receivedEventsData.noFramesSent, expected);
514
+ await progressTime();
515
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
516
+ mergeProperties(fakeStats, {relatedAddress: 'relatedAddress', address: 'test2', candidateType: 'prflx'});
517
+ await progressTime();
518
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), 'relatedAddress');
425
519
  });
426
520
 
427
- it('doesnot emits NO_FRAMES_SENT when last emitted event is LOCAL_MEDIA_STOPPED for share', async () => {
428
- statsAnalyzer.lastEmittedStartStopEvent.video.local = EVENTS.LOCAL_MEDIA_STOPPED;
429
-
430
- await startStatsAnalyzer({expected: {sendShare: true}});
431
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
521
+ it('has no localIpAddress set when the candidateType is invalid', async () => {
522
+ await startStatsAnalyzer();
432
523
 
433
- statsAnalyzer.compareLastStatsResult();
434
- assert.deepEqual(receivedEventsData.noFramesSent, undefined);
524
+ await progressTime();
525
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
526
+ mergeProperties(fakeStats, {candidateType: 'invalid'});
527
+ await progressTime();
528
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
435
529
  });
436
530
  });
437
531
  });
@@ -0,0 +1,13 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import WebinarCollection from '@webex/plugin-meetings/src/webinar/collection';
3
+
4
+ describe('plugin-meetings', () => {
5
+ describe('WebinarCollection', () => {
6
+ it('the webinar collection is as expected', () => {
7
+ const collection = new WebinarCollection();
8
+
9
+ assert.equal(collection.namespace, 'Meetings');
10
+ assert.equal(collection.mainIndex, 'sessionId');
11
+ });
12
+ });
13
+ });
@@ -0,0 +1,60 @@
1
+ import {assert, expect} from '@webex/test-helper-chai';
2
+ import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
3
+ import Webinar from '@webex/plugin-meetings/src/webinar';
4
+ import MockWebex from '@webex/test-helper-mock-webex';
5
+ import sinon from 'sinon';
6
+
7
+ describe('plugin-meetings', () => {
8
+ describe('Webinar', () => {
9
+
10
+ let webex;
11
+ let webinar;
12
+
13
+ beforeEach(() => {
14
+ // @ts-ignore
15
+ webex = new MockWebex({});
16
+ webex.internal.mercury.on = sinon.stub();
17
+ webinar = new Webinar({}, {parent: webex});
18
+ webinar.locusUrl = 'locusUrl';
19
+ webex.request = sinon.stub().returns(Promise.resolve('REQUEST_RETURN_VALUE'));
20
+ webex.meetings = {};
21
+ webex.meetings.getMeetingByType = sinon.stub();
22
+ });
23
+
24
+ describe('#locusUrlUpdate', () => {
25
+ it('sets the locus url', () => {
26
+ webinar.locusUrlUpdate('newUrl');
27
+
28
+ assert.equal(webinar.locusUrl, 'newUrl');
29
+ });
30
+ });
31
+
32
+ describe('#webcastUrlUpdate', () => {
33
+ it('sets the webcast url', () => {
34
+ webinar.webcastUrlUpdate('newUrl');
35
+
36
+ assert.equal(webinar.webcastUrl, 'newUrl');
37
+ });
38
+ });
39
+
40
+ describe('#webinarAttendeesSearchingUrlUpdate', () => {
41
+ it('sets the webinarAttendeesSearching url', () => {
42
+ webinar.webinarAttendeesSearchingUrlUpdate('newUrl');
43
+
44
+ assert.equal(webinar.webinarAttendeesSearchingUrl, 'newUrl');
45
+ });
46
+ });
47
+
48
+ describe('#updateCanManageWebcast', () => {
49
+ it('update canManageWebcast', () => {
50
+ webinar.updateCanManageWebcast(true);
51
+
52
+ assert.equal(webinar.canManageWebcast, true);
53
+
54
+ webinar.updateCanManageWebcast(false);
55
+
56
+ assert.equal(webinar.canManageWebcast, false);
57
+ });
58
+ });
59
+ })
60
+ })
@@ -0,0 +1,9 @@
1
+ // MOVE TO TEST CONSTANTS
2
+ export const MEDIA_SERVERS = {
3
+ // The homer media server for converged multistream meetings.
4
+ HOMER: 'homer',
5
+ // The linus media server
6
+ LINUS: 'linus',
7
+ // The calliope media server for transcoded meetings
8
+ CALLIOPE: 'calliope',
9
+ };