@webex/plugin-meetings 3.0.0-beta.28 → 3.0.0-beta.280

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 (363) 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 +763 -31
  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/no-meeting-info.js +51 -0
  21. package/dist/common/errors/no-meeting-info.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +28 -7
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/common/queue.js +24 -9
  27. package/dist/common/queue.js.map +1 -1
  28. package/dist/config.js +5 -10
  29. package/dist/config.js.map +1 -1
  30. package/dist/constants.js +203 -28
  31. package/dist/constants.js.map +1 -1
  32. package/dist/controls-options-manager/enums.js +14 -2
  33. package/dist/controls-options-manager/enums.js.map +1 -1
  34. package/dist/controls-options-manager/index.js +109 -15
  35. package/dist/controls-options-manager/index.js.map +1 -1
  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 +309 -18
  39. package/dist/controls-options-manager/util.js.map +1 -1
  40. package/dist/index.js +112 -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 +383 -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 +57 -1
  55. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  56. package/dist/locus-info/parser.js +249 -72
  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 +58 -116
  61. package/dist/media/index.js.map +1 -1
  62. package/dist/media/properties.js +72 -123
  63. package/dist/media/properties.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +82 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +3123 -2814
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +292 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +230 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +256 -196
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/util.js +601 -417
  75. package/dist/meeting/util.js.map +1 -1
  76. package/dist/meeting-info/index.js +73 -7
  77. package/dist/meeting-info/index.js.map +1 -1
  78. package/dist/meeting-info/meeting-info-v2.js +192 -51
  79. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  80. package/dist/meeting-info/util.js +1 -1
  81. package/dist/meeting-info/util.js.map +1 -1
  82. package/dist/meeting-info/utilv2.js +36 -36
  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 +394 -94
  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 +71 -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 -6
  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 +12 -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 +40 -16
  117. package/dist/multistream/receiveSlot.js.map +1 -1
  118. package/dist/multistream/receiveSlotManager.js +39 -36
  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 +209 -59
  125. package/dist/multistream/remoteMediaManager.js.map +1 -1
  126. package/dist/multistream/sendSlotManager.js +233 -0
  127. package/dist/multistream/sendSlotManager.js.map +1 -0
  128. package/dist/reachability/index.js +225 -59
  129. package/dist/reachability/index.js.map +1 -1
  130. package/dist/reachability/request.js +17 -8
  131. package/dist/reachability/request.js.map +1 -1
  132. package/dist/reconnection-manager/index.js +199 -154
  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 +23 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +112 -97
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +96 -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/index.js +67 -73
  149. package/dist/statsAnalyzer/index.js.map +1 -1
  150. package/dist/statsAnalyzer/mqaUtil.js +11 -10
  151. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  152. package/dist/types/annotation/annotation.types.d.ts +42 -0
  153. package/dist/types/annotation/constants.d.ts +31 -0
  154. package/dist/types/annotation/index.d.ts +117 -0
  155. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  156. package/dist/types/breakouts/events.d.ts +8 -0
  157. package/dist/types/breakouts/request.d.ts +22 -0
  158. package/dist/types/breakouts/utils.d.ts +15 -0
  159. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  160. package/dist/types/common/errors/webex-errors.d.ts +13 -1
  161. package/dist/types/common/queue.d.ts +9 -7
  162. package/dist/types/config.d.ts +1 -6
  163. package/dist/types/constants.d.ts +161 -21
  164. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  165. package/dist/types/controls-options-manager/index.d.ts +17 -1
  166. package/dist/types/controls-options-manager/types.d.ts +43 -0
  167. package/dist/types/controls-options-manager/util.d.ts +1 -7
  168. package/dist/types/index.d.ts +6 -4
  169. package/dist/types/interpretation/collection.d.ts +5 -0
  170. package/dist/types/interpretation/index.d.ts +5 -0
  171. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  172. package/dist/types/locus-info/index.d.ts +57 -4
  173. package/dist/types/locus-info/parser.d.ts +67 -6
  174. package/dist/types/media/index.d.ts +2 -0
  175. package/dist/types/media/properties.d.ts +34 -48
  176. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  177. package/dist/types/meeting/index.d.ts +345 -507
  178. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  179. package/dist/types/meeting/muteState.d.ts +99 -23
  180. package/dist/types/meeting/request.d.ts +72 -43
  181. package/dist/types/meeting/util.d.ts +101 -1
  182. package/dist/types/meeting-info/index.d.ts +13 -1
  183. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  184. package/dist/types/meetings/collection.d.ts +8 -0
  185. package/dist/types/meetings/index.d.ts +88 -12
  186. package/dist/types/meetings/meetings.types.d.ts +4 -0
  187. package/dist/types/member/index.d.ts +13 -0
  188. package/dist/types/member/types.d.ts +32 -0
  189. package/dist/types/members/collection.d.ts +5 -0
  190. package/dist/types/members/index.d.ts +35 -2
  191. package/dist/types/members/request.d.ts +73 -9
  192. package/dist/types/members/types.d.ts +24 -0
  193. package/dist/types/members/util.d.ts +209 -1
  194. package/dist/types/metrics/constants.d.ts +11 -4
  195. package/dist/types/metrics/index.d.ts +4 -119
  196. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  197. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  198. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  199. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  200. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  201. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  202. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  203. package/dist/types/reachability/index.d.ts +61 -7
  204. package/dist/types/reachability/request.d.ts +7 -3
  205. package/dist/types/reconnection-manager/index.d.ts +9 -0
  206. package/dist/types/recording-controller/index.d.ts +15 -1
  207. package/dist/types/recording-controller/util.d.ts +5 -4
  208. package/dist/types/roap/request.d.ts +15 -11
  209. package/dist/types/roap/turnDiscovery.d.ts +18 -1
  210. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  211. package/dist/types/rtcMetrics/index.d.ts +47 -0
  212. package/dist/types/statsAnalyzer/index.d.ts +6 -1
  213. package/package.json +23 -20
  214. package/src/annotation/annotation.types.ts +50 -0
  215. package/src/annotation/constants.ts +36 -0
  216. package/src/annotation/index.ts +328 -0
  217. package/src/breakouts/README.md +44 -14
  218. package/src/breakouts/breakout.ts +87 -9
  219. package/src/breakouts/edit-lock-error.ts +25 -0
  220. package/src/breakouts/events.ts +56 -0
  221. package/src/breakouts/index.ts +646 -18
  222. package/src/breakouts/request.ts +55 -0
  223. package/src/breakouts/utils.ts +57 -0
  224. package/src/common/errors/no-meeting-info.ts +24 -0
  225. package/src/common/errors/webex-errors.ts +27 -2
  226. package/src/common/logs/logger-proxy.ts +1 -1
  227. package/src/common/queue.ts +22 -8
  228. package/src/config.ts +4 -9
  229. package/src/constants.ts +184 -18
  230. package/src/controls-options-manager/enums.ts +12 -0
  231. package/src/controls-options-manager/index.ts +116 -21
  232. package/src/controls-options-manager/types.ts +59 -0
  233. package/src/controls-options-manager/util.ts +294 -14
  234. package/src/index.ts +40 -0
  235. package/src/interpretation/README.md +60 -0
  236. package/src/interpretation/collection.ts +19 -0
  237. package/src/interpretation/index.ts +332 -0
  238. package/src/interpretation/siLanguage.ts +18 -0
  239. package/src/locus-info/controlsUtils.ts +108 -0
  240. package/src/locus-info/index.ts +413 -59
  241. package/src/locus-info/infoUtils.ts +10 -2
  242. package/src/locus-info/mediaSharesUtils.ts +64 -0
  243. package/src/locus-info/parser.ts +258 -47
  244. package/src/locus-info/selfUtils.ts +81 -5
  245. package/src/media/index.ts +100 -122
  246. package/src/media/properties.ts +85 -108
  247. package/src/meeting/in-meeting-actions.ts +163 -3
  248. package/src/meeting/index.ts +2541 -2309
  249. package/src/meeting/locusMediaRequest.ts +313 -0
  250. package/src/meeting/muteState.ts +229 -131
  251. package/src/meeting/request.ts +172 -121
  252. package/src/meeting/util.ts +588 -394
  253. package/src/meeting-info/index.ts +81 -8
  254. package/src/meeting-info/meeting-info-v2.ts +170 -14
  255. package/src/meeting-info/util.ts +1 -1
  256. package/src/meeting-info/utilv2.ts +23 -23
  257. package/src/meetings/collection.ts +20 -0
  258. package/src/meetings/index.ts +428 -108
  259. package/src/meetings/meetings.types.ts +12 -0
  260. package/src/meetings/request.ts +2 -0
  261. package/src/meetings/util.ts +79 -4
  262. package/src/member/index.ts +49 -0
  263. package/src/member/types.ts +38 -0
  264. package/src/member/util.ts +127 -25
  265. package/src/members/collection.ts +8 -0
  266. package/src/members/index.ts +106 -7
  267. package/src/members/request.ts +97 -17
  268. package/src/members/types.ts +28 -0
  269. package/src/members/util.ts +319 -240
  270. package/src/metrics/constants.ts +11 -4
  271. package/src/metrics/index.ts +1 -490
  272. package/src/multistream/mediaRequestManager.ts +289 -79
  273. package/src/multistream/receiveSlot.ts +47 -17
  274. package/src/multistream/receiveSlotManager.ts +34 -24
  275. package/src/multistream/remoteMedia.ts +27 -2
  276. package/src/multistream/remoteMediaGroup.ts +59 -0
  277. package/src/multistream/remoteMediaManager.ts +148 -30
  278. package/src/multistream/sendSlotManager.ts +170 -0
  279. package/src/reachability/index.ts +228 -37
  280. package/src/reachability/request.ts +17 -8
  281. package/src/reconnection-manager/index.ts +81 -54
  282. package/src/recording-controller/index.ts +20 -3
  283. package/src/recording-controller/util.ts +26 -9
  284. package/src/roap/index.ts +23 -30
  285. package/src/roap/request.ts +100 -104
  286. package/src/roap/turnDiscovery.ts +51 -25
  287. package/src/rtcMetrics/constants.ts +3 -0
  288. package/src/rtcMetrics/index.ts +100 -0
  289. package/src/statsAnalyzer/index.ts +88 -88
  290. package/src/statsAnalyzer/mqaUtil.ts +13 -14
  291. package/test/integration/spec/converged-space-meetings.js +60 -3
  292. package/test/integration/spec/journey.js +320 -261
  293. package/test/integration/spec/space-meeting.js +76 -3
  294. package/test/unit/spec/annotation/index.ts +418 -0
  295. package/test/unit/spec/breakouts/breakout.ts +142 -24
  296. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  297. package/test/unit/spec/breakouts/events.ts +89 -0
  298. package/test/unit/spec/breakouts/index.ts +1488 -67
  299. package/test/unit/spec/breakouts/request.ts +104 -0
  300. package/test/unit/spec/breakouts/utils.js +72 -0
  301. package/test/unit/spec/common/queue.js +31 -2
  302. package/test/unit/spec/controls-options-manager/index.js +163 -0
  303. package/test/unit/spec/controls-options-manager/util.js +576 -60
  304. package/test/unit/spec/fixture/locus.js +1 -0
  305. package/test/unit/spec/interpretation/collection.ts +15 -0
  306. package/test/unit/spec/interpretation/index.ts +589 -0
  307. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  308. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  309. package/test/unit/spec/locus-info/index.js +1304 -33
  310. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  311. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  312. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  313. package/test/unit/spec/locus-info/parser.js +116 -35
  314. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  315. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  316. package/test/unit/spec/media/index.ts +104 -37
  317. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  318. package/test/unit/spec/meeting/index.js +4515 -1932
  319. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  320. package/test/unit/spec/meeting/muteState.js +408 -208
  321. package/test/unit/spec/meeting/request.js +440 -45
  322. package/test/unit/spec/meeting/utils.js +679 -64
  323. package/test/unit/spec/meeting-info/index.js +295 -0
  324. package/test/unit/spec/meeting-info/meetinginfov2.js +521 -5
  325. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  326. package/test/unit/spec/meetings/collection.js +14 -0
  327. package/test/unit/spec/meetings/index.js +1007 -177
  328. package/test/unit/spec/meetings/utils.js +206 -2
  329. package/test/unit/spec/member/index.js +58 -4
  330. package/test/unit/spec/member/util.js +479 -35
  331. package/test/unit/spec/members/index.js +319 -1
  332. package/test/unit/spec/members/request.js +206 -27
  333. package/test/unit/spec/members/utils.js +184 -0
  334. package/test/unit/spec/metrics/index.js +1 -50
  335. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  336. package/test/unit/spec/multistream/receiveSlot.ts +43 -20
  337. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  338. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  339. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  340. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  341. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  342. package/test/unit/spec/reachability/index.ts +549 -9
  343. package/test/unit/spec/reachability/request.js +68 -0
  344. package/test/unit/spec/reconnection-manager/index.js +84 -9
  345. package/test/unit/spec/recording-controller/index.js +294 -218
  346. package/test/unit/spec/recording-controller/util.js +223 -96
  347. package/test/unit/spec/roap/index.ts +31 -51
  348. package/test/unit/spec/roap/request.ts +203 -85
  349. package/test/unit/spec/roap/turnDiscovery.ts +48 -13
  350. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  351. package/test/unit/spec/stats-analyzer/index.js +64 -2
  352. package/test/utils/integrationTestUtils.js +46 -0
  353. package/test/utils/testUtils.js +0 -52
  354. package/dist/meeting/effectsState.js +0 -262
  355. package/dist/meeting/effectsState.js.map +0 -1
  356. package/dist/metrics/config.js +0 -299
  357. package/dist/metrics/config.js.map +0 -1
  358. package/dist/types/meeting/effectsState.d.ts +0 -42
  359. package/dist/types/metrics/config.d.ts +0 -178
  360. package/src/index.js +0 -16
  361. package/src/meeting/effectsState.ts +0 -211
  362. package/src/metrics/config.ts +0 -495
  363. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -0,0 +1,589 @@
