@webex/plugin-meetings 3.0.0-beta.18 → 3.0.0-beta.180

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 (410) hide show
  1. package/README.md +45 -7
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +114 -14
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +3 -2
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/config.js +3 -8
  25. package/dist/config.js.map +1 -1
  26. package/dist/constants.js +172 -30
  27. package/dist/constants.js.map +1 -1
  28. package/dist/controls-options-manager/constants.js +14 -0
  29. package/dist/controls-options-manager/constants.js.map +1 -0
  30. package/dist/controls-options-manager/enums.js +27 -0
  31. package/dist/controls-options-manager/enums.js.map +1 -0
  32. package/dist/controls-options-manager/index.js +297 -0
  33. package/dist/controls-options-manager/index.js.map +1 -0
  34. package/dist/controls-options-manager/types.js +7 -0
  35. package/dist/controls-options-manager/types.js.map +1 -0
  36. package/dist/controls-options-manager/util.js +300 -0
  37. package/dist/controls-options-manager/util.js.map +1 -0
  38. package/dist/index.js +107 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/interpretation/collection.js +23 -0
  41. package/dist/interpretation/collection.js.map +1 -0
  42. package/dist/interpretation/index.js +352 -0
  43. package/dist/interpretation/index.js.map +1 -0
  44. package/dist/interpretation/siLanguage.js +25 -0
  45. package/dist/interpretation/siLanguage.js.map +1 -0
  46. package/dist/locus-info/controlsUtils.js +91 -2
  47. package/dist/locus-info/controlsUtils.js.map +1 -1
  48. package/dist/locus-info/index.js +302 -41
  49. package/dist/locus-info/index.js.map +1 -1
  50. package/dist/locus-info/mediaSharesUtils.js +43 -1
  51. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  52. package/dist/locus-info/parser.js +1 -1
  53. package/dist/locus-info/parser.js.map +1 -1
  54. package/dist/locus-info/selfUtils.js +89 -14
  55. package/dist/locus-info/selfUtils.js.map +1 -1
  56. package/dist/media/index.js +39 -134
  57. package/dist/media/index.js.map +1 -1
  58. package/dist/media/properties.js +29 -90
  59. package/dist/media/properties.js.map +1 -1
  60. package/dist/mediaQualityMetrics/config.js +505 -493
  61. package/dist/mediaQualityMetrics/config.js.map +1 -1
  62. package/dist/meeting/in-meeting-actions.js +76 -2
  63. package/dist/meeting/in-meeting-actions.js.map +1 -1
  64. package/dist/meeting/index.js +2610 -2465
  65. package/dist/meeting/index.js.map +1 -1
  66. package/dist/meeting/locusMediaRequest.js +291 -0
  67. package/dist/meeting/locusMediaRequest.js.map +1 -0
  68. package/dist/meeting/muteState.js +229 -124
  69. package/dist/meeting/muteState.js.map +1 -1
  70. package/dist/meeting/request.js +189 -146
  71. package/dist/meeting/request.js.map +1 -1
  72. package/dist/meeting/util.js +478 -414
  73. package/dist/meeting/util.js.map +1 -1
  74. package/dist/meeting-info/index.js +48 -7
  75. package/dist/meeting-info/index.js.map +1 -1
  76. package/dist/meeting-info/meeting-info-v2.js +171 -51
  77. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  78. package/dist/meeting-info/utilv2.js +20 -5
  79. package/dist/meeting-info/utilv2.js.map +1 -1
  80. package/dist/meetings/collection.js +22 -0
  81. package/dist/meetings/collection.js.map +1 -1
  82. package/dist/meetings/index.js +350 -65
  83. package/dist/meetings/index.js.map +1 -1
  84. package/dist/meetings/meetings.types.js +7 -0
  85. package/dist/meetings/meetings.types.js.map +1 -0
  86. package/dist/meetings/request.js +2 -0
  87. package/dist/meetings/request.js.map +1 -1
  88. package/dist/meetings/util.js +88 -1
  89. package/dist/meetings/util.js.map +1 -1
  90. package/dist/member/index.js +49 -0
  91. package/dist/member/index.js.map +1 -1
  92. package/dist/member/types.js +25 -0
  93. package/dist/member/types.js.map +1 -0
  94. package/dist/member/util.js +98 -2
  95. package/dist/member/util.js.map +1 -1
  96. package/dist/members/collection.js +10 -0
  97. package/dist/members/collection.js.map +1 -1
  98. package/dist/members/index.js +86 -5
  99. package/dist/members/index.js.map +1 -1
  100. package/dist/members/request.js +106 -38
  101. package/dist/members/request.js.map +1 -1
  102. package/dist/members/types.js +15 -0
  103. package/dist/members/types.js.map +1 -0
  104. package/dist/members/util.js +316 -233
  105. package/dist/members/util.js.map +1 -1
  106. package/dist/metrics/constants.js +3 -5
  107. package/dist/metrics/constants.js.map +1 -1
  108. package/dist/metrics/index.js +1 -468
  109. package/dist/metrics/index.js.map +1 -1
  110. package/dist/multistream/mediaRequestManager.js +238 -49
  111. package/dist/multistream/mediaRequestManager.js.map +1 -1
  112. package/dist/multistream/receiveSlot.js +49 -16
  113. package/dist/multistream/receiveSlot.js.map +1 -1
  114. package/dist/multistream/receiveSlotManager.js +48 -30
  115. package/dist/multistream/receiveSlotManager.js.map +1 -1
  116. package/dist/multistream/remoteMedia.js +44 -18
  117. package/dist/multistream/remoteMedia.js.map +1 -1
  118. package/dist/multistream/remoteMediaGroup.js +60 -3
  119. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  120. package/dist/multistream/remoteMediaManager.js +173 -59
  121. package/dist/multistream/remoteMediaManager.js.map +1 -1
  122. package/dist/networkQualityMonitor/index.js +4 -2
  123. package/dist/networkQualityMonitor/index.js.map +1 -1
  124. package/dist/reachability/index.js +72 -27
  125. package/dist/reachability/index.js.map +1 -1
  126. package/dist/reachability/request.js +12 -5
  127. package/dist/reachability/request.js.map +1 -1
  128. package/dist/reactions/reactions.js +2 -2
  129. package/dist/reactions/reactions.js.map +1 -1
  130. package/dist/reactions/reactions.type.js +18 -18
  131. package/dist/reactions/reactions.type.js.map +1 -1
  132. package/dist/reconnection-manager/index.js +196 -155
  133. package/dist/reconnection-manager/index.js.map +1 -1
  134. package/dist/recording-controller/index.js +21 -1
  135. package/dist/recording-controller/index.js.map +1 -1
  136. package/dist/recording-controller/util.js +9 -8
  137. package/dist/recording-controller/util.js.map +1 -1
  138. package/dist/roap/index.js +21 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +110 -89
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +93 -36
  143. package/dist/roap/turnDiscovery.js.map +1 -1
  144. package/dist/statsAnalyzer/global.js +1 -93
  145. package/dist/statsAnalyzer/global.js.map +1 -1
  146. package/dist/statsAnalyzer/index.js +326 -311
  147. package/dist/statsAnalyzer/index.js.map +1 -1
  148. package/dist/statsAnalyzer/mqaUtil.js +90 -53
  149. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  150. package/dist/types/annotation/annotation.types.d.ts +42 -0
  151. package/dist/types/annotation/constants.d.ts +31 -0
  152. package/dist/types/annotation/index.d.ts +117 -0
  153. package/dist/types/breakouts/breakout.d.ts +8 -0
  154. package/dist/types/breakouts/collection.d.ts +5 -0
  155. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  156. package/dist/types/breakouts/events.d.ts +8 -0
  157. package/dist/types/breakouts/index.d.ts +5 -0
  158. package/dist/types/breakouts/request.d.ts +22 -0
  159. package/dist/types/breakouts/utils.d.ts +15 -0
  160. package/dist/types/common/browser-detection.d.ts +9 -0
  161. package/dist/types/common/collection.d.ts +48 -0
  162. package/dist/types/common/config.d.ts +2 -0
  163. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  164. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  165. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  166. package/dist/types/common/errors/media.d.ts +15 -0
  167. package/dist/types/common/errors/parameter.d.ts +15 -0
  168. package/dist/types/common/errors/password-error.d.ts +15 -0
  169. package/dist/types/common/errors/permission.d.ts +14 -0
  170. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  171. package/dist/types/common/errors/reconnection.d.ts +15 -0
  172. package/dist/types/common/errors/stats.d.ts +15 -0
  173. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  174. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  175. package/dist/types/common/events/events-scope.d.ts +17 -0
  176. package/dist/types/common/events/events.d.ts +12 -0
  177. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  178. package/dist/types/common/events/util.d.ts +2 -0
  179. package/dist/types/common/logs/logger-config.d.ts +2 -0
  180. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  181. package/dist/types/common/logs/request.d.ts +34 -0
  182. package/dist/types/common/queue.d.ts +32 -0
  183. package/dist/types/config.d.ts +72 -0
  184. package/dist/types/constants.d.ts +1016 -0
  185. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  186. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  187. package/dist/types/controls-options-manager/index.d.ts +136 -0
  188. package/dist/types/controls-options-manager/types.d.ts +43 -0
  189. package/dist/types/controls-options-manager/util.d.ts +1 -0
  190. package/dist/types/index.d.ts +7 -0
  191. package/dist/types/interpretation/collection.d.ts +5 -0
  192. package/dist/types/interpretation/index.d.ts +5 -0
  193. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  194. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  195. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  196. package/dist/types/locus-info/fullState.d.ts +2 -0
  197. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  198. package/dist/types/locus-info/index.d.ts +315 -0
  199. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  200. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  201. package/dist/types/locus-info/parser.d.ts +212 -0
  202. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  203. package/dist/types/media/index.d.ts +34 -0
  204. package/dist/types/media/properties.d.ts +93 -0
  205. package/dist/types/media/util.d.ts +2 -0
  206. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  207. package/dist/types/meeting/in-meeting-actions.d.ts +149 -0
  208. package/dist/types/meeting/index.d.ts +1467 -0
  209. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  210. package/dist/types/meeting/muteState.d.ts +184 -0
  211. package/dist/types/meeting/request.d.ts +270 -0
  212. package/dist/types/meeting/request.type.d.ts +11 -0
  213. package/dist/types/meeting/state.d.ts +9 -0
  214. package/dist/types/meeting/util.d.ts +77 -0
  215. package/dist/types/meeting-info/collection.d.ts +20 -0
  216. package/dist/types/meeting-info/index.d.ts +62 -0
  217. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  218. package/dist/types/meeting-info/request.d.ts +22 -0
  219. package/dist/types/meeting-info/util.d.ts +2 -0
  220. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  221. package/dist/types/meetings/collection.d.ts +31 -0
  222. package/dist/types/meetings/index.d.ts +365 -0
  223. package/dist/types/meetings/meetings.types.d.ts +4 -0
  224. package/dist/types/meetings/request.d.ts +27 -0
  225. package/dist/types/meetings/util.d.ts +18 -0
  226. package/dist/types/member/index.d.ts +159 -0
  227. package/dist/types/member/types.d.ts +32 -0
  228. package/dist/types/member/util.d.ts +2 -0
  229. package/dist/types/members/collection.d.ts +29 -0
  230. package/dist/types/members/index.d.ts +353 -0
  231. package/dist/types/members/request.d.ts +114 -0
  232. package/dist/types/members/types.d.ts +24 -0
  233. package/dist/types/members/util.d.ts +210 -0
  234. package/dist/types/metrics/constants.d.ts +55 -0
  235. package/dist/types/metrics/index.d.ts +45 -0
  236. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  237. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  238. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  239. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  240. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  241. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  242. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  243. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  244. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  245. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  246. package/dist/types/reachability/index.d.ts +152 -0
  247. package/dist/types/reachability/request.d.ts +37 -0
  248. package/dist/types/reactions/constants.d.ts +3 -0
  249. package/dist/types/reactions/reactions.d.ts +4 -0
  250. package/dist/types/reactions/reactions.type.d.ts +52 -0
  251. package/dist/types/reconnection-manager/index.d.ts +126 -0
  252. package/dist/types/recording-controller/enums.d.ts +7 -0
  253. package/dist/types/recording-controller/index.d.ts +208 -0
  254. package/dist/types/recording-controller/util.d.ts +14 -0
  255. package/dist/types/roap/index.d.ts +77 -0
  256. package/dist/types/roap/request.d.ts +36 -0
  257. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  258. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  259. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  260. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  261. package/dist/types/transcription/index.d.ts +64 -0
  262. package/package.json +26 -23
  263. package/src/annotation/annotation.types.ts +50 -0
  264. package/src/annotation/constants.ts +36 -0
  265. package/src/annotation/index.ts +328 -0
  266. package/src/breakouts/README.md +44 -14
  267. package/src/breakouts/breakout.ts +87 -9
  268. package/src/breakouts/edit-lock-error.ts +25 -0
  269. package/src/breakouts/events.ts +56 -0
  270. package/src/breakouts/index.ts +710 -10
  271. package/src/breakouts/request.ts +55 -0
  272. package/src/breakouts/utils.ts +57 -0
  273. package/src/common/errors/webex-errors.ts +6 -2
  274. package/src/common/logs/logger-proxy.ts +1 -1
  275. package/src/config.ts +2 -7
  276. package/src/constants.ts +157 -21
  277. package/src/controls-options-manager/constants.ts +5 -0
  278. package/src/controls-options-manager/enums.ts +18 -0
  279. package/src/controls-options-manager/index.ts +278 -0
  280. package/src/controls-options-manager/types.ts +59 -0
  281. package/src/controls-options-manager/util.ts +286 -0
  282. package/src/index.ts +39 -0
  283. package/src/interpretation/README.md +60 -0
  284. package/src/interpretation/collection.ts +19 -0
  285. package/src/interpretation/index.ts +318 -0
  286. package/src/interpretation/siLanguage.ts +18 -0
  287. package/src/locus-info/controlsUtils.ts +108 -0
  288. package/src/locus-info/index.ts +316 -38
  289. package/src/locus-info/mediaSharesUtils.ts +48 -0
  290. package/src/locus-info/parser.ts +1 -1
  291. package/src/locus-info/selfUtils.ts +81 -5
  292. package/src/media/index.ts +77 -142
  293. package/src/media/properties.ts +49 -90
  294. package/src/mediaQualityMetrics/config.ts +379 -377
  295. package/src/meeting/in-meeting-actions.ts +151 -3
  296. package/src/meeting/index.ts +1919 -2002
  297. package/src/meeting/locusMediaRequest.ts +309 -0
  298. package/src/meeting/muteState.ts +228 -132
  299. package/src/meeting/request.ts +96 -65
  300. package/src/meeting/util.ts +464 -396
  301. package/src/meeting-info/index.ts +54 -8
  302. package/src/meeting-info/meeting-info-v2.ts +148 -14
  303. package/src/meeting-info/utilv2.ts +13 -3
  304. package/src/meetings/collection.ts +20 -0
  305. package/src/meetings/index.ts +386 -84
  306. package/src/meetings/meetings.types.ts +12 -0
  307. package/src/meetings/request.ts +2 -0
  308. package/src/meetings/util.ts +103 -4
  309. package/src/member/index.ts +49 -0
  310. package/src/member/types.ts +38 -0
  311. package/src/member/util.ts +103 -0
  312. package/src/members/collection.ts +8 -0
  313. package/src/members/index.ts +107 -6
  314. package/src/members/request.ts +97 -17
  315. package/src/members/types.ts +28 -0
  316. package/src/members/util.ts +319 -240
  317. package/src/metrics/constants.ts +2 -4
  318. package/src/metrics/index.ts +1 -490
  319. package/src/multistream/mediaRequestManager.ts +289 -79
  320. package/src/multistream/receiveSlot.ts +55 -18
  321. package/src/multistream/receiveSlotManager.ts +42 -20
  322. package/src/multistream/remoteMedia.ts +28 -2
  323. package/src/multistream/remoteMediaGroup.ts +59 -0
  324. package/src/multistream/remoteMediaManager.ts +113 -32
  325. package/src/networkQualityMonitor/index.ts +6 -6
  326. package/src/reachability/index.ts +62 -15
  327. package/src/reachability/request.ts +10 -5
  328. package/src/reactions/reactions.ts +4 -4
  329. package/src/reactions/reactions.type.ts +3 -3
  330. package/src/reconnection-manager/index.ts +68 -43
  331. package/src/recording-controller/index.ts +20 -2
  332. package/src/recording-controller/util.ts +26 -9
  333. package/src/roap/index.ts +21 -30
  334. package/src/roap/request.ts +101 -95
  335. package/src/roap/turnDiscovery.ts +47 -25
  336. package/src/statsAnalyzer/global.ts +1 -94
  337. package/src/statsAnalyzer/index.ts +376 -386
  338. package/src/statsAnalyzer/mqaUtil.ts +100 -99
  339. package/test/integration/spec/converged-space-meetings.js +233 -0
  340. package/test/integration/spec/journey.js +336 -259
  341. package/test/integration/spec/space-meeting.js +77 -4
  342. package/test/unit/spec/annotation/index.ts +418 -0
  343. package/test/unit/spec/breakouts/breakout.ts +142 -24
  344. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  345. package/test/unit/spec/breakouts/events.ts +89 -0
  346. package/test/unit/spec/breakouts/index.ts +1545 -48
  347. package/test/unit/spec/breakouts/request.ts +104 -0
  348. package/test/unit/spec/breakouts/utils.js +72 -0
  349. package/test/unit/spec/controls-options-manager/index.js +287 -0
  350. package/test/unit/spec/controls-options-manager/util.js +518 -0
  351. package/test/unit/spec/fixture/locus.js +1 -0
  352. package/test/unit/spec/interpretation/collection.ts +15 -0
  353. package/test/unit/spec/interpretation/index.ts +570 -0
  354. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  355. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  356. package/test/unit/spec/locus-info/index.js +707 -22
  357. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  358. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  359. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  360. package/test/unit/spec/media/index.ts +129 -23
  361. package/test/unit/spec/meeting/in-meeting-actions.ts +75 -3
  362. package/test/unit/spec/meeting/index.js +2728 -1397
  363. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  364. package/test/unit/spec/meeting/muteState.js +370 -208
  365. package/test/unit/spec/meeting/request.js +338 -43
  366. package/test/unit/spec/meeting/utils.js +378 -55
  367. package/test/unit/spec/meeting-info/index.js +181 -0
  368. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  369. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  370. package/test/unit/spec/meetings/collection.js +14 -0
  371. package/test/unit/spec/meetings/index.js +846 -121
  372. package/test/unit/spec/meetings/utils.js +206 -2
  373. package/test/unit/spec/member/index.js +58 -4
  374. package/test/unit/spec/member/util.js +415 -33
  375. package/test/unit/spec/members/index.js +320 -1
  376. package/test/unit/spec/members/request.js +206 -27
  377. package/test/unit/spec/members/utils.js +184 -0
  378. package/test/unit/spec/metrics/index.js +1 -50
  379. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  380. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  381. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  382. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  383. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  384. package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
  385. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  386. package/test/unit/spec/reachability/index.ts +125 -8
  387. package/test/unit/spec/reachability/request.js +66 -0
  388. package/test/unit/spec/reconnection-manager/index.js +59 -6
  389. package/test/unit/spec/recording-controller/index.js +294 -218
  390. package/test/unit/spec/recording-controller/util.js +223 -96
  391. package/test/unit/spec/roap/index.ts +26 -51
  392. package/test/unit/spec/roap/request.ts +196 -85
  393. package/test/unit/spec/roap/turnDiscovery.ts +30 -7
  394. package/test/unit/spec/stats-analyzer/index.js +92 -41
  395. package/test/utils/constants.js +9 -0
  396. package/test/utils/integrationTestUtils.js +46 -0
  397. package/test/utils/testUtils.js +0 -45
  398. package/test/utils/webex-config.js +4 -0
  399. package/test/utils/webex-test-users.js +6 -3
  400. package/dist/meeting/effectsState.js +0 -262
  401. package/dist/meeting/effectsState.js.map +0 -1
  402. package/dist/metrics/config.js +0 -299
  403. package/dist/metrics/config.js.map +0 -1
  404. package/dist/multistream/multistreamMedia.js +0 -110
  405. package/dist/multistream/multistreamMedia.js.map +0 -1
  406. package/src/index.js +0 -15
  407. package/src/meeting/effectsState.ts +0 -211
  408. package/src/metrics/config.ts +0 -495
  409. package/src/multistream/multistreamMedia.ts +0 -97
  410. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -3,7 +3,6 @@ import chai from 'chai';
