@webex/plugin-meetings 3.0.0-beta.20 → 3.0.0-beta.201

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 (424) 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/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +3 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +172 -30
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +319 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +107 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +355 -57
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/mediaSharesUtils.js +43 -1
  53. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  54. package/dist/locus-info/parser.js +219 -63
  55. package/dist/locus-info/parser.js.map +1 -1
  56. package/dist/locus-info/selfUtils.js +89 -14
  57. package/dist/locus-info/selfUtils.js.map +1 -1
  58. package/dist/media/index.js +48 -135
  59. package/dist/media/index.js.map +1 -1
  60. package/dist/media/properties.js +29 -90
  61. package/dist/media/properties.js.map +1 -1
  62. package/dist/mediaQualityMetrics/config.js +505 -493
  63. package/dist/mediaQualityMetrics/config.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +80 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +2692 -2544
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +291 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +229 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +196 -190
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/util.js +529 -414
  75. package/dist/meeting/util.js.map +1 -1
  76. package/dist/meeting-info/index.js +48 -7
  77. package/dist/meeting-info/index.js.map +1 -1
  78. package/dist/meeting-info/meeting-info-v2.js +171 -51
  79. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  80. package/dist/meeting-info/utilv2.js +20 -5
  81. package/dist/meeting-info/utilv2.js.map +1 -1
  82. package/dist/meetings/collection.js +22 -0
  83. package/dist/meetings/collection.js.map +1 -1
  84. package/dist/meetings/index.js +357 -66
  85. package/dist/meetings/index.js.map +1 -1
  86. package/dist/meetings/meetings.types.js +7 -0
  87. package/dist/meetings/meetings.types.js.map +1 -0
  88. package/dist/meetings/request.js +2 -0
  89. package/dist/meetings/request.js.map +1 -1
  90. package/dist/meetings/util.js +88 -1
  91. package/dist/meetings/util.js.map +1 -1
  92. package/dist/member/index.js +49 -0
  93. package/dist/member/index.js.map +1 -1
  94. package/dist/member/types.js +25 -0
  95. package/dist/member/types.js.map +1 -0
  96. package/dist/member/util.js +121 -25
  97. package/dist/member/util.js.map +1 -1
  98. package/dist/members/collection.js +10 -0
  99. package/dist/members/collection.js.map +1 -1
  100. package/dist/members/index.js +86 -5
  101. package/dist/members/index.js.map +1 -1
  102. package/dist/members/request.js +106 -38
  103. package/dist/members/request.js.map +1 -1
  104. package/dist/members/types.js +15 -0
  105. package/dist/members/types.js.map +1 -0
  106. package/dist/members/util.js +316 -233
  107. package/dist/members/util.js.map +1 -1
  108. package/dist/metrics/constants.js +3 -5
  109. package/dist/metrics/constants.js.map +1 -1
  110. package/dist/metrics/index.js +1 -468
  111. package/dist/metrics/index.js.map +1 -1
  112. package/dist/multistream/mediaRequestManager.js +238 -49
  113. package/dist/multistream/mediaRequestManager.js.map +1 -1
  114. package/dist/multistream/receiveSlot.js +49 -16
  115. package/dist/multistream/receiveSlot.js.map +1 -1
  116. package/dist/multistream/receiveSlotManager.js +52 -34
  117. package/dist/multistream/receiveSlotManager.js.map +1 -1
  118. package/dist/multistream/remoteMedia.js +44 -18
  119. package/dist/multistream/remoteMedia.js.map +1 -1
  120. package/dist/multistream/remoteMediaGroup.js +60 -3
  121. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  122. package/dist/multistream/remoteMediaManager.js +173 -59
  123. package/dist/multistream/remoteMediaManager.js.map +1 -1
  124. package/dist/networkQualityMonitor/index.js +4 -2
  125. package/dist/networkQualityMonitor/index.js.map +1 -1
  126. package/dist/reachability/index.js +72 -27
  127. package/dist/reachability/index.js.map +1 -1
  128. package/dist/reachability/request.js +12 -5
  129. package/dist/reachability/request.js.map +1 -1
  130. package/dist/reactions/reactions.js +2 -2
  131. package/dist/reactions/reactions.js.map +1 -1
  132. package/dist/reactions/reactions.type.js +18 -18
  133. package/dist/reactions/reactions.type.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +196 -155
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -1
  137. package/dist/recording-controller/index.js.map +1 -1
  138. package/dist/recording-controller/util.js +9 -8
  139. package/dist/recording-controller/util.js.map +1 -1
  140. package/dist/roap/index.js +21 -29
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +110 -89
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +93 -36
  145. package/dist/roap/turnDiscovery.js.map +1 -1
  146. package/dist/rtcMetrics/constants.js +12 -0
  147. package/dist/rtcMetrics/constants.js.map +1 -0
  148. package/dist/rtcMetrics/index.js +115 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/global.js +1 -93
  151. package/dist/statsAnalyzer/global.js.map +1 -1
  152. package/dist/statsAnalyzer/index.js +326 -311
  153. package/dist/statsAnalyzer/index.js.map +1 -1
  154. package/dist/statsAnalyzer/mqaUtil.js +90 -53
  155. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  156. package/dist/types/annotation/annotation.types.d.ts +42 -0
  157. package/dist/types/annotation/constants.d.ts +31 -0
  158. package/dist/types/annotation/index.d.ts +117 -0
  159. package/dist/types/breakouts/breakout.d.ts +8 -0
  160. package/dist/types/breakouts/collection.d.ts +5 -0
  161. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  162. package/dist/types/breakouts/events.d.ts +8 -0
  163. package/dist/types/breakouts/index.d.ts +5 -0
  164. package/dist/types/breakouts/request.d.ts +22 -0
  165. package/dist/types/breakouts/utils.d.ts +15 -0
  166. package/dist/types/common/browser-detection.d.ts +9 -0
  167. package/dist/types/common/collection.d.ts +48 -0
  168. package/dist/types/common/config.d.ts +2 -0
  169. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  170. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  171. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  172. package/dist/types/common/errors/media.d.ts +15 -0
  173. package/dist/types/common/errors/parameter.d.ts +15 -0
  174. package/dist/types/common/errors/password-error.d.ts +15 -0
  175. package/dist/types/common/errors/permission.d.ts +14 -0
  176. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  177. package/dist/types/common/errors/reconnection.d.ts +15 -0
  178. package/dist/types/common/errors/stats.d.ts +15 -0
  179. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  180. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  181. package/dist/types/common/events/events-scope.d.ts +17 -0
  182. package/dist/types/common/events/events.d.ts +12 -0
  183. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  184. package/dist/types/common/events/util.d.ts +2 -0
  185. package/dist/types/common/logs/logger-config.d.ts +2 -0
  186. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  187. package/dist/types/common/logs/request.d.ts +34 -0
  188. package/dist/types/common/queue.d.ts +34 -0
  189. package/dist/types/config.d.ts +72 -0
  190. package/dist/types/constants.d.ts +1016 -0
  191. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  192. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  193. package/dist/types/controls-options-manager/index.d.ts +136 -0
  194. package/dist/types/controls-options-manager/types.d.ts +43 -0
  195. package/dist/types/controls-options-manager/util.d.ts +1 -0
  196. package/dist/types/index.d.ts +7 -0
  197. package/dist/types/interpretation/collection.d.ts +5 -0
  198. package/dist/types/interpretation/index.d.ts +5 -0
  199. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  200. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  201. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  202. package/dist/types/locus-info/fullState.d.ts +2 -0
  203. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  204. package/dist/types/locus-info/index.d.ts +322 -0
  205. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  206. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  207. package/dist/types/locus-info/parser.d.ts +271 -0
  208. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  209. package/dist/types/media/index.d.ts +34 -0
  210. package/dist/types/media/properties.d.ts +93 -0
  211. package/dist/types/media/util.d.ts +2 -0
  212. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  213. package/dist/types/meeting/in-meeting-actions.d.ts +153 -0
  214. package/dist/types/meeting/index.d.ts +1471 -0
  215. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  216. package/dist/types/meeting/muteState.d.ts +184 -0
  217. package/dist/types/meeting/request.d.ts +257 -0
  218. package/dist/types/meeting/request.type.d.ts +11 -0
  219. package/dist/types/meeting/state.d.ts +9 -0
  220. package/dist/types/meeting/util.d.ts +78 -0
  221. package/dist/types/meeting-info/collection.d.ts +20 -0
  222. package/dist/types/meeting-info/index.d.ts +62 -0
  223. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  224. package/dist/types/meeting-info/request.d.ts +22 -0
  225. package/dist/types/meeting-info/util.d.ts +2 -0
  226. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  227. package/dist/types/meetings/collection.d.ts +31 -0
  228. package/dist/types/meetings/index.d.ts +367 -0
  229. package/dist/types/meetings/meetings.types.d.ts +4 -0
  230. package/dist/types/meetings/request.d.ts +27 -0
  231. package/dist/types/meetings/util.d.ts +18 -0
  232. package/dist/types/member/index.d.ts +159 -0
  233. package/dist/types/member/types.d.ts +32 -0
  234. package/dist/types/member/util.d.ts +2 -0
  235. package/dist/types/members/collection.d.ts +29 -0
  236. package/dist/types/members/index.d.ts +353 -0
  237. package/dist/types/members/request.d.ts +114 -0
  238. package/dist/types/members/types.d.ts +24 -0
  239. package/dist/types/members/util.d.ts +210 -0
  240. package/dist/types/metrics/constants.d.ts +55 -0
  241. package/dist/types/metrics/index.d.ts +45 -0
  242. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  243. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  244. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  245. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  246. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  247. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  248. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  249. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  250. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  251. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  252. package/dist/types/reachability/index.d.ts +152 -0
  253. package/dist/types/reachability/request.d.ts +37 -0
  254. package/dist/types/reactions/constants.d.ts +3 -0
  255. package/dist/types/reactions/reactions.d.ts +4 -0
  256. package/dist/types/reactions/reactions.type.d.ts +52 -0
  257. package/dist/types/reconnection-manager/index.d.ts +126 -0
  258. package/dist/types/recording-controller/enums.d.ts +7 -0
  259. package/dist/types/recording-controller/index.d.ts +208 -0
  260. package/dist/types/recording-controller/util.d.ts +14 -0
  261. package/dist/types/roap/index.d.ts +77 -0
  262. package/dist/types/roap/request.d.ts +36 -0
  263. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  264. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  265. package/dist/types/rtcMetrics/index.d.ts +46 -0
  266. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  267. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  268. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  269. package/dist/types/transcription/index.d.ts +64 -0
  270. package/package.json +25 -22
  271. package/src/annotation/annotation.types.ts +50 -0
  272. package/src/annotation/constants.ts +36 -0
  273. package/src/annotation/index.ts +328 -0
  274. package/src/breakouts/README.md +44 -14
  275. package/src/breakouts/breakout.ts +87 -9
  276. package/src/breakouts/edit-lock-error.ts +25 -0
  277. package/src/breakouts/events.ts +56 -0
  278. package/src/breakouts/index.ts +710 -10
  279. package/src/breakouts/request.ts +55 -0
  280. package/src/breakouts/utils.ts +57 -0
  281. package/src/common/errors/webex-errors.ts +6 -2
  282. package/src/common/logs/logger-proxy.ts +1 -1
  283. package/src/common/queue.ts +22 -8
  284. package/src/config.ts +2 -7
  285. package/src/constants.ts +157 -21
  286. package/src/controls-options-manager/constants.ts +5 -0
  287. package/src/controls-options-manager/enums.ts +18 -0
  288. package/src/controls-options-manager/index.ts +278 -0
  289. package/src/controls-options-manager/types.ts +59 -0
  290. package/src/controls-options-manager/util.ts +300 -0
  291. package/src/index.ts +39 -0
  292. package/src/interpretation/README.md +60 -0
  293. package/src/interpretation/collection.ts +19 -0
  294. package/src/interpretation/index.ts +332 -0
  295. package/src/interpretation/siLanguage.ts +18 -0
  296. package/src/locus-info/controlsUtils.ts +108 -0
  297. package/src/locus-info/index.ts +375 -52
  298. package/src/locus-info/mediaSharesUtils.ts +48 -0
  299. package/src/locus-info/parser.ts +224 -39
  300. package/src/locus-info/selfUtils.ts +81 -5
  301. package/src/media/index.ts +87 -140
  302. package/src/media/properties.ts +49 -90
  303. package/src/mediaQualityMetrics/config.ts +379 -377
  304. package/src/meeting/in-meeting-actions.ts +159 -3
  305. package/src/meeting/index.ts +1980 -2030
  306. package/src/meeting/locusMediaRequest.ts +309 -0
  307. package/src/meeting/muteState.ts +228 -132
  308. package/src/meeting/request.ts +102 -112
  309. package/src/meeting/util.ts +509 -397
  310. package/src/meeting-info/index.ts +54 -8
  311. package/src/meeting-info/meeting-info-v2.ts +148 -14
  312. package/src/meeting-info/utilv2.ts +13 -3
  313. package/src/meetings/collection.ts +20 -0
  314. package/src/meetings/index.ts +392 -84
  315. package/src/meetings/meetings.types.ts +12 -0
  316. package/src/meetings/request.ts +2 -0
  317. package/src/meetings/util.ts +103 -4
  318. package/src/member/index.ts +49 -0
  319. package/src/member/types.ts +38 -0
  320. package/src/member/util.ts +127 -25
  321. package/src/members/collection.ts +8 -0
  322. package/src/members/index.ts +107 -6
  323. package/src/members/request.ts +97 -17
  324. package/src/members/types.ts +28 -0
  325. package/src/members/util.ts +319 -240
  326. package/src/metrics/constants.ts +2 -4
  327. package/src/metrics/index.ts +1 -490
  328. package/src/multistream/mediaRequestManager.ts +289 -79
  329. package/src/multistream/receiveSlot.ts +55 -18
  330. package/src/multistream/receiveSlotManager.ts +46 -24
  331. package/src/multistream/remoteMedia.ts +27 -2
  332. package/src/multistream/remoteMediaGroup.ts +59 -0
  333. package/src/multistream/remoteMediaManager.ts +113 -32
  334. package/src/networkQualityMonitor/index.ts +6 -6
  335. package/src/reachability/index.ts +62 -15
  336. package/src/reachability/request.ts +10 -5
  337. package/src/reactions/reactions.ts +4 -4
  338. package/src/reactions/reactions.type.ts +3 -3
  339. package/src/reconnection-manager/index.ts +68 -43
  340. package/src/recording-controller/index.ts +20 -2
  341. package/src/recording-controller/util.ts +26 -9
  342. package/src/roap/index.ts +21 -30
  343. package/src/roap/request.ts +101 -95
  344. package/src/roap/turnDiscovery.ts +47 -25
  345. package/src/rtcMetrics/constants.ts +3 -0
  346. package/src/rtcMetrics/index.ts +96 -0
  347. package/src/statsAnalyzer/global.ts +1 -94
  348. package/src/statsAnalyzer/index.ts +376 -386
  349. package/src/statsAnalyzer/mqaUtil.ts +100 -99
  350. package/test/integration/spec/converged-space-meetings.js +233 -0
  351. package/test/integration/spec/journey.js +336 -259
  352. package/test/integration/spec/space-meeting.js +77 -4
  353. package/test/unit/spec/annotation/index.ts +418 -0
  354. package/test/unit/spec/breakouts/breakout.ts +142 -24
  355. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  356. package/test/unit/spec/breakouts/events.ts +89 -0
  357. package/test/unit/spec/breakouts/index.ts +1545 -48
  358. package/test/unit/spec/breakouts/request.ts +104 -0
  359. package/test/unit/spec/breakouts/utils.js +72 -0
  360. package/test/unit/spec/common/queue.js +31 -2
  361. package/test/unit/spec/controls-options-manager/index.js +287 -0
  362. package/test/unit/spec/controls-options-manager/util.js +582 -0
  363. package/test/unit/spec/fixture/locus.js +1 -0
  364. package/test/unit/spec/interpretation/collection.ts +15 -0
  365. package/test/unit/spec/interpretation/index.ts +589 -0
  366. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  367. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  368. package/test/unit/spec/locus-info/index.js +1094 -38
  369. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  370. package/test/unit/spec/locus-info/parser.js +62 -22
  371. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  372. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  373. package/test/unit/spec/media/index.ts +138 -28
  374. package/test/unit/spec/meeting/in-meeting-actions.ts +79 -3
  375. package/test/unit/spec/meeting/index.js +3092 -1571
  376. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  377. package/test/unit/spec/meeting/muteState.js +370 -208
  378. package/test/unit/spec/meeting/request.js +338 -43
  379. package/test/unit/spec/meeting/utils.js +449 -53
  380. package/test/unit/spec/meeting-info/index.js +181 -0
  381. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  382. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  383. package/test/unit/spec/meetings/collection.js +14 -0
  384. package/test/unit/spec/meetings/index.js +866 -124
  385. package/test/unit/spec/meetings/utils.js +206 -2
  386. package/test/unit/spec/member/index.js +58 -4
  387. package/test/unit/spec/member/util.js +479 -35
  388. package/test/unit/spec/members/index.js +319 -1
  389. package/test/unit/spec/members/request.js +206 -27
  390. package/test/unit/spec/members/utils.js +184 -0
  391. package/test/unit/spec/metrics/index.js +1 -50
  392. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  393. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  394. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  395. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  396. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  397. package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
  398. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  399. package/test/unit/spec/reachability/index.ts +125 -8
  400. package/test/unit/spec/reachability/request.js +66 -0
  401. package/test/unit/spec/reconnection-manager/index.js +59 -6
  402. package/test/unit/spec/recording-controller/index.js +294 -218
  403. package/test/unit/spec/recording-controller/util.js +223 -96
  404. package/test/unit/spec/roap/index.ts +26 -51
  405. package/test/unit/spec/roap/request.ts +196 -85
  406. package/test/unit/spec/roap/turnDiscovery.ts +30 -7
  407. package/test/unit/spec/rtcMetrics/index.ts +60 -0
  408. package/test/unit/spec/stats-analyzer/index.js +92 -41
  409. package/test/utils/constants.js +9 -0
  410. package/test/utils/integrationTestUtils.js +46 -0
  411. package/test/utils/testUtils.js +0 -45
  412. package/test/utils/webex-config.js +4 -0
  413. package/test/utils/webex-test-users.js +6 -3
  414. package/dist/meeting/effectsState.js +0 -262
  415. package/dist/meeting/effectsState.js.map +0 -1
  416. package/dist/metrics/config.js +0 -299
  417. package/dist/metrics/config.js.map +0 -1
  418. package/dist/multistream/multistreamMedia.js +0 -110
  419. package/dist/multistream/multistreamMedia.js.map +0 -1
  420. package/src/index.js +0 -15
  421. package/src/meeting/effectsState.ts +0 -211
  422. package/src/metrics/config.ts +0 -495
  423. package/src/multistream/multistreamMedia.ts +0 -97
  424. 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
+ });