@webex/plugin-meetings 3.0.0-beta.3 → 3.0.0-beta.31

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 (493) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +137 -0
  4. package/dist/breakouts/breakout.js.map +1 -0
  5. package/dist/breakouts/collection.js +23 -0
  6. package/dist/breakouts/collection.js.map +1 -0
  7. package/dist/breakouts/index.js +374 -0
  8. package/dist/breakouts/index.js.map +1 -0
  9. package/dist/breakouts/request.js +78 -0
  10. package/dist/breakouts/request.js.map +1 -0
  11. package/dist/breakouts/utils.js +23 -0
  12. package/dist/breakouts/utils.js.map +1 -0
  13. package/dist/common/browser-detection.js +1 -20
  14. package/dist/common/browser-detection.js.map +1 -1
  15. package/dist/common/collection.js +5 -20
  16. package/dist/common/collection.js.map +1 -1
  17. package/dist/common/config.js +0 -7
  18. package/dist/common/config.js.map +1 -1
  19. package/dist/common/errors/captcha-error.js +10 -24
  20. package/dist/common/errors/captcha-error.js.map +1 -1
  21. package/dist/common/errors/intent-to-join.js +11 -24
  22. package/dist/common/errors/intent-to-join.js.map +1 -1
  23. package/dist/common/errors/join-meeting.js +12 -25
  24. package/dist/common/errors/join-meeting.js.map +1 -1
  25. package/dist/common/errors/media.js +10 -24
  26. package/dist/common/errors/media.js.map +1 -1
  27. package/dist/common/errors/parameter.js +5 -33
  28. package/dist/common/errors/parameter.js.map +1 -1
  29. package/dist/common/errors/password-error.js +10 -24
  30. package/dist/common/errors/password-error.js.map +1 -1
  31. package/dist/common/errors/permission.js +9 -23
  32. package/dist/common/errors/permission.js.map +1 -1
  33. package/dist/common/errors/reconnection-in-progress.js +0 -17
  34. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  35. package/dist/common/errors/reconnection.js +10 -24
  36. package/dist/common/errors/reconnection.js.map +1 -1
  37. package/dist/common/errors/stats.js +10 -24
  38. package/dist/common/errors/stats.js.map +1 -1
  39. package/dist/common/errors/webex-errors.js +6 -41
  40. package/dist/common/errors/webex-errors.js.map +1 -1
  41. package/dist/common/errors/webex-meetings-error.js +5 -25
  42. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  43. package/dist/common/events/events-scope.js +0 -22
  44. package/dist/common/events/events-scope.js.map +1 -1
  45. package/dist/common/events/events.js +0 -23
  46. package/dist/common/events/events.js.map +1 -1
  47. package/dist/common/events/trigger-proxy.js +0 -12
  48. package/dist/common/events/trigger-proxy.js.map +1 -1
  49. package/dist/common/events/util.js +0 -15
  50. package/dist/common/events/util.js.map +1 -1
  51. package/dist/common/logs/logger-config.js +0 -4
  52. package/dist/common/logs/logger-config.js.map +1 -1
  53. package/dist/common/logs/logger-proxy.js +1 -8
  54. package/dist/common/logs/logger-proxy.js.map +1 -1
  55. package/dist/common/logs/request.js +37 -60
  56. package/dist/common/logs/request.js.map +1 -1
  57. package/dist/common/queue.js +4 -14
  58. package/dist/common/queue.js.map +1 -1
  59. package/dist/config.js +6 -6
  60. package/dist/config.js.map +1 -1
  61. package/dist/constants.js +92 -49
  62. package/dist/constants.js.map +1 -1
  63. package/dist/controls-options-manager/constants.js +14 -0
  64. package/dist/controls-options-manager/constants.js.map +1 -0
  65. package/dist/controls-options-manager/enums.js +15 -0
  66. package/dist/controls-options-manager/enums.js.map +1 -0
  67. package/dist/controls-options-manager/index.js +203 -0
  68. package/dist/controls-options-manager/index.js.map +1 -0
  69. package/dist/controls-options-manager/util.js +28 -0
  70. package/dist/controls-options-manager/util.js.map +1 -0
  71. package/dist/index.js +4 -18
  72. package/dist/index.js.map +1 -1
  73. package/dist/locus-info/controlsUtils.js +12 -29
  74. package/dist/locus-info/controlsUtils.js.map +1 -1
  75. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  76. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  77. package/dist/locus-info/fullState.js +0 -15
  78. package/dist/locus-info/fullState.js.map +1 -1
  79. package/dist/locus-info/hostUtils.js +4 -12
  80. package/dist/locus-info/hostUtils.js.map +1 -1
  81. package/dist/locus-info/index.js +186 -192
  82. package/dist/locus-info/index.js.map +1 -1
  83. package/dist/locus-info/infoUtils.js +3 -37
  84. package/dist/locus-info/infoUtils.js.map +1 -1
  85. package/dist/locus-info/mediaSharesUtils.js +12 -38
  86. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  87. package/dist/locus-info/parser.js +92 -118
  88. package/dist/locus-info/parser.js.map +1 -1
  89. package/dist/locus-info/selfUtils.js +34 -91
  90. package/dist/locus-info/selfUtils.js.map +1 -1
  91. package/dist/media/index.js +64 -137
  92. package/dist/media/index.js.map +1 -1
  93. package/dist/media/properties.js +80 -114
  94. package/dist/media/properties.js.map +1 -1
  95. package/dist/media/util.js +2 -9
  96. package/dist/media/util.js.map +1 -1
  97. package/dist/mediaQualityMetrics/config.js +505 -495
  98. package/dist/mediaQualityMetrics/config.js.map +1 -1
  99. package/dist/meeting/effectsState.js +125 -190
  100. package/dist/meeting/effectsState.js.map +1 -1
  101. package/dist/meeting/in-meeting-actions.js +13 -14
  102. package/dist/meeting/in-meeting-actions.js.map +1 -1
  103. package/dist/meeting/index.js +2142 -2101
  104. package/dist/meeting/index.js.map +1 -1
  105. package/dist/meeting/muteState.js +39 -80
  106. package/dist/meeting/muteState.js.map +1 -1
  107. package/dist/meeting/request.js +224 -230
  108. package/dist/meeting/request.js.map +1 -1
  109. package/dist/meeting/request.type.js +7 -0
  110. package/dist/meeting/request.type.js.map +1 -0
  111. package/dist/meeting/state.js +21 -31
  112. package/dist/meeting/state.js.map +1 -1
  113. package/dist/meeting/util.js +43 -215
  114. package/dist/meeting/util.js.map +1 -1
  115. package/dist/meeting-info/collection.js +6 -25
  116. package/dist/meeting-info/collection.js.map +1 -1
  117. package/dist/meeting-info/index.js +14 -32
  118. package/dist/meeting-info/index.js.map +1 -1
  119. package/dist/meeting-info/meeting-info-v2.js +193 -268
  120. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  121. package/dist/meeting-info/request.js +3 -15
  122. package/dist/meeting-info/request.js.map +1 -1
  123. package/dist/meeting-info/util.js +98 -183
  124. package/dist/meeting-info/util.js.map +1 -1
  125. package/dist/meeting-info/utilv2.js +137 -228
  126. package/dist/meeting-info/utilv2.js.map +1 -1
  127. package/dist/meetings/collection.js +5 -20
  128. package/dist/meetings/collection.js.map +1 -1
  129. package/dist/meetings/index.js +490 -560
  130. package/dist/meetings/index.js.map +1 -1
  131. package/dist/meetings/request.js +24 -41
  132. package/dist/meetings/request.js.map +1 -1
  133. package/dist/meetings/util.js +116 -155
  134. package/dist/meetings/util.js.map +1 -1
  135. package/dist/member/index.js +78 -86
  136. package/dist/member/index.js.map +1 -1
  137. package/dist/member/util.js +31 -68
  138. package/dist/member/util.js.map +1 -1
  139. package/dist/members/collection.js +3 -12
  140. package/dist/members/collection.js.map +1 -1
  141. package/dist/members/index.js +94 -200
  142. package/dist/members/index.js.map +1 -1
  143. package/dist/members/request.js +16 -39
  144. package/dist/members/request.js.map +1 -1
  145. package/dist/members/util.js +9 -38
  146. package/dist/members/util.js.map +1 -1
  147. package/dist/metrics/config.js +0 -2
  148. package/dist/metrics/config.js.map +1 -1
  149. package/dist/metrics/constants.js +1 -2
  150. package/dist/metrics/constants.js.map +1 -1
  151. package/dist/metrics/index.js +55 -135
  152. package/dist/metrics/index.js.map +1 -1
  153. package/dist/multistream/mediaRequestManager.js +57 -33
  154. package/dist/multistream/mediaRequestManager.js.map +1 -1
  155. package/dist/multistream/receiveSlot.js +30 -50
  156. package/dist/multistream/receiveSlot.js.map +1 -1
  157. package/dist/multistream/receiveSlotManager.js +60 -82
  158. package/dist/multistream/receiveSlotManager.js.map +1 -1
  159. package/dist/multistream/remoteMedia.js +18 -58
  160. package/dist/multistream/remoteMedia.js.map +1 -1
  161. package/dist/multistream/remoteMediaGroup.js +6 -40
  162. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  163. package/dist/multistream/remoteMediaManager.js +360 -413
  164. package/dist/multistream/remoteMediaManager.js.map +1 -1
  165. package/dist/networkQualityMonitor/index.js +40 -59
  166. package/dist/networkQualityMonitor/index.js.map +1 -1
  167. package/dist/personal-meeting-room/index.js +21 -45
  168. package/dist/personal-meeting-room/index.js.map +1 -1
  169. package/dist/personal-meeting-room/request.js +1 -31
  170. package/dist/personal-meeting-room/request.js.map +1 -1
  171. package/dist/personal-meeting-room/util.js +0 -13
  172. package/dist/personal-meeting-room/util.js.map +1 -1
  173. package/dist/reachability/index.js +138 -182
  174. package/dist/reachability/index.js.map +1 -1
  175. package/dist/reachability/request.js +3 -18
  176. package/dist/reachability/request.js.map +1 -1
  177. package/dist/reactions/constants.js +13 -0
  178. package/dist/reactions/constants.js.map +1 -0
  179. package/dist/reactions/reactions.js +109 -0
  180. package/dist/reactions/reactions.js.map +1 -0
  181. package/dist/reactions/reactions.type.js +36 -0
  182. package/dist/reactions/reactions.type.js.map +1 -0
  183. package/dist/reconnection-manager/index.js +322 -455
  184. package/dist/reconnection-manager/index.js.map +1 -1
  185. package/dist/recording-controller/enums.js +17 -0
  186. package/dist/recording-controller/enums.js.map +1 -0
  187. package/dist/recording-controller/index.js +343 -0
  188. package/dist/recording-controller/index.js.map +1 -0
  189. package/dist/recording-controller/util.js +63 -0
  190. package/dist/recording-controller/util.js.map +1 -0
  191. package/dist/roap/index.js +39 -64
  192. package/dist/roap/index.js.map +1 -1
  193. package/dist/roap/request.js +94 -113
  194. package/dist/roap/request.js.map +1 -1
  195. package/dist/roap/turnDiscovery.js +85 -94
  196. package/dist/roap/turnDiscovery.js.map +1 -1
  197. package/dist/statsAnalyzer/global.js +1 -95
  198. package/dist/statsAnalyzer/global.js.map +1 -1
  199. package/dist/statsAnalyzer/index.js +357 -449
  200. package/dist/statsAnalyzer/index.js.map +1 -1
  201. package/dist/statsAnalyzer/mqaUtil.js +137 -81
  202. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  203. package/dist/transcription/index.js +22 -47
  204. package/dist/transcription/index.js.map +1 -1
  205. package/dist/types/breakouts/breakout.d.ts +8 -0
  206. package/dist/types/breakouts/collection.d.ts +5 -0
  207. package/dist/types/breakouts/index.d.ts +5 -0
  208. package/dist/types/breakouts/request.d.ts +22 -0
  209. package/dist/types/breakouts/utils.d.ts +1 -0
  210. package/dist/types/common/browser-detection.d.ts +9 -0
  211. package/dist/types/common/collection.d.ts +48 -0
  212. package/dist/types/common/config.d.ts +2 -0
  213. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  214. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  215. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  216. package/dist/types/common/errors/media.d.ts +15 -0
  217. package/dist/types/common/errors/parameter.d.ts +15 -0
  218. package/dist/types/common/errors/password-error.d.ts +15 -0
  219. package/dist/types/common/errors/permission.d.ts +14 -0
  220. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  221. package/dist/types/common/errors/reconnection.d.ts +15 -0
  222. package/dist/types/common/errors/stats.d.ts +15 -0
  223. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  224. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  225. package/dist/types/common/events/events-scope.d.ts +17 -0
  226. package/dist/types/common/events/events.d.ts +12 -0
  227. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  228. package/dist/types/common/events/util.d.ts +2 -0
  229. package/dist/types/common/logs/logger-config.d.ts +2 -0
  230. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  231. package/dist/types/common/logs/request.d.ts +34 -0
  232. package/dist/types/common/queue.d.ts +32 -0
  233. package/dist/types/config.d.ts +77 -0
  234. package/dist/types/constants.d.ts +899 -0
  235. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  236. package/dist/types/controls-options-manager/enums.d.ts +5 -0
  237. package/dist/types/controls-options-manager/index.d.ts +120 -0
  238. package/dist/types/controls-options-manager/util.d.ts +7 -0
  239. package/dist/types/index.d.ts +5 -0
  240. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  241. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  242. package/dist/types/locus-info/fullState.d.ts +2 -0
  243. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  244. package/dist/types/locus-info/index.d.ts +269 -0
  245. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  246. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  247. package/dist/types/locus-info/parser.d.ts +212 -0
  248. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  249. package/dist/types/media/index.d.ts +32 -0
  250. package/dist/types/media/properties.d.ts +107 -0
  251. package/dist/types/media/util.d.ts +2 -0
  252. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  253. package/dist/types/meeting/effectsState.d.ts +42 -0
  254. package/dist/types/meeting/in-meeting-actions.d.ts +83 -0
  255. package/dist/types/meeting/index.d.ts +1724 -0
  256. package/dist/types/meeting/muteState.d.ts +108 -0
  257. package/dist/types/meeting/request.d.ts +261 -0
  258. package/dist/types/meeting/request.type.d.ts +11 -0
  259. package/dist/types/meeting/state.d.ts +9 -0
  260. package/dist/types/meeting/util.d.ts +2 -0
  261. package/dist/types/meeting-info/collection.d.ts +20 -0
  262. package/dist/types/meeting-info/index.d.ts +57 -0
  263. package/dist/types/meeting-info/meeting-info-v2.d.ts +93 -0
  264. package/dist/types/meeting-info/request.d.ts +22 -0
  265. package/dist/types/meeting-info/util.d.ts +2 -0
  266. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  267. package/dist/types/meetings/collection.d.ts +23 -0
  268. package/dist/types/meetings/index.d.ts +297 -0
  269. package/dist/types/meetings/request.d.ts +27 -0
  270. package/dist/types/meetings/util.d.ts +18 -0
  271. package/dist/types/member/index.d.ts +146 -0
  272. package/dist/types/member/util.d.ts +2 -0
  273. package/dist/types/members/collection.d.ts +24 -0
  274. package/dist/types/members/index.d.ts +320 -0
  275. package/dist/types/members/request.d.ts +50 -0
  276. package/dist/types/members/util.d.ts +2 -0
  277. package/dist/types/metrics/config.d.ts +178 -0
  278. package/dist/types/metrics/constants.d.ts +57 -0
  279. package/dist/types/metrics/index.d.ts +160 -0
  280. package/dist/types/multistream/mediaRequestManager.d.ts +50 -0
  281. package/dist/types/multistream/receiveSlot.d.ts +66 -0
  282. package/dist/types/multistream/receiveSlotManager.d.ts +46 -0
  283. package/dist/types/multistream/remoteMedia.d.ts +93 -0
  284. package/dist/types/multistream/remoteMediaGroup.d.ts +56 -0
  285. package/dist/types/multistream/remoteMediaManager.d.ts +241 -0
  286. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  287. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  288. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  289. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  290. package/dist/types/reachability/index.d.ts +140 -0
  291. package/dist/types/reachability/request.d.ts +35 -0
  292. package/dist/types/reactions/constants.d.ts +3 -0
  293. package/dist/types/reactions/reactions.d.ts +4 -0
  294. package/dist/types/reactions/reactions.type.d.ts +52 -0
  295. package/dist/types/reconnection-manager/index.d.ts +117 -0
  296. package/dist/types/recording-controller/enums.d.ts +7 -0
  297. package/dist/types/recording-controller/index.d.ts +193 -0
  298. package/dist/types/recording-controller/util.d.ts +13 -0
  299. package/dist/types/roap/index.d.ts +77 -0
  300. package/dist/types/roap/request.d.ts +35 -0
  301. package/dist/types/roap/turnDiscovery.d.ts +74 -0
  302. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  303. package/dist/types/statsAnalyzer/index.d.ts +195 -0
  304. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  305. package/dist/types/transcription/index.d.ts +64 -0
  306. package/internal-README.md +7 -6
  307. package/package.json +25 -20
  308. package/src/breakouts/README.md +190 -0
  309. package/src/breakouts/breakout.ts +130 -0
  310. package/src/breakouts/collection.ts +19 -0
  311. package/src/breakouts/index.ts +353 -0
  312. package/src/breakouts/request.ts +55 -0
  313. package/src/breakouts/utils.ts +15 -0
  314. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  315. package/src/common/collection.ts +9 -7
  316. package/src/common/{config.js → config.ts} +1 -1
  317. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  318. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  319. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  320. package/src/common/errors/{media.js → media.ts} +11 -7
  321. package/src/common/errors/parameter.ts +11 -7
  322. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  323. package/src/common/errors/{permission.js → permission.ts} +10 -6
  324. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  325. package/src/common/errors/{stats.js → stats.ts} +11 -7
  326. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  327. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  328. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  329. package/src/common/events/{events.js → events.ts} +5 -1
  330. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  331. package/src/common/events/{util.js → util.ts} +2 -3
  332. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  333. package/src/common/logs/logger-proxy.ts +44 -0
  334. package/src/common/logs/{request.js → request.ts} +22 -9
  335. package/src/common/queue.ts +1 -2
  336. package/src/{config.js → config.ts} +17 -12
  337. package/src/constants.ts +44 -4
  338. package/src/controls-options-manager/constants.ts +5 -0
  339. package/src/controls-options-manager/enums.ts +6 -0
  340. package/src/controls-options-manager/index.ts +183 -0
  341. package/src/controls-options-manager/util.ts +20 -0
  342. package/src/index.js +2 -1
  343. package/src/locus-info/controlsUtils.ts +114 -0
  344. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  345. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  346. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  347. package/src/locus-info/{index.js → index.ts} +150 -66
  348. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  349. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  350. package/src/locus-info/{parser.js → parser.ts} +67 -79
  351. package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
  352. package/src/media/{index.js → index.ts} +176 -157
  353. package/src/media/{properties.js → properties.ts} +48 -31
  354. package/src/media/{util.js → util.ts} +2 -2
  355. package/src/mediaQualityMetrics/config.ts +384 -0
  356. package/src/meeting/{effectsState.js → effectsState.ts} +47 -41
  357. package/src/meeting/in-meeting-actions.ts +31 -3
  358. package/src/meeting/{index.js → index.ts} +2479 -1466
  359. package/src/meeting/{muteState.js → muteState.ts} +80 -45
  360. package/src/meeting/{request.js → request.ts} +292 -142
  361. package/src/meeting/request.type.ts +13 -0
  362. package/src/meeting/{state.js → state.ts} +50 -35
  363. package/src/meeting/{util.js → util.ts} +112 -115
  364. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  365. package/src/meeting-info/{index.js → index.ts} +42 -36
  366. package/src/meeting-info/meeting-info-v2.ts +273 -0
  367. package/src/meeting-info/{request.js → request.ts} +14 -4
  368. package/src/meeting-info/{util.js → util.ts} +60 -51
  369. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  370. package/src/meetings/{collection.js → collection.ts} +6 -3
  371. package/src/meetings/index.ts +1159 -0
  372. package/src/meetings/{request.js → request.ts} +32 -25
  373. package/src/meetings/{util.js → util.ts} +58 -32
  374. package/src/member/{index.js → index.ts} +102 -56
  375. package/src/member/{util.js → util.ts} +52 -25
  376. package/src/members/{collection.js → collection.ts} +2 -2
  377. package/src/members/{index.js → index.ts} +221 -142
  378. package/src/members/{request.js → request.ts} +60 -16
  379. package/src/members/{util.js → util.ts} +50 -48
  380. package/src/metrics/{config.js → config.ts} +254 -83
  381. package/src/metrics/{constants.js → constants.ts} +0 -2
  382. package/src/metrics/{index.js → index.ts} +106 -74
  383. package/src/multistream/mediaRequestManager.ts +79 -15
  384. package/src/multistream/receiveSlot.ts +42 -13
  385. package/src/multistream/receiveSlotManager.ts +35 -21
  386. package/src/multistream/remoteMedia.ts +15 -5
  387. package/src/multistream/remoteMediaGroup.ts +4 -3
  388. package/src/multistream/remoteMediaManager.ts +152 -36
  389. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  390. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  391. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  392. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  393. package/src/reachability/{index.js → index.ts} +99 -83
  394. package/src/reachability/request.ts +39 -33
  395. package/src/reactions/constants.ts +4 -0
  396. package/src/reactions/reactions.ts +104 -0
  397. package/src/reactions/reactions.type.ts +62 -0
  398. package/src/reconnection-manager/{index.js → index.ts} +195 -102
  399. package/src/recording-controller/enums.ts +8 -0
  400. package/src/recording-controller/index.ts +315 -0
  401. package/src/recording-controller/util.ts +58 -0
  402. package/src/roap/{index.js → index.ts} +73 -56
  403. package/src/roap/request.ts +157 -0
  404. package/src/roap/turnDiscovery.ts +77 -37
  405. package/src/statsAnalyzer/global.ts +37 -0
  406. package/src/statsAnalyzer/index.ts +1234 -0
  407. package/src/statsAnalyzer/mqaUtil.ts +293 -0
  408. package/src/transcription/{index.js → index.ts} +46 -39
  409. package/test/integration/spec/converged-space-meetings.js +176 -0
  410. package/test/integration/spec/journey.js +664 -463
  411. package/test/integration/spec/space-meeting.js +320 -206
  412. package/test/integration/spec/transcription.js +7 -8
  413. package/test/unit/spec/breakouts/breakout.ts +147 -0
  414. package/test/unit/spec/breakouts/collection.ts +15 -0
  415. package/test/unit/spec/breakouts/index.ts +464 -0
  416. package/test/unit/spec/breakouts/request.ts +104 -0
  417. package/test/unit/spec/breakouts/utils.js +21 -0
  418. package/test/unit/spec/common/browser-detection.js +9 -28
  419. package/test/unit/spec/controls-options-manager/index.js +124 -0
  420. package/test/unit/spec/controls-options-manager/util.js +66 -0
  421. package/test/unit/spec/fixture/locus.js +92 -90
  422. package/test/unit/spec/locus-info/controlsUtils.js +25 -5
  423. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  424. package/test/unit/spec/locus-info/index.js +104 -2
  425. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  426. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  427. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  428. package/test/unit/spec/locus-info/parser.js +3 -9
  429. package/test/unit/spec/locus-info/selfConstant.js +97 -103
  430. package/test/unit/spec/locus-info/selfUtils.js +105 -12
  431. package/test/unit/spec/media/index.ts +31 -47
  432. package/test/unit/spec/media/properties.ts +9 -9
  433. package/test/unit/spec/meeting/effectsState.js +39 -45
  434. package/test/unit/spec/meeting/in-meeting-actions.ts +13 -2
  435. package/test/unit/spec/meeting/index.js +2214 -746
  436. package/test/unit/spec/meeting/muteState.js +43 -34
  437. package/test/unit/spec/meeting/request.js +115 -44
  438. package/test/unit/spec/meeting/utils.js +104 -171
  439. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  440. package/test/unit/spec/meeting-info/request.js +7 -9
  441. package/test/unit/spec/meeting-info/util.js +11 -12
  442. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  443. package/test/unit/spec/meetings/collection.js +1 -1
  444. package/test/unit/spec/meetings/index.js +439 -257
  445. package/test/unit/spec/meetings/utils.js +14 -12
  446. package/test/unit/spec/member/index.js +0 -1
  447. package/test/unit/spec/member/util.js +31 -7
  448. package/test/unit/spec/members/index.js +104 -54
  449. package/test/unit/spec/members/request.js +29 -20
  450. package/test/unit/spec/members/utils.js +8 -5
  451. package/test/unit/spec/metrics/index.js +16 -21
  452. package/test/unit/spec/multistream/mediaRequestManager.ts +312 -50
  453. package/test/unit/spec/multistream/receiveSlot.ts +57 -6
  454. package/test/unit/spec/multistream/receiveSlotManager.ts +41 -13
  455. package/test/unit/spec/multistream/remoteMedia.ts +10 -2
  456. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  457. package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
  458. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  459. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  460. package/test/unit/spec/reachability/index.ts +58 -26
  461. package/test/unit/spec/reconnection-manager/index.js +102 -9
  462. package/test/unit/spec/recording-controller/index.js +231 -0
  463. package/test/unit/spec/recording-controller/util.js +102 -0
  464. package/test/unit/spec/roap/index.ts +2 -1
  465. package/test/unit/spec/roap/request.ts +114 -0
  466. package/test/unit/spec/roap/turnDiscovery.ts +64 -45
  467. package/test/unit/spec/stats-analyzer/index.js +86 -57
  468. package/test/utils/cmr.js +44 -42
  469. package/test/utils/constants.js +9 -0
  470. package/test/utils/testUtils.js +96 -80
  471. package/test/utils/webex-config.js +22 -18
  472. package/test/utils/webex-test-users.js +57 -50
  473. package/tsconfig.json +6 -0
  474. package/dist/media/internal-media-core-wrapper.js +0 -22
  475. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  476. package/dist/multistream/multistreamMedia.js +0 -116
  477. package/dist/multistream/multistreamMedia.js.map +0 -1
  478. package/dist/peer-connection-manager/util.js +0 -124
  479. package/dist/peer-connection-manager/util.js.map +0 -1
  480. package/src/common/logs/logger-proxy.js +0 -33
  481. package/src/locus-info/controlsUtils.js +0 -102
  482. package/src/media/internal-media-core-wrapper.ts +0 -9
  483. package/src/mediaQualityMetrics/config.js +0 -382
  484. package/src/meeting-info/meeting-info-v2.js +0 -255
  485. package/src/meetings/index.js +0 -1015
  486. package/src/multistream/multistreamMedia.ts +0 -92
  487. package/src/peer-connection-manager/util.ts +0 -117
  488. package/src/roap/request.js +0 -127
  489. package/src/statsAnalyzer/global.js +0 -133
  490. package/src/statsAnalyzer/index.js +0 -1006
  491. package/src/statsAnalyzer/mqaUtil.js +0 -173
  492. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  493. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -20,11 +20,11 @@ describe('plugin-meetings', () => {
20
20
  const initialConfig = {
21
21
  videoPacketLossRatioThreshold: 9,
22
22
  rttThreshold: 500,
23
- jitterThreshold: 500
23
+ jitterThreshold: 500,
24
24
  };
25
25
 
26
26
  const configObject = {
27
- mediaType: 'video',
27
+ mediaType: 'video-send',
28
28
  remoteRtpResults: {
29
29
  id: 'RTCRemoteInboundRtpVideoStream_2411086660',
30
30
  timestamp: 1624472676193.79,
@@ -39,20 +39,20 @@ describe('plugin-meetings', () => {
39
39
  roundTripTime: 0.648,
40
40
  fractionLost: 0,
41
41
  totalRoundTripTime: 3.554,
42
- roundTripTimeMeasurements: 14
42
+ roundTripTimeMeasurements: 14,
43
43
  },
44
44
  statsAnalyzerCurrentStats: {
45
- audio: {
45
+ 'audio-send': {
46
46
  send: {
47
- currentPacketLossRatio: 8
48
- }
47
+ currentPacketLossRatio: 8,
48
+ },
49
49
  },
50
- video: {
50
+ 'video-send': {
51
51
  send: {
52
- currentPacketLossRatio: 10
53
- }
54
- }
55
- }
52
+ currentPacketLossRatio: 10,
53
+ },
54
+ },
55
+ },
56
56
  };
57
57
 
58
58
  const sandbox = sinon.createSandbox();
@@ -75,13 +75,19 @@ describe('plugin-meetings', () => {
75
75
 
76
76
  it('should emit a network quality judgement event with the proper payload', async () => {
77
77
  await networkQualityMonitor.determineUplinkNetworkQuality(configObject);
78
- assert(sandBoxEmitSpy.calledWith(sinon.match({
79
- file: 'networkQualityMonitor',
80
- function: 'emitNetworkQuality'
81
- }), sinon.match(EVENT_TRIGGERS.NETWORK_QUALITY), sinon.match({
82
- mediaType: 'video',
83
- networkQualityScore: 0
84
- })));
78
+ assert(
79
+ sandBoxEmitSpy.calledWith(
80
+ sinon.match({
81
+ file: 'networkQualityMonitor',
82
+ function: 'emitNetworkQuality',
83
+ }),
84
+ sinon.match(EVENT_TRIGGERS.NETWORK_QUALITY),
85
+ sinon.match({
86
+ mediaType: 'video-send',
87
+ networkQualityScore: 0,
88
+ })
89
+ )
90
+ );
85
91
  });
86
92
 
87
93
  it('should reset to default values after determineUplinkNetworkQuality call stack is complete', async () => {
@@ -5,9 +5,7 @@
5
5
  import 'jsdom-global/register';
6
6
  import {assert} from '@webex/test-helper-chai';
7
7
  import sinon from 'sinon';
8
- import {
9
- _PERSONAL_ROOM_
10
- } from '@webex/plugin-meetings/src/constants';
8
+ import {_PERSONAL_ROOM_} from '@webex/plugin-meetings/src/constants';
11
9
  import PersonalMeetingRoom from '@webex/plugin-meetings/src/personal-meeting-room';
12
10
 
13
11
  describe('personal-meeting-room', () => {
@@ -16,14 +14,11 @@ describe('personal-meeting-room', () => {
16
14
 
17
15
  beforeEach(() => {
18
16
  meetingInfo = {
19
- fetchMeetingInfo: sinon.stub().returns(Promise.resolve(
20
- {body: {isPmr: true}}
21
- ))
17
+ fetchMeetingInfo: sinon.stub().returns(Promise.resolve({body: {isPmr: true}})),
22
18
  };
23
19
  pmr = new PersonalMeetingRoom({meetingInfo}, {parent: {}});
24
20
  });
25
21
 
26
-
27
22
  describe('#get()', () => {
28
23
  it('returns personal meeting room info', async () => {
29
24
  await pmr.get();
@@ -1,52 +1,84 @@
1
1
  import {assert} from '@webex/test-helper-chai';
2
+ import MockWebex from '@webex/test-helper-mock-webex';
3
+ import sinon from 'sinon';
2
4
  import Reachability from '@webex/plugin-meetings/src/reachability/';
3
5
 
4
6
  describe('isAnyClusterReachable', () => {
5
- before(function () {
6
- this.jsdom = require('jsdom-global')('', {url: 'http://localhost'});
7
- });
8
- after(function () {
9
- this.jsdom();
10
- });
7
+ let webex;
11
8
 
12
- afterEach(() => {
13
- window.localStorage.clear()
9
+ beforeEach(() => {
10
+ webex = new MockWebex();
14
11
  });
15
12
 
16
- const checkIsClusterReachable = (mockStorage: any, expectedValue: boolean) => {
17
-
13
+ const checkIsClusterReachable = async (mockStorage: any, expectedValue: boolean) => {
18
14
  if (mockStorage) {
19
- window.localStorage.setItem('reachability.result', JSON.stringify(mockStorage))
15
+ await webex.boundedStorage.put(
16
+ 'Reachability',
17
+ 'reachability.result',
18
+ JSON.stringify(mockStorage)
19
+ );
20
20
  }
21
- const reachability = new Reachability({});
21
+ const reachability = new Reachability(webex);
22
22
 
23
- const result = reachability.isAnyClusterReachable();
23
+ const result = await reachability.isAnyClusterReachable();
24
24
 
25
25
  assert.equal(result, expectedValue);
26
+ };
27
+
28
+ it('returns true when udp is reachable', async () => {
29
+ await checkIsClusterReachable({x: {udp: {reachable: 'true'}, tcp: {reachable: 'false'}}}, true);
30
+ });
26
31
 
27
- }
32
+ it('returns true when tcp is reachable', async () => {
33
+ await checkIsClusterReachable({x: {udp: {reachable: 'false'}, tcp: {reachable: 'true'}}}, true);
34
+ });
28
35
 
29
- it('returns true when udp is reachable', () => {
30
- checkIsClusterReachable({x: {udp: {reachable: 'true'}, tcp: {reachable: 'false'}}}, true)
36
+ it('returns true when both tcp and udp are reachable', async () => {
37
+ await checkIsClusterReachable({x: {udp: {reachable: 'true'}, tcp: {reachable: 'true'}}}, true);
31
38
  });
32
39
 
33
- it('returns true when tcp is reachable', () => {
34
- checkIsClusterReachable({x: {udp: {reachable: 'false'}, tcp: {reachable: 'true'}}}, true)
40
+ it('returns false when both tcp and udp are unreachable', async () => {
41
+ await checkIsClusterReachable({x: {udp: {reachable: 'false'}, tcp: {reachable: 'false'}}}, false);
35
42
  });
36
43
 
37
- it('returns true when both tcp and udp are reachable', () => {
38
- checkIsClusterReachable({x: {udp: {reachable: 'true'}, tcp: {reachable: 'true'}}}, true)
44
+ it('returns false when reachability result is empty', async () => {
45
+ await checkIsClusterReachable({x: {}}, false);
39
46
  });
40
47
 
41
- it('returns false when both tcp and udp are unreachable', () => {
42
- checkIsClusterReachable({x: {udp: {reachable: 'false'}, tcp: {reachable: 'false'}}}, false)
48
+ it('returns false when reachability.result item is not there', async () => {
49
+ await checkIsClusterReachable(undefined, false);
43
50
  });
51
+ });
52
+
53
+ describe('gatherReachability', () => {
54
+ let webex;
44
55
 
45
- it('returns false when reachability result is empty', () => {
46
- checkIsClusterReachable({x: {}}, false)
56
+ beforeEach(async () => {
57
+ webex = new MockWebex();
58
+
59
+ await webex.boundedStorage.put(
60
+ 'Reachability',
61
+ 'reachability.result',
62
+ JSON.stringify({old: 'results'})
63
+ );
47
64
  });
48
65
 
49
- it('returns false when reachability.result item is not there', () => {
50
- checkIsClusterReachable(undefined, false)
66
+ it('stores the reachability', async () => {
67
+ const reachability = new Reachability(webex);
68
+
69
+ const clusters = {some: 'clusters'};
70
+ const reachabilityResults = {some: 'results'};
71
+
72
+ reachability.reachabilityRequest.getClusters = sinon.stub().returns(clusters);
73
+ (reachability as any).performReachabilityCheck = sinon.stub().returns(reachabilityResults)
74
+
75
+ const result = await reachability.gatherReachability();
76
+
77
+ assert.equal(result, reachabilityResults);
78
+
79
+ const storedResult = await webex.boundedStorage.get('Reachability', 'reachability.result');
80
+
81
+ assert.equal(JSON.stringify(result), storedResult);
51
82
  });
83
+
52
84
  });
@@ -2,8 +2,8 @@ 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
-
6
- import ReconnectionManager from '../../../../src/reconnection-manager';
5
+ import ReconnectionManager from '@webex/plugin-meetings/src/reconnection-manager';
6
+ import Metrics from '@webex/plugin-meetings/src/metrics';
7
7
 
8
8
  const {assert} = chai;
9
9
 
@@ -11,6 +11,100 @@ chai.use(chaiAsPromised);
11
11
  sinon.assert.expose(chai.assert, {prefix: ''});
12
12
 
13
13
  describe('plugin-meetings', () => {
14
+ describe('ReconnectionManager.reconnect', () => {
15
+ let fakeMediaConnection;
16
+ let fakeMeeting;
17
+
18
+ beforeEach(() => {
19
+ Metrics.postEvent = sinon.stub();
20
+ fakeMediaConnection = {
21
+ initiateOffer: sinon.stub().resolves({}),
22
+ reconnect: sinon.stub().resolves({}),
23
+ };
24
+ fakeMeeting = {
25
+ closePeerConnections: sinon.stub().resolves({}),
26
+ createMediaConnection: sinon.stub().returns(fakeMediaConnection),
27
+ config: {
28
+ reconnection: {
29
+ enabled: true,
30
+ detection: true,
31
+ iceReconnectionTimeout: 10000,
32
+ retry: {
33
+ times: 2,
34
+ backOff: {
35
+ start: 1000,
36
+ rate: 2,
37
+ },
38
+ },
39
+ },
40
+ },
41
+ mediaProperties: {
42
+ unsetPeerConnection: sinon.stub(),
43
+ webrtcMediaConnection: fakeMediaConnection,
44
+ },
45
+ mediaRequestManagers: {
46
+ audio: {commit: sinon.stub()},
47
+ video: {commit: sinon.stub()},
48
+ },
49
+ roap: {
50
+ doTurnDiscovery: sinon.stub().resolves({
51
+ turnServerInfo: {
52
+ url: 'fake_turn_url',
53
+ username: 'fake_turn_username',
54
+ password: 'fake_turn_password',
55
+ },
56
+ turnDiscoverySkippedReason: undefined,
57
+ }),
58
+ },
59
+ statsAnalyzer: {
60
+ updateMediaConnection: sinon.stub(),
61
+ },
62
+ webex: {
63
+ meetings: {
64
+ getMeetingByType: sinon.stub().returns(true),
65
+ syncMeetings: sinon.stub().resolves({}),
66
+ },
67
+ },
68
+ };
69
+ });
70
+
71
+ it('uses correct TURN TLS information on the reconnection', async () => {
72
+ const rm = new ReconnectionManager(fakeMeeting);
73
+
74
+ await rm.reconnect();
75
+
76
+ assert.calledOnce(fakeMeeting.roap.doTurnDiscovery);
77
+ assert.calledOnce(fakeMediaConnection.reconnect);
78
+ assert.calledWith(fakeMediaConnection.reconnect, [
79
+ {
80
+ urls: 'fake_turn_url',
81
+ username: 'fake_turn_username',
82
+ credential: 'fake_turn_password',
83
+ },
84
+ ]);
85
+ });
86
+
87
+ it('does not re-request media for non-multistream meetings', async () => {
88
+ fakeMeeting.isMultistream = false;
89
+ const rm = new ReconnectionManager(fakeMeeting);
90
+
91
+ await rm.reconnect();
92
+
93
+ assert.notCalled(fakeMeeting.mediaRequestManagers.audio.commit);
94
+ assert.notCalled(fakeMeeting.mediaRequestManagers.video.commit);
95
+ });
96
+
97
+ it('does re-request media for multistream meetings', async () => {
98
+ fakeMeeting.isMultistream = true;
99
+ const rm = new ReconnectionManager(fakeMeeting);
100
+
101
+ await rm.reconnect();
102
+
103
+ assert.calledOnce(fakeMeeting.mediaRequestManagers.audio.commit);
104
+ assert.calledOnce(fakeMeeting.mediaRequestManagers.video.commit);
105
+ });
106
+ });
107
+
14
108
  /**
15
109
  * Currently, testing dependent classes that aren't available at the top
16
110
  * level causes testing errors in CI based around related files. Skipping this here until a solution
@@ -30,11 +124,11 @@ describe('plugin-meetings', () => {
30
124
  times: 2,
31
125
  backOff: {
32
126
  start: 1000,
33
- rate: 2
34
- }
35
- }
36
- }
37
- }
127
+ rate: 2,
128
+ },
129
+ },
130
+ },
131
+ },
38
132
  });
39
133
  });
40
134
 
@@ -53,8 +147,7 @@ describe('plugin-meetings', () => {
53
147
  });
54
148
 
55
149
  it('should resolve the deferred promise', () => {
56
- reconnectionManager.iceState.resolve =
57
- sinon.spy();
150
+ reconnectionManager.iceState.resolve = sinon.spy();
58
151
  const {resolve} = reconnectionManager.iceState;
59
152
 
60
153
  reconnectionManager.iceReconnected();
@@ -0,0 +1,231 @@
1
+ import RecordingController from '@webex/plugin-meetings/src/recording-controller';
2
+ import sinon from 'sinon';
3
+ import {assert} from '@webex/test-helper-chai';
4
+ import { HTTP_VERBS } from '@webex/plugin-meetings/src/constants';
5
+
6
+ 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
+ });
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
+
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
+ });
129
+ });
130
+
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
+ });
228
+ });
229
+ });
230
+ });
231
+ });
@@ -0,0 +1,102 @@
1
+ import RecordingUtil from '@webex/plugin-meetings/src/recording-controller/util';
2
+ import RecordingAction from '@webex/plugin-meetings/src/recording-controller/enums';
3
+ import { assert } from 'chai';
4
+
5
+ describe('plugin-meetings', () => {
6
+ describe('recording-controller tests', () => {
7
+ describe('recording util tests', () => {
8
+
9
+ let locusInfo;
10
+
11
+ beforeEach(() => {
12
+ locusInfo = {
13
+ parsedLocus: {
14
+ info: {
15
+ userDisplayHints: [],
16
+ },
17
+ },
18
+ };
19
+ });
20
+
21
+ describe('canUserStart', () => {
22
+ it('can start recording when the correct display hint is present', () => {
23
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_START');
24
+
25
+ assert.equal(RecordingUtil.canUserStart(locusInfo.parsedLocus.info.userDisplayHints), true);
26
+ });
27
+
28
+ it('rejects when correct display hint is not present', () => {
29
+ assert.equal(RecordingUtil.canUserStart(locusInfo.parsedLocus.info.userDisplayHints), false);
30
+ });
31
+ });
32
+
33
+ describe('canUserPause', () => {
34
+ it('can pause recording when the correct display hint is present', () => {
35
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_PAUSE');
36
+
37
+ assert.equal(RecordingUtil.canUserPause(locusInfo.parsedLocus.info.userDisplayHints), true);
38
+ });
39
+
40
+ it('rejects when correct display hint is not present', () => {
41
+ assert.equal(RecordingUtil.canUserPause(locusInfo.parsedLocus.info.userDisplayHints), false);
42
+ });
43
+ });
44
+
45
+ describe('canUserStop', () => {
46
+ it('can stop recording when the correct display hint is present', () => {
47
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_STOP');
48
+
49
+ assert.equal(RecordingUtil.canUserStop(locusInfo.parsedLocus.info.userDisplayHints), true);
50
+ });
51
+
52
+ it('rejects when correct display hint is not present', () => {
53
+ assert.equal(RecordingUtil.canUserStop(locusInfo.parsedLocus.info.userDisplayHints), false);
54
+ });
55
+ });
56
+
57
+ describe('canUserResume', () => {
58
+ it('can start recording when the correct display hint is present', () => {
59
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_RESUME');
60
+
61
+ assert.equal(RecordingUtil.canUserResume(locusInfo.parsedLocus.info.userDisplayHints), true);
62
+ });
63
+
64
+ it('rejects when correct display hint is not present', () => {
65
+ assert.equal(RecordingUtil.canUserResume(locusInfo.parsedLocus.info.userDisplayHints), false);
66
+ });
67
+ });
68
+
69
+ describe('deriveRecordingStates', () => {
70
+ it('gets the correct values for a start recording action', () => {
71
+ assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Start), {recording: true, paused: false});
72
+ });
73
+
74
+ it('gets the correct values for a stop recording action', () => {
75
+ assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Stop), {recording: false, paused: false});
76
+ });
77
+
78
+ it('gets the correct values for a resume recording action', () => {
79
+ assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Resume), {recording: true, paused: false});
80
+ });
81
+
82
+ it('gets the correct values for a paused recording action', () => {
83
+ assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Pause), {recording: true, paused: true});
84
+ });
85
+ });
86
+
87
+ describe('extractLocusId', () => {
88
+ it('gets the correct id from the url param', () => {
89
+ assert.equal(RecordingUtil.extractLocusId('test/id'), 'id');
90
+ });
91
+
92
+ it('works with empty string parameters passed', () => {
93
+ assert.equal(RecordingUtil.extractLocusId(''), '');
94
+ });
95
+
96
+ it('works with no parameters passed', () => {
97
+ assert.isUndefined(RecordingUtil.extractLocusId(undefined));
98
+ });
99
+ });
100
+ });
101
+ });
102
+ });