1
+ import {assert, expect} from '@webex/test-helper-chai';
2
+ import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
3
+ import SimultaneousInterpretation from '@webex/plugin-meetings/src/interpretation';
4
+ import MockWebex from '@webex/test-helper-mock-webex';
5
+ import sinon from 'sinon';
6
+
7
+ describe('plugin-meetings', () => {
8
+ describe('SimultaneousInterpretation', () => {
9
+ let webex;
10
+ let interpretation;
11
+
12
+ beforeEach(() => {
13
+ // @ts-ignore
14
+ webex = new MockWebex({});
15
+ webex.internal.mercury.on = sinon.stub();
16
+ interpretation = new SimultaneousInterpretation({}, {parent: webex});
17
+ interpretation.locusUrl = 'locusUrl';
18
+ webex.request = sinon.stub().returns(Promise.resolve('REQUEST_RETURN_VALUE'));
19
+ webex.meetings = {};
20
+ webex.meetings.getMeetingByType = sinon.stub();
21
+ });
22
+
23
+ describe('#initialize', () => {
24
+ it('creates SimultaneousInterpretation as expected', () => {
25
+ assert.equal(interpretation.namespace, 'Meetings');
26
+ });
27
+ it('call querySupportLanguages correctly when meet the conditions', () => {
28
+ interpretation.querySupportLanguages = sinon.stub();
29
+ interpretation.set({
30
+ canManageInterpreters: true,
31
+ });
32
+ assert.called(interpretation.querySupportLanguages);
33
+ });
34
+ });
35
+
36
+ describe('#cleanUp', () => {
37
+ it('stops listening', () => {
38
+ interpretation.stopListening = sinon.stub();
39
+
40
+ interpretation.cleanUp();
41
+
42
+ assert.calledOnceWithExactly(interpretation.stopListening);
43
+ });
44
+ });
45
+
46
+ describe('#locusUrlUpdate', () => {
47
+ it('sets the locus url', () => {
48
+ interpretation.locusUrlUpdate('newUrl');
49
+
50
+ assert.equal(interpretation.locusUrl, 'newUrl');
51
+ });
52
+ });
53
+
54
+ describe('#approvalUrlUpdate', () => {
55
+ it('sets the approval url', () => {
56
+ interpretation.approvalUrlUpdate('newUrl');
57
+
58
+ assert.equal(interpretation.approvalUrl, 'newUrl');
59
+ });
60
+ });
61
+
62
+ describe('#updateCanManageInterpreters', () => {
63
+ it('update canManageInterpreters', () => {
64
+ interpretation.updateCanManageInterpreters(true);
65
+
66
+ assert.equal(interpretation.canManageInterpreters, true);
67
+
68
+ interpretation.updateCanManageInterpreters(false);
69
+
70
+ assert.equal(interpretation.canManageInterpreters, false);
71
+ });
72
+ });
73
+
74
+ describe('#updateHostSIEnabled', () => {
75
+ it('update hostSI feature is on or off', () => {
76
+ interpretation.updateHostSIEnabled(true);
77
+
78
+ assert.equal(interpretation.hostSIEnabled, true);
79
+
80
+ interpretation.updateHostSIEnabled(false);
81
+
82
+ assert.equal(interpretation.hostSIEnabled, false);
83
+ });
84
+ });
85
+
86
+ describe('#updateMeetingSIEnabled', () => {
87
+ it('update meeting SI feature is on or off, and self is scheduled interpreter or not', () => {
88
+ interpretation.updateMeetingSIEnabled(true, false);
89
+
90
+ assert.equal(interpretation.meetingSIEnabled, true);
91
+ assert.equal(interpretation.selfIsInterpreter, false);
92
+
93
+ interpretation.updateMeetingSIEnabled(true, true);
94
+
95
+ assert.equal(interpretation.meetingSIEnabled, true);
96
+ assert.equal(interpretation.selfIsInterpreter, true);
97
+
98
+ interpretation.updateMeetingSIEnabled(false, false);
99
+
100
+ assert.equal(interpretation.meetingSIEnabled, false);
101
+ assert.equal(interpretation.selfIsInterpreter, false);
102
+ });
103
+ });
104
+
105
+ describe('#updateInterpretation', () => {
106
+ const checkSILanguage = (siLanguage, expectResult) => {
107
+ return siLanguage?.languageCode === expectResult.languageCode && siLanguage?.languageName === expectResult.languageName
108
+ }
109
+ it('update interpretation correctly', () => {
110
+ interpretation.updateInterpretation({siLanguages: [{languageName: 'en', languageCode: 1}]});
111
+ checkSILanguage(interpretation.siLanguages.en, {languageName: 'en', languageCode: 1});
112
+ });
113
+ });
114
+
115
+ describe('#updateSelfInterpretation', () => {
116
+ it('update self interpretation correctly', () => {
117
+ const sampleData: any = {
118
+ interpretation: {
119
+ originalLanguage: 'en',
120
+ sourceLanguage: 'en',
121
+ targetLanguage: 'zh',
122
+ isActive: true,
123
+ receiveLanguage: 'en',
124
+ order: 0,
125
+ }, selfParticipantId: '123'};
126
+ interpretation.updateSelfInterpretation(sampleData);
127
+ assert.equal(interpretation.originalLanguage, 'en');
128
+ assert.equal(interpretation.sourceLanguage, 'en');
129
+ assert.equal(interpretation.targetLanguage, 'zh');
130
+ assert.equal(interpretation.receiveLanguage, 'en');
131
+ assert.equal(interpretation.isActive, true);
132
+ assert.equal(interpretation.order, 0);
133
+
134
+ sampleData.interpretation = {
135
+ originalLanguage: 'en',
136
+ order: 0,
137
+ };
138
+ interpretation.updateSelfInterpretation(sampleData);
139
+ assert.equal(interpretation.sourceLanguage, undefined);
140
+ assert.equal(interpretation.targetLanguage, undefined);
141
+ assert.equal(interpretation.receiveLanguage, undefined);
142
+ });
143
+ });
144
+
145
+ describe('#querySupportLanguages', () => {
146
+ it('makes the request as expected', async () => {
147
+ const mockedReturnBody = {
148
+ siLanguages: [{
149
+ languageCode: 43,
150
+ languageName: 'it'
151
+ },
152
+ {
153
+ languageCode: 20,
154
+ languageName: 'en'
155
+ }]
156
+ };
157
+ webex.request.returns(
158
+ Promise.resolve({
159
+ body: mockedReturnBody,
160
+ })
161
+ );
162
+
163
+ await interpretation.querySupportLanguages();
164
+ assert.calledOnceWithExactly(webex.request, {
165
+ method: 'GET',
166
+ uri: 'locusUrl/languages/interpretation',
167
+ });
168
+ assert.deepEqual(interpretation.supportLanguages, mockedReturnBody.siLanguages);
169
+ });
170
+
171
+ it('rejects with error', async () => {
172
+ const mockError = new Error('something wrong');
173
+ webex.request.returns(Promise.reject(mockError));
174
+ LoggerProxy.logger.error = sinon.stub();
175
+
176
+ await assert.isRejected(interpretation.querySupportLanguages(), mockError, 'something wrong');
177
+
178
+ assert.calledOnceWithExactly(
179
+ LoggerProxy.logger.error,
180
+ 'Meeting:interpretation#querySupportLanguages failed',
181
+ mockError
182
+ );
183
+ });
184
+ });
185
+
186
+ describe('#getInterpreters', () => {
187
+ it('makes the request as expected', async () => {
188
+ const mockedReturnBody = {
189
+ interpreters: [{
190
+ emailAddress : 'bob@example.com',
191
+ emailHash : 'fdde32a3-97b0-4511-b0b5-2731cc9c5266',
192
+ originalLanguageId : 0,
193
+ originalLanguage : 'cn',
194
+ sourceLanguageId : 0,
195
+ sourceLanguage : 'cn',
196
+ targetLanguageId : 1,
197
+ targetLanguage : 'en',
198
+ order : 0,
199
+ isActive : true
200
+ },]
201
+ };
202
+ webex.request.returns(
203
+ Promise.resolve({
204
+ body: mockedReturnBody,
205
+ })
206
+ );
207
+
208
+ const result = await interpretation.getInterpreters();
209
+ assert.calledOnceWithExactly(webex.request, {
210
+ method: 'GET',
211
+ uri: 'locusUrl/interpretation/interpreters',
212
+ });
213
+ assert.deepEqual(result, {body: mockedReturnBody})
214
+ });
215
+
216
+ it('rejects with error', async () => {
217
+ const mockError = new Error('something wrong');
218
+ webex.request.returns(Promise.reject(mockError));
219
+ LoggerProxy.logger.error = sinon.stub();
220
+
221
+ await assert.isRejected(interpretation.getInterpreters(), mockError, 'something wrong');
222
+
223
+ assert.calledOnceWithExactly(
224
+ LoggerProxy.logger.error,
225
+ 'Meeting:interpretation#getInterpreters failed',
226
+ mockError
227
+ );
228
+ });
229
+ });
230
+
231
+ describe('#updateInterpreters', () => {
232
+ it('makes the request as expected', async () => {
233
+ const sampleData = [{
234
+ emailAddress : 'bob@example.com',
235
+ emailHash : 'fdde32a3-97b0-4511-b0b5-2731cc9c5266',
236
+ originalLanguageId : 0,
237
+ originalLanguage : 'cn',
238
+ sourceLanguageId : 0,
239
+ sourceLanguage : 'cn',
240
+ targetLanguageId : 1,
241
+ targetLanguage : 'en',
242
+ order : 0,
243
+ isActive : true
244
+ },];
245
+ webex.request.returns(Promise.resolve({}));
246
+
247
+ await interpretation.updateInterpreters(sampleData);
248
+ assert.calledOnceWithExactly(webex.request, {
249
+ method: 'PATCH',
250
+ uri: 'locusUrl/controls',
251
+ body: {
252
+ interpretation: {
253
+ interpreters: sampleData,
254
+ },
255
+ },
256
+ });
257
+ });
258
+
259
+ it('rejects with error', async () => {
260
+ const mockError = new Error('something wrong');
261
+ webex.request.returns(Promise.reject(mockError));
262
+ LoggerProxy.logger.error = sinon.stub();
263
+
264
+ await assert.isRejected(interpretation.updateInterpreters(), mockError, 'something wrong');
265
+
266
+ assert.calledOnceWithExactly(
267
+ LoggerProxy.logger.error,
268
+ 'Meeting:interpretation#updateInterpreters failed',
269
+ mockError
270
+ );
271
+ });
272
+ });
273
+
274
+ describe('#changeDirection', () => {
275
+ it('makes the request as expected', async () => {
276
+ interpretation.set({
277
+ sourceLanguage : 'cn',
278
+ targetLanguage : 'en',
279
+ isActive: true,
280
+ order: 0,
281
+ selfParticipantId: '123',
282
+ });
283
+ webex.request.returns(Promise.resolve({}));
284
+
285
+ await interpretation.changeDirection();
286
+ assert.calledOnceWithExactly(webex.request, {
287
+ method: 'PATCH',
288
+ uri: 'locusUrl/participant/123/controls',
289
+ body: {
290
+ interpretation: {
291
+ sourceLanguage : 'en',
292
+ targetLanguage : 'cn',
293
+ isActive: true,
294
+ order: 0,
295
+ },
296
+ },
297
+ });
298
+ });
299
+
300
+ it('request rejects with error', async () => {
301
+ interpretation.set({
302
+ sourceLanguage : 'cn',
303
+ targetLanguage : 'en',
304
+ isActive: true,
305
+ order: 0,
306
+ selfParticipantId: '123',
307
+ });
308
+ const mockError = new Error('something wrong');
309
+ webex.request.returns(Promise.reject(mockError));
310
+ LoggerProxy.logger.error = sinon.stub();
311
+
312
+ await assert.isRejected(interpretation.changeDirection(), mockError, 'something wrong');
313
+
314
+ assert.calledOnceWithExactly(
315
+ LoggerProxy.logger.error,
316
+ 'Meeting:interpretation#changeDirection failed',
317
+ mockError
318
+ );
319
+ });
320
+
321
+ it('rejects error when no sourceLanguage or targetLanguage', async () => {
322
+ interpretation.set({
323
+ sourceLanguage : 'cn',
324
+ isActive: true,
325
+ order: 0,
326
+ selfParticipantId: '123',
327
+ });
328
+ LoggerProxy.logger.error = sinon.stub();
329
+
330
+ await interpretation.changeDirection().catch((error) => {
331
+ assert.equal(error.toString(), 'Error: Missing sourceLanguage or targetLanguage');
332
+ });
333
+
334
+ interpretation.set({
335
+ targetLanguage : 'en',
336
+ isActive: true,
337
+ order: 0,
338
+ selfParticipantId: '123',
339
+ });
340
+ await interpretation.changeDirection().catch((error) => {
341
+ assert.equal(error.toString(), 'Error: Missing sourceLanguage or targetLanguage');
342
+ });
343
+ });
344
+
345
+ it('rejects error when no self participant id', async () => {
346
+ interpretation.set({
347
+ sourceLanguage : 'cn',
348
+ targetLanguage : 'en',
349
+ isActive: true,
350
+ order: 0,
351
+ });
352
+ LoggerProxy.logger.error = sinon.stub();
353
+
354
+ await interpretation.changeDirection().catch((error) => {
355
+ assert.equal(error.toString(), 'Error: Missing self participant id');
356
+ });
357
+ });
358
+ });
359
+
360
+ describe('#listenToHandoffRequests', () => {
361
+ it('triggers handoff update event when the approval is related with self', () => {
362
+ const call = webex.internal.mercury.on.getCall(0);
363
+ const callback = call.args[1];
364
+
365
+ assert.equal(call.args[0], 'event:locus.approval_request');
366
+ interpretation.set('selfParticipantId', 'p123');
367
+
368
+ let called = false;
369
+ const triggerSpy = sinon.spy(interpretation, 'trigger');
370
+
371
+ interpretation.listenTo(interpretation, 'HANDOFF_REQUESTS_ARRIVED', () => {
372
+ called = true;
373
+ });
374
+
375
+ callback({
376
+ data: {
377
+ approval: {
378
+ actionType: 'OFFERED',
379
+ resourceType: 'SiHandover',
380
+ receivers: [{
381
+ participantId: 'p123',
382
+ }],
383
+ initiator: {participantId: 'p123'},
384
+ url: 'testUrl',
385
+ },
386
+ }
387
+ });
388
+
389
+ assert.isTrue(called);
390
+ assert.calledWithExactly(triggerSpy, 'HANDOFF_REQUESTS_ARRIVED', {
391
+ actionType: 'OFFERED',
392
+ isReceiver: true,
393
+ isSender: true,
394
+ senderId: 'p123',
395
+ receiverId: 'p123',
396
+ url: 'testUrl',
397
+ });
398
+ });
399
+
400
+ it('not triggers handoff update event when the approval is not related with self', () => {
401
+ const call = webex.internal.mercury.on.getCall(0);
402
+ const callback = call.args[1];
403
+
404
+ interpretation.set('selfParticipantId', 'p123');
405
+
406
+ let called = false;
407
+
408
+ interpretation.listenTo(interpretation, 'HANDOFF_REQUESTS_ARRIVED', () => {
409
+ called = true;
410
+ });
411
+
412
+ callback({
413
+ data: {
414
+ approval: {
415
+ actionType: 'OFFERED',
416
+ resourceType: 'SiHandover',
417
+ receivers: [{
418
+ participantId: 'p444',
419
+ }],
420
+ initiator: {participantId: 'p444'},
421
+ url: 'testUrl',
422
+ },
423
+ }
424
+ });
425
+
426
+ assert.isFalse(called);
427
+ });
428
+ });
429
+
430
+ describe('#handoffInterpreter', () => {
431
+ it('makes the request as expected', async () => {
432
+ interpretation.approvalUrlUpdate('approvalUrl');
433
+ await interpretation.handoffInterpreter('participant2');
434
+ assert.calledOnceWithExactly(webex.request, {
435
+ method: 'POST',
436
+ uri: 'approvalUrl',
437
+ body: {
438
+ actionType: 'OFFERED',
439
+ resourceType: 'SiHandover',
440
+ receivers: [
441
+ {
442
+ participantId: 'participant2',
443
+ },
444
+ ],
445
+ },
446
+ });
447
+ });
448
+
449
+ it('rejects with error', async () => {
450
+ const mockError = new Error('something wrong');
451
+ webex.request.returns(Promise.reject(mockError));
452
+ LoggerProxy.logger.error = sinon.stub();
453
+ interpretation.approvalUrlUpdate('approvalUrl');
454
+
455
+ await assert.isRejected(interpretation.handoffInterpreter('p2'), mockError, 'something wrong');
456
+
457
+ assert.calledOnceWithExactly(
458
+ LoggerProxy.logger.error,
459
+ 'Meeting:interpretation#handoffInterpreter failed',
460
+ mockError
461
+ );
462
+ });
463
+
464
+ it('rejects error when no target participant id', async () => {
465
+ LoggerProxy.logger.error = sinon.stub();
466
+
467
+ await interpretation.handoffInterpreter().catch((error) => {
468
+ assert.equal(error.toString(), 'Error: Missing target participant id');
469
+ });
470
+ });
471
+
472
+ it('rejects error when no approval url', async () => {
473
+ LoggerProxy.logger.error = sinon.stub();
474
+
475
+ await interpretation.handoffInterpreter('p2').catch((error) => {
476
+ assert.equal(error.toString(), 'Error: Missing approval url');
477
+ });
478
+ });
479
+ });
480
+
481
+ describe('#requestHandoff', () => {
482
+ it('makes the request as expected', async () => {
483
+ interpretation.approvalUrlUpdate('approvalUrl');
484
+ await interpretation.requestHandoff();
485
+ assert.calledOnceWithExactly(webex.request, {
486
+ method: 'POST',
487
+ uri: 'approvalUrl',
488
+ body: {
489
+ actionType: 'REQUESTED',
490
+ resourceType: 'SiHandover',
491
+ },
492
+ });
493
+ });
494
+
495
+ it('rejects with error', async () => {
496
+ const mockError = new Error('something wrong');
497
+ webex.request.returns(Promise.reject(mockError));
498
+ LoggerProxy.logger.error = sinon.stub();
499
+ interpretation.approvalUrlUpdate('approvalUrl');
500
+
501
+ await assert.isRejected(interpretation.requestHandoff(), mockError, 'something wrong');
502
+
503
+ assert.calledOnceWithExactly(
504
+ LoggerProxy.logger.error,
505
+ 'Meeting:interpretation#requestHandoff failed',
506
+ mockError
507
+ );
508
+ });
509
+
510
+ it('rejects error when no approval url', async () => {
511
+ LoggerProxy.logger.error = sinon.stub();
512
+
513
+ await interpretation.requestHandoff().catch((error) => {
514
+ assert.equal(error.toString(), 'Error: Missing approval url');
515
+ });
516
+ });
517
+ });
518
+
519
+ describe('#acceptRequest', () => {
520
+ it('makes the request as expected', async () => {
521
+ await interpretation.acceptRequest('testUrl');
522
+ assert.calledOnceWithExactly(webex.request, {
523
+ method: 'PUT',
524
+ uri: 'testUrl',
525
+ body: {
526
+ actionType: 'ACCEPTED',
527
+ },
528
+ });
529
+ });
530
+
531
+ it('rejects with error', async () => {
532
+ const mockError = new Error('something wrong');
533
+ webex.request.returns(Promise.reject(mockError));
534
+ LoggerProxy.logger.error = sinon.stub();
535
+
536
+ await assert.isRejected(interpretation.acceptRequest('testUrl'), mockError, 'something wrong');
537
+
538
+ assert.calledOnceWithExactly(
539
+ LoggerProxy.logger.error,
540
+ 'Meeting:interpretation#acceptRequest failed',
541
+ mockError
542
+ );
543
+ });
544
+
545
+ it('rejects error when no url passed', async () => {
546
+ LoggerProxy.logger.error = sinon.stub();
547
+
548
+ await interpretation.acceptRequest().catch((error) => {
549
+ assert.equal(error.toString(), 'Error: Missing the url to accept');
550
+ });
551
+ });
552
+ });
553
+
554
+ describe('#declineRequest', () => {
555
+ it('makes the request as expected', async () => {
556
+ await interpretation.declineRequest('testUrl');
557
+ assert.calledOnceWithExactly(webex.request, {
558
+ method: 'PUT',
559
+ uri: 'testUrl',
560
+ body: {
561
+ actionType: 'DECLINED',
562
+ },
563
+ });
564
+ });
565
+
566
+ it('rejects with error', async () => {
567
+ const mockError = new Error('something wrong');
568
+ webex.request.returns(Promise.reject(mockError));
569
+ LoggerProxy.logger.error = sinon.stub();
570
+
571
+ await assert.isRejected(interpretation.declineRequest('testUrl'), mockError, 'something wrong');
572
+
573
+ assert.calledOnceWithExactly(
574
+ LoggerProxy.logger.error,
575
+ 'Meeting:interpretation#declineRequest failed',
576
+ mockError
577
+ );
578
+ });
579
+
580
+ it('rejects error when no url passed', async () => {
581
+ LoggerProxy.logger.error = sinon.stub();
582
+
583
+ await interpretation.declineRequest().catch((error) => {
584
+ assert.equal(error.toString(), 'Error: Missing the url to decline');
585
+ });
586
+ });
587
+ });
588
+ });
589
+ });
@@ -0,0 +1,28 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import SILanguage from '@webex/plugin-meetings/src/interpretation/siLanguage';
3
+ import SimultaneousInterpretation from '@webex/plugin-meetings/src/interpretation';
4
+ import MockWebex from '@webex/test-helper-mock-webex';
5
+ import sinon from 'sinon';
6
+
7
+ describe('plugin-meetings', () => {
8
+ describe('SILanguage', () => {
9
+ let webex;
10
+ let siLanguage;
11
+ let interpretation;
12
+ beforeEach(() => {
13
+ // @ts-ignore
14
+ webex = new MockWebex({});
15
+ webex.internal.mercury.on = sinon.stub();
16
+ interpretation = new SimultaneousInterpretation({}, {parent: webex});
17
+ siLanguage = new SILanguage({}, {parent: interpretation});
18
+ });
19
+ it('set siLanguage props correctly', () => {
20
+ siLanguage.set({
21
+ languageCode: 20,
22
+ languageName: 'en',
23
+ });
24
+ assert.equal(siLanguage.languageCode, 20);
25
+ assert.equal(siLanguage.languageName, 'en');
26
+ });
27
+ });
28
+ });