@webex/plugin-meetings 3.0.0-beta.22 → 3.0.0-beta.221

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