3
3
  import chaiAsPromised from 'chai-as-promised';
4
4
  import sinon from 'sinon';
5
5
  import ReconnectionManager from '@webex/plugin-meetings/src/reconnection-manager';
6
- import Metrics from '@webex/plugin-meetings/src/metrics';
7
6
 
8
7
  const {assert} = chai;
9
8
 
@@ -16,7 +15,6 @@ describe('plugin-meetings', () => {
16
15
  let fakeMeeting;
17
16
 
18
17
  beforeEach(() => {
19
- Metrics.postEvent = sinon.stub();
20
18
  fakeMediaConnection = {
21
19
  initiateOffer: sinon.stub().resolves({}),
22
20
  reconnect: sinon.stub().resolves({}),
@@ -43,8 +41,8 @@ describe('plugin-meetings', () => {
43
41
  webrtcMediaConnection: fakeMediaConnection,
44
42
  },
45
43
  mediaRequestManagers: {
46
- audio: {commit: sinon.stub()},
47
- video: {commit: sinon.stub()},
44
+ audio: {commit: sinon.stub(), clearPreviousRequests: sinon.stub()},
45
+ video: {commit: sinon.stub(), clearPreviousRequests: sinon.stub()},
48
46
  },
49
47
  roap: {
50
48
  doTurnDiscovery: sinon.stub().resolves({
@@ -64,6 +62,11 @@ describe('plugin-meetings', () => {
64
62
  getMeetingByType: sinon.stub().returns(true),
65
63
  syncMeetings: sinon.stub().resolves({}),
66
64
  },
65
+ internal: {
66
+ newMetrics: {
67
+ submitClientEvent: sinon.stub()
68
+ }
69
+ }
67
70
  },
68
71
  };
69
72
  });
@@ -82,27 +85,77 @@ describe('plugin-meetings', () => {
82
85
  credential: 'fake_turn_password',
83
86
  },
84
87
  ]);
88
+
89
+ assert.calledWith(fakeMeeting.webex.internal.newMetrics.submitClientEvent, {
90
+ name: 'client.media.reconnecting',
91
+ options: {
92
+ meetingId: rm.meeting.id,
93
+ },
94
+ });
95
+
96
+ assert.calledWith(fakeMeeting.webex.internal.newMetrics.submitClientEvent, {
97
+ name: 'client.media.recovered',
98
+ payload: {
99
+ recoveredBy: 'new',
100
+ },
101
+ options: {
102
+ meetingId: rm.meeting.id,
103
+ },
104
+ });
85
105
  });
86
106
 
87
- it('does not re-request media for non-multistream meetings', async () => {
107
+ it('does not clear previous requests and re-request media for non-multistream meetings', async () => {
88
108
  fakeMeeting.isMultistream = false;
89
109
  const rm = new ReconnectionManager(fakeMeeting);
90
110
 
91
111
  await rm.reconnect();
92
112
 
113
+ assert.notCalled(fakeMeeting.mediaRequestManagers.audio.clearPreviousRequests);
114
+ assert.notCalled(fakeMeeting.mediaRequestManagers.video.clearPreviousRequests);
93
115
  assert.notCalled(fakeMeeting.mediaRequestManagers.audio.commit);
94
116
  assert.notCalled(fakeMeeting.mediaRequestManagers.video.commit);
95
117
  });
96
118
 
97
- it('does re-request media for multistream meetings', async () => {
119
+ it('does clear previous requests and re-request media for multistream meetings', async () => {
98
120
  fakeMeeting.isMultistream = true;
99
121
  const rm = new ReconnectionManager(fakeMeeting);
100
122
 
101
123
  await rm.reconnect();
102
124
 
125
+ assert.calledOnce(fakeMeeting.mediaRequestManagers.audio.clearPreviousRequests);
126
+ assert.calledOnce(fakeMeeting.mediaRequestManagers.video.clearPreviousRequests);
103
127
  assert.calledOnce(fakeMeeting.mediaRequestManagers.audio.commit);
104
128
  assert.calledOnce(fakeMeeting.mediaRequestManagers.video.commit);
105
129
  });
130
+
131
+
132
+ it('sends the correct client event when reconnection fails', async () => {
133
+ sinon.stub(ReconnectionManager.prototype, 'executeReconnection').rejects();
134
+ fakeMeeting.isMultistream = true;
135
+ const rm = new ReconnectionManager(fakeMeeting);
136
+
137
+ try {
138
+ await rm.reconnect();
139
+ } catch (err) {
140
+ assert.calledWith(fakeMeeting.webex.internal.newMetrics.submitClientEvent, {
141
+ name: 'client.call.aborted',
142
+ payload: {
143
+ errors: [
144
+ {
145
+ category: 'expected',
146
+ errorCode: 2008,
147
+ fatal: true,
148
+ name: 'media-engine',
149
+ shownToUser: false,
150
+ },
151
+ ],
152
+ },
153
+ options: {
154
+ meetingId: rm.meeting.id,
155
+ },
156
+ });
157
+ }
158
+ });
106
159
  });
107
160
 
108
161
  /**
@@ -1,231 +1,307 @@
1
1
  import RecordingController from '@webex/plugin-meetings/src/recording-controller';
2
2
  import sinon from 'sinon';
3
3
  import {assert} from '@webex/test-helper-chai';
4
- import { HTTP_VERBS } from '@webex/plugin-meetings/src/constants';
4
+ import {HTTP_VERBS, SELF_POLICY} from '@webex/plugin-meetings/src/constants';
5
+
5
6
 
6
7
  describe('plugin-meetings', () => {
7
- describe('recording-controller tests', () => {
8
- describe('index', () => {
9
- let request;
10
-
11
- describe('class tests', () => {
12
- it('can set and extract new values later on', () => {
13
- const controller = new RecordingController({});
14
- assert.isUndefined(controller.getServiceUrl());
15
- assert.isUndefined(controller.getSessionId());
16
- assert.isUndefined(controller.getLocusUrl());
17
- assert.isUndefined(controller.getLocusId());
18
- controller.set({
19
- serviceUrl: 'test',
20
- sessionId: 'testId',
21
- locusUrl: 'test/id',
22
- displayHints: [],
23
- })
24
- assert(controller.getServiceUrl(), 'test');
25
- assert(controller.getSessionId(), 'testId');
26
- assert(controller.getLocusUrl(), 'test/id');
27
- assert(controller.getLocusId(), 'id');
28
- });
8
+ describe('recording-controller tests', () => {
9
+ describe('index', () => {
10
+ let request;
11
+
12
+ describe('class tests', () => {
13
+ it('can set and extract new values later on', () => {
14
+ const controller = new RecordingController({});
15
+ assert.isUndefined(controller.getServiceUrl());
16
+ assert.isUndefined(controller.getSessionId());
17
+ assert.isUndefined(controller.getLocusUrl());
18
+ assert.isUndefined(controller.getLocusId());
19
+ controller.set({
20
+ serviceUrl: 'test',
21
+ sessionId: 'testId',
22
+ locusUrl: 'test/id',
23
+ displayHints: [],
24
+ });
25
+ assert(controller.getServiceUrl(), 'test');
26
+ assert(controller.getSessionId(), 'testId');
27
+ assert(controller.getLocusUrl(), 'test/id');
28
+ assert(controller.getLocusId(), 'id');
29
+ });
30
+ });
31
+
32
+ describe('legacy locus style recording', () => {
33
+ const locusUrl = 'locusUrl';
34
+ let controller;
35
+
36
+ beforeEach(() => {
37
+ request = {
38
+ request: sinon.stub().returns(Promise.resolve()),
39
+ };
40
+
41
+ controller = new RecordingController(request);
42
+
43
+ controller.set({
44
+ locusUrl,
45
+ displayHints: [],
46
+ });
47
+ });
48
+
49
+ describe('startRecording', () => {
50
+ it('rejects when correct display hint is not present', () => {
51
+ const result = controller.startRecording();
52
+
53
+ assert.notCalled(request.request);
54
+
55
+ assert.isRejected(result);
56
+ });
57
+
58
+ it('rejects when correct display hint is present but the policy is false', () => {
59
+ controller.setDisplayHints(['RECORDING_CONTROL_START']);
60
+ controller.setUserPolicy({[SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: false});
61
+ const result = controller.startRecording();
62
+
63
+ assert.notCalled(request.request);
64
+
65
+ assert.isRejected(result);
66
+ });
67
+
68
+ it('can start recording when the correct display hint is present', () => {
69
+ controller.setDisplayHints(['RECORDING_CONTROL_START']);
70
+
71
+ const result = controller.startRecording();
72
+
73
+ assert.calledWith(request.request, {
74
+ uri: `${locusUrl}/controls`,
75
+ body: {record: {recording: true, paused: false}},
76
+ method: HTTP_VERBS.PATCH,
29
77
  });
30
78
 
79
+ assert.deepEqual(result, request.request.firstCall.returnValue);
80
+ });
81
+ });
82
+
83
+ describe('stopRecording', () => {
84
+ it('rejects when correct display hint is not present', () => {
85
+ const result = controller.stopRecording();
31
86
 
32
- describe('legacy locus style recording', () => {
33
- const locusUrl = 'locusUrl';
34
- let controller;
35
-
36
- beforeEach(() => {
37
- request = {
38
- request: sinon.stub().returns(Promise.resolve()),
39
- };
40
-
41
- controller = new RecordingController(request);
42
-
43
- controller.set({
44
- locusUrl,
45
- displayHints: [],
46
- })
47
-
48
- });
49
-
50
- describe('startRecording', () => {
51
- it('rejects when correct display hint is not present', () => {
52
- const result = controller.startRecording();
53
-
54
- assert.notCalled(request.request);
55
-
56
- assert.isRejected(result);
57
- });
58
-
59
- it('can start recording when the correct display hint is present', () => {
60
- controller.setDisplayHints(['RECORDING_CONTROL_START']);
61
-
62
- const result = controller.startRecording();
63
-
64
- assert.calledWith(request.request, {uri: `${locusUrl}/controls`, body: {record: {recording: true, paused: false}}, method: HTTP_VERBS.PATCH});
65
-
66
- assert.deepEqual(result, request.request.firstCall.returnValue);
67
- });
68
- });
69
-
70
- describe('stopRecording', () => {
71
- it('rejects when correct display hint is not present', () => {
72
- const result = controller.stopRecording();
73
-
74
- assert.notCalled(request.request);
75
-
76
- assert.isRejected(result);
77
- });
78
-
79
- it('can stop recording when the correct display hint is present', () => {
80
- controller.setDisplayHints(['RECORDING_CONTROL_STOP']);
81
-
82
- const result = controller.stopRecording();
83
-
84
- assert.calledWith(request.request, {uri: `${locusUrl}/controls`, body: {record: {recording: false, paused: false}}, method: HTTP_VERBS.PATCH});
85
-
86
- assert.deepEqual(result, request.request.firstCall.returnValue);
87
- });
88
- });
89
-
90
- describe('pauseRecording', () => {
91
- it('rejects when correct display hint is not present', () => {
92
- const result = controller.pauseRecording();
93
-
94
- assert.notCalled(request.request);
95
-
96
- assert.isRejected(result);
97
- });
98
-
99
- it('can pause recording when the correct display hint is present', () => {
100
- controller.setDisplayHints(['RECORDING_CONTROL_PAUSE']);
101
-
102
- const result = controller.pauseRecording();
103
-
104
- assert.calledWith(request.request, {uri: `${locusUrl}/controls`, body: {record: {recording: true, paused: true}}, method: HTTP_VERBS.PATCH});
105
-
106
- assert.deepEqual(result, request.request.firstCall.returnValue);
107
- });
108
- });
109
-
110
- describe('resumeRecording', () => {
111
- it('rejects when correct display hint is not present', () => {
112
- const result = controller.pauseRecording();
113
-
114
- assert.notCalled(request.request);
115
-
116
- assert.isRejected(result);
117
- });
118
-
119
- it('can resume recording when the correct display hint is present', () => {
120
- controller.setDisplayHints(['RECORDING_CONTROL_RESUME']);
121
-
122
- const result = controller.resumeRecording();
123
-
124
- assert.calledWith(request.request, {uri: `${locusUrl}/controls`, body: {record: {recording: true, paused: false}}, method: HTTP_VERBS.PATCH});
125
-
126
- assert.deepEqual(result, request.request.firstCall.returnValue);
127
- });
128
- });
87
+ assert.notCalled(request.request);
88
+
89
+ assert.isRejected(result);
90
+ });
91
+
92
+ it('rejects when correct display hint is present but the policy is false', () => {
93
+ controller.setDisplayHints(['RECORDING_CONTROL_STOP']);
94
+ controller.setUserPolicy({[SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: false})
95
+ const result = controller.stopRecording();
96
+
97
+ assert.notCalled(request.request);
98
+
99
+ assert.isRejected(result);
100
+ });
101
+
102
+ it('can stop recording when the correct display hint is present', () => {
103
+ controller.setDisplayHints(['RECORDING_CONTROL_STOP']);
104
+
105
+ const result = controller.stopRecording();
106
+
107
+ assert.calledWith(request.request, {
108
+ uri: `${locusUrl}/controls`,
109
+ body: {record: {recording: false, paused: false}},
110
+ method: HTTP_VERBS.PATCH,
111
+ });
112
+
113
+ assert.deepEqual(result, request.request.firstCall.returnValue);
114
+ });
115
+ });
116
+
117
+ describe('pauseRecording', () => {
118
+ it('rejects when correct display hint is not present', () => {
119
+ const result = controller.pauseRecording();
120
+
121
+ assert.notCalled(request.request);
122
+
123
+ assert.isRejected(result);
124
+ });
125
+
126
+ it('rejects when correct display hint is present but the policy is false', () => {
127
+ controller.setDisplayHints(['RECORDING_CONTROL_PAUSE']);
128
+ controller.setUserPolicy({
129
+ [SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: false,
130
+ });
131
+ const result = controller.pauseRecording();
132
+
133
+ assert.notCalled(request.request);
134
+
135
+ assert.isRejected(result);
136
+ });
137
+
138
+ it('can pause recording when the correct display hint is present', () => {
139
+ controller.setDisplayHints(['RECORDING_CONTROL_PAUSE']);
140
+
141
+ const result = controller.pauseRecording();
142
+
143
+ assert.calledWith(request.request, {
144
+ uri: `${locusUrl}/controls`,
145
+ body: {record: {recording: true, paused: true}},
146
+ method: HTTP_VERBS.PATCH,
129
147
  });
130
148
 
131
- describe('recording streaming service style tests', () => {
132
- let controller;
133
-
134
- beforeEach(() => {
135
- request = {
136
- request: sinon.stub().returns(Promise.resolve()),
137
- };
138
-
139
- controller = new RecordingController(request);
140
-
141
- controller.set({
142
- serviceUrl: 'test',
143
- sessionId: 'testId',
144
- locusUrl: 'test/id',
145
- displayHints: [],
146
- })
147
- });
148
-
149
- describe('startRecording', () => {
150
- it('rejects when correct display hint is not present', () => {
151
- const result = controller.startRecording();
152
-
153
- assert.notCalled(request.request);
154
-
155
- assert.isRejected(result);
156
- });
157
-
158
- it('can start recording when the correct display hint is present', () => {
159
- controller.setDisplayHints(['RECORDING_CONTROL_START']);
160
-
161
- const result = controller.startRecording();
162
-
163
- assert.calledWith(request.request, {uri: `test/loci/id/recording`, body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'start'}}, method: HTTP_VERBS.PUT});
164
-
165
- assert.deepEqual(result, request.request.firstCall.returnValue);
166
- });
167
- });
168
-
169
- describe('stopRecording', () => {
170
- it('rejects when correct display hint is not present', () => {
171
- const result = controller.pauseRecording();
172
-
173
- assert.notCalled(request.request);
174
-
175
- assert.isRejected(result);
176
- });
177
-
178
- it('can start recording when the correct display hint is present', () => {
179
- controller.setDisplayHints(['RECORDING_CONTROL_STOP']);
180
-
181
- const result = controller.stopRecording();
182
-
183
- assert.calledWith(request.request, {uri: `test/loci/id/recording`, body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'stop'}}, method: HTTP_VERBS.PUT});
184
-
185
- assert.deepEqual(result, request.request.firstCall.returnValue);
186
- });
187
- });
188
-
189
- describe('pauseRecording', () => {
190
- it('rejects when correct display hint is not present', () => {
191
- const result = controller.pauseRecording();
192
-
193
- assert.notCalled(request.request);
194
-
195
- assert.isRejected(result);
196
- });
197
-
198
- it('can pause recording when the correct display hint is present', () => {
199
- controller.setDisplayHints(['RECORDING_CONTROL_PAUSE']);
200
-
201
- const result = controller.pauseRecording();
202
-
203
- assert.calledWith(request.request, {uri: `test/loci/id/recording`, body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'pause'}}, method: HTTP_VERBS.PUT});
204
-
205
- assert.deepEqual(result, request.request.firstCall.returnValue);
206
- });
207
- });
208
-
209
- describe('resumeRecording', () => {
210
- it('rejects when correct display hint is not present', () => {
211
- const result = controller.resumeRecording();
212
-
213
- assert.notCalled(request.request);
214
-
215
- assert.isRejected(result);
216
- });
217
-
218
- it('can resume recording when the correct display hint is present', () => {
219
- controller.setDisplayHints(['RECORDING_CONTROL_RESUME']);
220
-
221
- const result = controller.resumeRecording();
222
-
223
- assert.calledWith(request.request, {uri: `test/loci/id/recording`, body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'resume'}}, method: HTTP_VERBS.PUT});
224
-
225
- assert.deepEqual(result, request.request.firstCall.returnValue);
226
- });
227
- });
149
+ assert.deepEqual(result, request.request.firstCall.returnValue);
150
+ });
151
+ });
152
+
153
+ describe('resumeRecording', () => {
154
+ it('rejects when correct display hint is not present', () => {
155
+ const result = controller.pauseRecording();
156
+
157
+ assert.notCalled(request.request);
158
+
159
+ assert.isRejected(result);
160
+ });
161
+
162
+ it('rejects when correct display hint is present but the policy is false', () => {
163
+ controller.setDisplayHints(['RECORDING_CONTROL_RESUME']);
164
+ controller.setUserPolicy({
165
+ [SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: false,
228
166
  });
167
+ const result = controller.pauseRecording();
168
+
169
+ assert.notCalled(request.request);
170
+
171
+ assert.isRejected(result);
172
+ });
173
+
174
+
175
+ it('can resume recording when the correct display hint is present', () => {
176
+ controller.setDisplayHints(['RECORDING_CONTROL_RESUME']);
177
+
178
+ const result = controller.resumeRecording();
179
+
180
+ assert.calledWith(request.request, {
181
+ uri: `${locusUrl}/controls`,
182
+ body: {record: {recording: true, paused: false}},
183
+ method: HTTP_VERBS.PATCH,
184
+ });
185
+
186
+ assert.deepEqual(result, request.request.firstCall.returnValue);
187
+ });
188
+ });
189
+ });
190
+
191
+ describe('recording streaming service style tests', () => {
192
+ let controller;
193
+
194
+ beforeEach(() => {
195
+ request = {
196
+ request: sinon.stub().returns(Promise.resolve()),
197
+ };
198
+
199
+ controller = new RecordingController(request);
200
+
201
+ controller.set({
202
+ serviceUrl: 'test',
203
+ sessionId: 'testId',
204
+ locusUrl: 'test/id',
205
+ displayHints: [],
206
+ });
207
+ });
208
+
209
+ describe('startRecording', () => {
210
+ it('rejects when correct display hint is not present', () => {
211
+ const result = controller.startRecording();
212
+
213
+ assert.notCalled(request.request);
214
+
215
+ assert.isRejected(result);
216
+ });
217
+
218
+ it('can start recording when the correct display hint is present', () => {
219
+ controller.setDisplayHints(['RECORDING_CONTROL_START']);
220
+
221
+ const result = controller.startRecording();
222
+
223
+ assert.calledWith(request.request, {
224
+ uri: `test/loci/id/recording`,
225
+ body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'start'}},
226
+ method: HTTP_VERBS.PUT,
227
+ });
228
+
229
+ assert.deepEqual(result, request.request.firstCall.returnValue);
230
+ });
231
+ });
232
+
233
+ describe('stopRecording', () => {
234
+ it('rejects when correct display hint is not present', () => {
235
+ const result = controller.pauseRecording();
236
+
237
+ assert.notCalled(request.request);
238
+
239
+ assert.isRejected(result);
240
+ });
241
+
242
+ it('can start recording when the correct display hint is present', () => {
243
+ controller.setDisplayHints(['RECORDING_CONTROL_STOP']);
244
+
245
+ const result = controller.stopRecording();
246
+
247
+ assert.calledWith(request.request, {
248
+ uri: `test/loci/id/recording`,
249
+ body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'stop'}},
250
+ method: HTTP_VERBS.PUT,
251
+ });
252
+
253
+ assert.deepEqual(result, request.request.firstCall.returnValue);
254
+ });
255
+ });
256
+
257
+ describe('pauseRecording', () => {
258
+ it('rejects when correct display hint is not present', () => {
259
+ const result = controller.pauseRecording();
260
+
261
+ assert.notCalled(request.request);
262
+
263
+ assert.isRejected(result);
264
+ });
265
+
266
+ it('can pause recording when the correct display hint is present', () => {
267
+ controller.setDisplayHints(['RECORDING_CONTROL_PAUSE']);
268
+
269
+ const result = controller.pauseRecording();
270
+
271
+ assert.calledWith(request.request, {
272
+ uri: `test/loci/id/recording`,
273
+ body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'pause'}},
274
+ method: HTTP_VERBS.PUT,
275
+ });
276
+
277
+ assert.deepEqual(result, request.request.firstCall.returnValue);
278
+ });
279
+ });
280
+
281
+ describe('resumeRecording', () => {
282
+ it('rejects when correct display hint is not present', () => {
283
+ const result = controller.resumeRecording();
284
+
285
+ assert.notCalled(request.request);
286
+
287
+ assert.isRejected(result);
288
+ });
289
+
290
+ it('can resume recording when the correct display hint is present', () => {
291
+ controller.setDisplayHints(['RECORDING_CONTROL_RESUME']);
292
+
293
+ const result = controller.resumeRecording();
294
+
295
+ assert.calledWith(request.request, {
296
+ uri: `test/loci/id/recording`,
297
+ body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'resume'}},
298
+ method: HTTP_VERBS.PUT,
299
+ });
300
+
301
+ assert.deepEqual(result, request.request.firstCall.returnValue);
229
302
  });
303
+ });
304
+ });
230
305
  });
231
- });
306
+ });
307
+ });