@webex/plugin-meetings 2.60.0-next.9 → 2.60.1

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 (516) hide show
  1. package/README.md +8 -46
  2. package/dist/common/browser-detection.js +3 -2
  3. package/dist/common/browser-detection.js.map +1 -1
  4. package/dist/common/collection.js +4 -3
  5. package/dist/common/collection.js.map +1 -1
  6. package/dist/common/config.js +2 -1
  7. package/dist/common/config.js.map +1 -1
  8. package/dist/common/errors/captcha-error.js +2 -1
  9. package/dist/common/errors/captcha-error.js.map +1 -1
  10. package/dist/common/errors/intent-to-join.js +2 -1
  11. package/dist/common/errors/intent-to-join.js.map +1 -1
  12. package/dist/common/errors/join-meeting.js +2 -1
  13. package/dist/common/errors/join-meeting.js.map +1 -1
  14. package/dist/common/errors/media.js +2 -1
  15. package/dist/common/errors/media.js.map +1 -1
  16. package/dist/common/errors/parameter.js +4 -3
  17. package/dist/common/errors/parameter.js.map +1 -1
  18. package/dist/common/errors/password-error.js +2 -1
  19. package/dist/common/errors/password-error.js.map +1 -1
  20. package/dist/common/errors/permission.js +2 -1
  21. package/dist/common/errors/permission.js.map +1 -1
  22. package/dist/common/errors/{reclaim-host-role-errors.js → reclaim-host-role-error.js} +11 -7
  23. package/dist/common/errors/reclaim-host-role-error.js.map +1 -0
  24. package/dist/common/errors/reconnection-in-progress.js +2 -1
  25. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  26. package/dist/common/errors/reconnection.js +2 -1
  27. package/dist/common/errors/reconnection.js.map +1 -1
  28. package/dist/common/errors/stats.js +2 -1
  29. package/dist/common/errors/stats.js.map +1 -1
  30. package/dist/common/errors/webex-errors.d.ts +8 -20
  31. package/dist/common/errors/webex-errors.js +28 -48
  32. package/dist/common/errors/webex-errors.js.map +1 -1
  33. package/dist/common/errors/webex-meetings-error.js +2 -1
  34. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  35. package/dist/common/events/events-scope.js +2 -1
  36. package/dist/common/events/events-scope.js.map +1 -1
  37. package/dist/common/events/events.js +2 -1
  38. package/dist/common/events/events.js.map +1 -1
  39. package/dist/common/events/trigger-proxy.js +2 -1
  40. package/dist/common/events/trigger-proxy.js.map +1 -1
  41. package/dist/common/events/util.js +2 -1
  42. package/dist/common/events/util.js.map +1 -1
  43. package/dist/common/logs/logger-config.js +2 -1
  44. package/dist/common/logs/logger-config.js.map +1 -1
  45. package/dist/common/logs/logger-proxy.js +3 -2
  46. package/dist/common/logs/logger-proxy.js.map +1 -1
  47. package/dist/common/logs/request.d.ts +1 -3
  48. package/dist/common/logs/request.js +5 -8
  49. package/dist/common/logs/request.js.map +1 -1
  50. package/dist/common/queue.d.ts +7 -9
  51. package/dist/common/queue.js +9 -22
  52. package/dist/common/queue.js.map +1 -1
  53. package/dist/config.d.ts +7 -5
  54. package/dist/config.js +11 -8
  55. package/dist/config.js.map +1 -1
  56. package/dist/constants.d.ts +97 -217
  57. package/dist/constants.js +441 -416
  58. package/dist/constants.js.map +1 -1
  59. package/dist/controls-options-manager/constants.js +6 -3
  60. package/dist/controls-options-manager/constants.js.map +1 -1
  61. package/dist/controls-options-manager/enums.d.ts +1 -11
  62. package/dist/controls-options-manager/enums.js +6 -15
  63. package/dist/controls-options-manager/enums.js.map +1 -1
  64. package/dist/controls-options-manager/index.d.ts +1 -17
  65. package/dist/controls-options-manager/index.js +38 -127
  66. package/dist/controls-options-manager/index.js.map +1 -1
  67. package/dist/controls-options-manager/util.d.ts +7 -1
  68. package/dist/controls-options-manager/util.js +19 -309
  69. package/dist/controls-options-manager/util.js.map +1 -1
  70. package/dist/index.d.ts +3 -6
  71. package/dist/index.js +4 -116
  72. package/dist/index.js.map +1 -1
  73. package/dist/locus-info/controlsUtils.js +11 -100
  74. package/dist/locus-info/controlsUtils.js.map +1 -1
  75. package/dist/locus-info/embeddedAppsUtils.js +4 -3
  76. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  77. package/dist/locus-info/fullState.js +2 -1
  78. package/dist/locus-info/fullState.js.map +1 -1
  79. package/dist/locus-info/hostUtils.js +2 -1
  80. package/dist/locus-info/hostUtils.js.map +1 -1
  81. package/dist/locus-info/index.d.ts +4 -57
  82. package/dist/locus-info/index.js +84 -425
  83. package/dist/locus-info/index.js.map +1 -1
  84. package/dist/locus-info/infoUtils.js +5 -13
  85. package/dist/locus-info/infoUtils.js.map +1 -1
  86. package/dist/locus-info/mediaSharesUtils.js +3 -58
  87. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  88. package/dist/locus-info/parser.d.ts +6 -66
  89. package/dist/locus-info/parser.js +80 -253
  90. package/dist/locus-info/parser.js.map +1 -1
  91. package/dist/locus-info/selfUtils.js +13 -97
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.d.ts +0 -2
  94. package/dist/media/index.js +319 -107
  95. package/dist/media/index.js.map +1 -1
  96. package/dist/media/properties.d.ts +53 -38
  97. package/dist/media/properties.js +153 -96
  98. package/dist/media/properties.js.map +1 -1
  99. package/dist/media/util.js +22 -1
  100. package/dist/media/util.js.map +1 -1
  101. package/dist/mediaQualityMetrics/config.d.ts +230 -234
  102. package/dist/mediaQualityMetrics/config.js +498 -302
  103. package/dist/mediaQualityMetrics/config.js.map +1 -1
  104. package/dist/meeting/effectsState.d.ts +42 -0
  105. package/dist/meeting/effectsState.js +260 -0
  106. package/dist/meeting/effectsState.js.map +1 -0
  107. package/dist/meeting/in-meeting-actions.d.ts +0 -88
  108. package/dist/meeting/in-meeting-actions.js +3 -94
  109. package/dist/meeting/in-meeting-actions.js.map +1 -1
  110. package/dist/meeting/index.d.ts +494 -591
  111. package/dist/meeting/index.js +2969 -4707
  112. package/dist/meeting/index.js.map +1 -1
  113. package/dist/meeting/muteState.d.ts +25 -93
  114. package/dist/meeting/muteState.js +133 -224
  115. package/dist/meeting/muteState.js.map +1 -1
  116. package/dist/meeting/request.d.ts +47 -82
  117. package/dist/meeting/request.js +199 -297
  118. package/dist/meeting/request.js.map +1 -1
  119. package/dist/meeting/state.js +2 -1
  120. package/dist/meeting/state.js.map +1 -1
  121. package/dist/meeting/util.d.ts +1 -102
  122. package/dist/meeting/util.js +435 -605
  123. package/dist/meeting/util.js.map +1 -1
  124. package/dist/meeting-info/collection.js +4 -3
  125. package/dist/meeting-info/collection.js.map +1 -1
  126. package/dist/meeting-info/index.d.ts +1 -13
  127. package/dist/meeting-info/index.js +7 -74
  128. package/dist/meeting-info/index.js.map +1 -1
  129. package/dist/meeting-info/meeting-info-v2.d.ts +1 -31
  130. package/dist/meeting-info/meeting-info-v2.js +63 -200
  131. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  132. package/dist/meeting-info/request.js +2 -1
  133. package/dist/meeting-info/request.js.map +1 -1
  134. package/dist/meeting-info/util.js +3 -2
  135. package/dist/meeting-info/util.js.map +1 -1
  136. package/dist/meeting-info/utilv2.js +41 -39
  137. package/dist/meeting-info/utilv2.js.map +1 -1
  138. package/dist/meetings/collection.d.ts +0 -17
  139. package/dist/meetings/collection.js +4 -42
  140. package/dist/meetings/collection.js.map +1 -1
  141. package/dist/meetings/index.d.ts +21 -103
  142. package/dist/meetings/index.js +124 -486
  143. package/dist/meetings/index.js.map +1 -1
  144. package/dist/meetings/request.js +3 -4
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +6 -107
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.d.ts +1 -13
  149. package/dist/member/index.js +2 -45
  150. package/dist/member/index.js.map +1 -1
  151. package/dist/member/member.types.js +4 -3
  152. package/dist/member/member.types.js.map +1 -1
  153. package/dist/member/util.js +29 -120
  154. package/dist/member/util.js.map +1 -1
  155. package/dist/members/collection.d.ts +0 -5
  156. package/dist/members/collection.js +2 -11
  157. package/dist/members/collection.js.map +1 -1
  158. package/dist/members/index.d.ts +11 -56
  159. package/dist/members/index.js +47 -174
  160. package/dist/members/index.js.map +1 -1
  161. package/dist/members/request.d.ts +11 -67
  162. package/dist/members/request.js +54 -102
  163. package/dist/members/request.js.map +1 -1
  164. package/dist/members/types.js +4 -3
  165. package/dist/members/types.js.map +1 -1
  166. package/dist/members/util.d.ts +1 -214
  167. package/dist/members/util.js +284 -327
  168. package/dist/members/util.js.map +1 -1
  169. package/dist/metrics/config.d.ts +169 -0
  170. package/dist/metrics/config.js +289 -0
  171. package/dist/metrics/config.js.map +1 -0
  172. package/dist/metrics/constants.d.ts +6 -15
  173. package/dist/metrics/constants.js +9 -17
  174. package/dist/metrics/constants.js.map +1 -1
  175. package/dist/metrics/index.d.ts +111 -4
  176. package/dist/metrics/index.js +452 -4
  177. package/dist/metrics/index.js.map +1 -1
  178. package/dist/networkQualityMonitor/index.js +4 -5
  179. package/dist/networkQualityMonitor/index.js.map +1 -1
  180. package/dist/peer-connection-manager/index.d.ts +6 -0
  181. package/dist/peer-connection-manager/index.js +671 -0
  182. package/dist/peer-connection-manager/index.js.map +1 -0
  183. package/dist/peer-connection-manager/util.d.ts +6 -0
  184. package/dist/peer-connection-manager/util.js +110 -0
  185. package/dist/peer-connection-manager/util.js.map +1 -0
  186. package/dist/personal-meeting-room/index.js +3 -2
  187. package/dist/personal-meeting-room/index.js.map +1 -1
  188. package/dist/personal-meeting-room/request.js +3 -2
  189. package/dist/personal-meeting-room/request.js.map +1 -1
  190. package/dist/personal-meeting-room/util.js +2 -1
  191. package/dist/personal-meeting-room/util.js.map +1 -1
  192. package/dist/reachability/index.d.ts +7 -62
  193. package/dist/reachability/index.js +72 -265
  194. package/dist/reachability/index.js.map +1 -1
  195. package/dist/reachability/request.d.ts +3 -7
  196. package/dist/reachability/request.js +10 -18
  197. package/dist/reachability/request.js.map +1 -1
  198. package/dist/reactions/reactions.d.ts +2 -2
  199. package/dist/reactions/reactions.js +6 -4
  200. package/dist/reactions/reactions.js.map +1 -1
  201. package/dist/reactions/reactions.type.d.ts +3 -23
  202. package/dist/reactions/reactions.type.js +23 -21
  203. package/dist/reactions/reactions.type.js.map +1 -1
  204. package/dist/reconnection-manager/index.d.ts +8 -32
  205. package/dist/reconnection-manager/index.js +231 -282
  206. package/dist/reconnection-manager/index.js.map +1 -1
  207. package/dist/recording-controller/enums.js +5 -4
  208. package/dist/recording-controller/enums.js.map +1 -1
  209. package/dist/recording-controller/index.d.ts +1 -15
  210. package/dist/recording-controller/index.js +46 -57
  211. package/dist/recording-controller/index.js.map +1 -1
  212. package/dist/recording-controller/util.d.ts +4 -5
  213. package/dist/recording-controller/util.js +10 -10
  214. package/dist/recording-controller/util.js.map +1 -1
  215. package/dist/roap/collection.d.ts +10 -0
  216. package/dist/roap/collection.js +63 -0
  217. package/dist/roap/collection.js.map +1 -0
  218. package/dist/roap/handler.d.ts +47 -0
  219. package/dist/roap/handler.js +279 -0
  220. package/dist/roap/handler.js.map +1 -0
  221. package/dist/roap/index.d.ts +47 -9
  222. package/dist/roap/index.js +235 -101
  223. package/dist/roap/index.js.map +1 -1
  224. package/dist/roap/request.d.ts +12 -18
  225. package/dist/roap/request.js +180 -126
  226. package/dist/roap/request.js.map +1 -1
  227. package/dist/roap/state.d.ts +9 -0
  228. package/dist/roap/state.js +127 -0
  229. package/dist/roap/state.js.map +1 -0
  230. package/dist/roap/turnDiscovery.d.ts +16 -27
  231. package/dist/roap/turnDiscovery.js +105 -115
  232. package/dist/roap/turnDiscovery.js.map +1 -1
  233. package/dist/roap/util.d.ts +2 -0
  234. package/dist/roap/util.js +76 -0
  235. package/dist/roap/util.js.map +1 -0
  236. package/dist/statsAnalyzer/global.d.ts +83 -1
  237. package/dist/statsAnalyzer/global.js +85 -2
  238. package/dist/statsAnalyzer/global.js.map +1 -1
  239. package/dist/statsAnalyzer/index.d.ts +30 -28
  240. package/dist/statsAnalyzer/index.js +509 -374
  241. package/dist/statsAnalyzer/index.js.map +1 -1
  242. package/dist/statsAnalyzer/mqaUtil.d.ts +6 -8
  243. package/dist/statsAnalyzer/mqaUtil.js +83 -116
  244. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  245. package/dist/transcription/index.js +2 -1
  246. package/dist/transcription/index.js.map +1 -1
  247. package/package.json +26 -35
  248. package/src/common/errors/webex-errors.ts +12 -36
  249. package/src/common/logs/logger-proxy.ts +1 -1
  250. package/src/common/logs/request.ts +1 -5
  251. package/src/common/queue.ts +8 -22
  252. package/src/config.ts +7 -5
  253. package/src/constants.ts +97 -244
  254. package/src/controls-options-manager/enums.ts +0 -12
  255. package/src/controls-options-manager/index.ts +21 -116
  256. package/src/controls-options-manager/util.ts +14 -294
  257. package/src/index.js +15 -0
  258. package/src/locus-info/controlsUtils.ts +0 -110
  259. package/src/locus-info/index.ts +61 -449
  260. package/src/locus-info/infoUtils.ts +2 -14
  261. package/src/locus-info/mediaSharesUtils.ts +0 -64
  262. package/src/locus-info/parser.ts +47 -258
  263. package/src/locus-info/selfUtils.ts +2 -85
  264. package/src/media/index.ts +370 -153
  265. package/src/media/properties.ts +136 -106
  266. package/src/media/util.ts +21 -0
  267. package/src/mediaQualityMetrics/config.ts +377 -244
  268. package/src/meeting/effectsState.ts +209 -0
  269. package/src/meeting/in-meeting-actions.ts +0 -176
  270. package/src/meeting/index.ts +2482 -3929
  271. package/src/meeting/muteState.ts +138 -224
  272. package/src/meeting/request.ts +127 -207
  273. package/src/meeting/util.ts +423 -590
  274. package/src/meeting-info/index.ts +8 -81
  275. package/src/meeting-info/meeting-info-v2.ts +13 -163
  276. package/src/meeting-info/util.ts +1 -1
  277. package/src/meeting-info/utilv2.ts +28 -28
  278. package/src/meetings/collection.ts +0 -33
  279. package/src/meetings/index.ts +126 -486
  280. package/src/meetings/request.ts +0 -2
  281. package/src/meetings/util.ts +5 -116
  282. package/src/member/index.ts +1 -43
  283. package/src/member/util.ts +28 -125
  284. package/src/members/collection.ts +0 -8
  285. package/src/members/index.ts +52 -187
  286. package/src/members/request.ts +27 -87
  287. package/src/members/util.ts +291 -332
  288. package/src/metrics/config.ts +485 -0
  289. package/src/metrics/constants.ts +6 -15
  290. package/src/metrics/index.ts +471 -1
  291. package/src/networkQualityMonitor/index.ts +6 -6
  292. package/src/peer-connection-manager/index.ts +847 -0
  293. package/src/peer-connection-manager/util.ts +119 -0
  294. package/src/reachability/index.ts +45 -238
  295. package/src/reachability/request.ts +8 -17
  296. package/src/reactions/reactions.ts +4 -4
  297. package/src/reactions/reactions.type.ts +4 -30
  298. package/src/reconnection-manager/index.ts +156 -168
  299. package/src/recording-controller/index.ts +3 -20
  300. package/src/recording-controller/util.ts +9 -26
  301. package/src/roap/collection.ts +62 -0
  302. package/src/roap/handler.ts +294 -0
  303. package/src/roap/index.ts +241 -98
  304. package/src/roap/request.ts +148 -74
  305. package/src/roap/state.ts +156 -0
  306. package/src/roap/turnDiscovery.ts +56 -62
  307. package/src/roap/util.ts +100 -0
  308. package/src/statsAnalyzer/global.ts +84 -1
  309. package/src/statsAnalyzer/index.ts +642 -413
  310. package/src/statsAnalyzer/mqaUtil.ts +114 -111
  311. package/test/integration/spec/journey.js +264 -320
  312. package/test/integration/spec/space-meeting.js +4 -77
  313. package/test/unit/spec/common/queue.js +2 -31
  314. package/test/unit/spec/controls-options-manager/index.js +0 -163
  315. package/test/unit/spec/controls-options-manager/util.js +60 -576
  316. package/test/unit/spec/fixture/locus.js +0 -1
  317. package/test/unit/spec/locus-info/controlsUtils.js +30 -323
  318. package/test/unit/spec/locus-info/index.js +15 -1389
  319. package/test/unit/spec/locus-info/infoUtils.js +16 -54
  320. package/test/unit/spec/locus-info/lib/SeqCmp.json +0 -16
  321. package/test/unit/spec/locus-info/lib/selfConstant.js +0 -48
  322. package/test/unit/spec/locus-info/parser.js +35 -116
  323. package/test/unit/spec/locus-info/selfUtils.js +0 -275
  324. package/test/unit/spec/media/properties.ts +84 -75
  325. package/test/unit/spec/meeting/effectsState.js +281 -0
  326. package/test/unit/spec/meeting/in-meeting-actions.ts +0 -86
  327. package/test/unit/spec/meeting/index.js +3136 -8547
  328. package/test/unit/spec/meeting/muteState.js +213 -409
  329. package/test/unit/spec/meeting/request.js +42 -512
  330. package/test/unit/spec/meeting/utils.js +24 -741
  331. package/test/unit/spec/meeting-info/meetinginfov2.js +5 -527
  332. package/test/unit/spec/meeting-info/utilv2.js +0 -21
  333. package/test/unit/spec/meetings/collection.js +0 -26
  334. package/test/unit/spec/meetings/index.js +211 -1278
  335. package/test/unit/spec/meetings/utils.js +2 -202
  336. package/test/unit/spec/member/index.js +9 -32
  337. package/test/unit/spec/member/util.js +61 -499
  338. package/test/unit/spec/members/index.js +5 -394
  339. package/test/unit/spec/members/request.js +27 -206
  340. package/test/unit/spec/members/utils.js +38 -173
  341. package/test/unit/spec/metrics/index.js +50 -1
  342. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  343. package/test/unit/spec/peerconnection-manager/index.js +218 -0
  344. package/test/unit/spec/peerconnection-manager/utils.js +49 -0
  345. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +388 -0
  346. package/test/unit/spec/reachability/index.ts +24 -598
  347. package/test/unit/spec/reconnection-manager/index.js +24 -162
  348. package/test/unit/spec/recording-controller/index.js +218 -293
  349. package/test/unit/spec/recording-controller/util.js +96 -223
  350. package/test/unit/spec/roap/index.ts +76 -200
  351. package/test/unit/spec/roap/turnDiscovery.ts +48 -86
  352. package/test/unit/spec/roap/util.js +30 -0
  353. package/test/unit/spec/stats-analyzer/index.js +174 -188
  354. package/test/utils/testUtils.js +45 -0
  355. package/test/utils/webex-config.js +0 -4
  356. package/test/utils/webex-test-users.js +3 -7
  357. package/dist/annotation/annotation.types.d.ts +0 -42
  358. package/dist/annotation/annotation.types.js +0 -7
  359. package/dist/annotation/annotation.types.js.map +0 -1
  360. package/dist/annotation/constants.d.ts +0 -31
  361. package/dist/annotation/constants.js +0 -41
  362. package/dist/annotation/constants.js.map +0 -1
  363. package/dist/annotation/index.d.ts +0 -117
  364. package/dist/annotation/index.js +0 -357
  365. package/dist/annotation/index.js.map +0 -1
  366. package/dist/breakouts/breakout.d.ts +0 -8
  367. package/dist/breakouts/breakout.js +0 -215
  368. package/dist/breakouts/breakout.js.map +0 -1
  369. package/dist/breakouts/collection.d.ts +0 -5
  370. package/dist/breakouts/collection.js +0 -22
  371. package/dist/breakouts/collection.js.map +0 -1
  372. package/dist/breakouts/edit-lock-error.d.ts +0 -15
  373. package/dist/breakouts/edit-lock-error.js +0 -51
  374. package/dist/breakouts/edit-lock-error.js.map +0 -1
  375. package/dist/breakouts/events.d.ts +0 -8
  376. package/dist/breakouts/events.js +0 -44
  377. package/dist/breakouts/events.js.map +0 -1
  378. package/dist/breakouts/index.d.ts +0 -5
  379. package/dist/breakouts/index.js +0 -1047
  380. package/dist/breakouts/index.js.map +0 -1
  381. package/dist/breakouts/request.d.ts +0 -22
  382. package/dist/breakouts/request.js +0 -77
  383. package/dist/breakouts/request.js.map +0 -1
  384. package/dist/breakouts/utils.d.ts +0 -15
  385. package/dist/breakouts/utils.js +0 -64
  386. package/dist/breakouts/utils.js.map +0 -1
  387. package/dist/common/errors/no-meeting-info.d.ts +0 -14
  388. package/dist/common/errors/no-meeting-info.js +0 -50
  389. package/dist/common/errors/no-meeting-info.js.map +0 -1
  390. package/dist/common/errors/reclaim-host-role-errors.js.map +0 -1
  391. package/dist/controls-options-manager/types.d.ts +0 -43
  392. package/dist/controls-options-manager/types.js +0 -7
  393. package/dist/controls-options-manager/types.js.map +0 -1
  394. package/dist/interpretation/collection.d.ts +0 -5
  395. package/dist/interpretation/collection.js +0 -22
  396. package/dist/interpretation/collection.js.map +0 -1
  397. package/dist/interpretation/index.d.ts +0 -5
  398. package/dist/interpretation/index.js +0 -365
  399. package/dist/interpretation/index.js.map +0 -1
  400. package/dist/interpretation/siLanguage.d.ts +0 -5
  401. package/dist/interpretation/siLanguage.js +0 -24
  402. package/dist/interpretation/siLanguage.js.map +0 -1
  403. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  404. package/dist/meeting/locusMediaRequest.js +0 -291
  405. package/dist/meeting/locusMediaRequest.js.map +0 -1
  406. package/dist/meeting/request.type.d.ts +0 -11
  407. package/dist/meeting/request.type.js +0 -7
  408. package/dist/meeting/request.type.js.map +0 -1
  409. package/dist/meetings/meetings.types.d.ts +0 -4
  410. package/dist/meetings/meetings.types.js +0 -7
  411. package/dist/meetings/meetings.types.js.map +0 -1
  412. package/dist/member/types.d.ts +0 -32
  413. package/dist/member/types.js +0 -23
  414. package/dist/member/types.js.map +0 -1
  415. package/dist/multistream/mediaRequestManager.d.ts +0 -118
  416. package/dist/multistream/mediaRequestManager.js +0 -344
  417. package/dist/multistream/mediaRequestManager.js.map +0 -1
  418. package/dist/multistream/receiveSlot.d.ts +0 -68
  419. package/dist/multistream/receiveSlot.js +0 -200
  420. package/dist/multistream/receiveSlot.js.map +0 -1
  421. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  422. package/dist/multistream/receiveSlotManager.js +0 -174
  423. package/dist/multistream/receiveSlotManager.js.map +0 -1
  424. package/dist/multistream/remoteMedia.d.ts +0 -72
  425. package/dist/multistream/remoteMedia.js +0 -268
  426. package/dist/multistream/remoteMedia.js.map +0 -1
  427. package/dist/multistream/remoteMediaGroup.d.ts +0 -47
  428. package/dist/multistream/remoteMediaGroup.js +0 -267
  429. package/dist/multistream/remoteMediaGroup.js.map +0 -1
  430. package/dist/multistream/remoteMediaManager.d.ts +0 -285
  431. package/dist/multistream/remoteMediaManager.js +0 -1211
  432. package/dist/multistream/remoteMediaManager.js.map +0 -1
  433. package/dist/multistream/sendSlotManager.d.ts +0 -61
  434. package/dist/multistream/sendSlotManager.js +0 -236
  435. package/dist/multistream/sendSlotManager.js.map +0 -1
  436. package/dist/reactions/constants.d.ts +0 -3
  437. package/dist/reactions/constants.js +0 -12
  438. package/dist/reactions/constants.js.map +0 -1
  439. package/dist/rtcMetrics/constants.d.ts +0 -4
  440. package/dist/rtcMetrics/constants.js +0 -11
  441. package/dist/rtcMetrics/constants.js.map +0 -1
  442. package/dist/rtcMetrics/index.d.ts +0 -54
  443. package/dist/rtcMetrics/index.js +0 -140
  444. package/dist/rtcMetrics/index.js.map +0 -1
  445. package/dist/webinar/collection.d.ts +0 -16
  446. package/dist/webinar/collection.js +0 -43
  447. package/dist/webinar/collection.js.map +0 -1
  448. package/dist/webinar/index.d.ts +0 -5
  449. package/dist/webinar/index.js +0 -68
  450. package/dist/webinar/index.js.map +0 -1
  451. package/src/annotation/annotation.types.ts +0 -50
  452. package/src/annotation/constants.ts +0 -36
  453. package/src/annotation/index.ts +0 -328
  454. package/src/breakouts/README.md +0 -220
  455. package/src/breakouts/breakout.ts +0 -188
  456. package/src/breakouts/collection.ts +0 -19
  457. package/src/breakouts/edit-lock-error.ts +0 -25
  458. package/src/breakouts/events.ts +0 -56
  459. package/src/breakouts/index.ts +0 -925
  460. package/src/breakouts/request.ts +0 -55
  461. package/src/breakouts/utils.ts +0 -57
  462. package/src/common/errors/no-meeting-info.ts +0 -24
  463. package/src/controls-options-manager/types.ts +0 -59
  464. package/src/index.ts +0 -40
  465. package/src/interpretation/README.md +0 -60
  466. package/src/interpretation/collection.ts +0 -19
  467. package/src/interpretation/index.ts +0 -332
  468. package/src/interpretation/siLanguage.ts +0 -18
  469. package/src/meeting/locusMediaRequest.ts +0 -313
  470. package/src/meeting/request.type.ts +0 -13
  471. package/src/meetings/meetings.types.ts +0 -12
  472. package/src/member/types.ts +0 -38
  473. package/src/multistream/mediaRequestManager.ts +0 -440
  474. package/src/multistream/receiveSlot.ts +0 -184
  475. package/src/multistream/receiveSlotManager.ts +0 -166
  476. package/src/multistream/remoteMedia.ts +0 -254
  477. package/src/multistream/remoteMediaGroup.ts +0 -284
  478. package/src/multistream/remoteMediaManager.ts +0 -1145
  479. package/src/multistream/sendSlotManager.ts +0 -170
  480. package/src/reactions/constants.ts +0 -4
  481. package/src/rtcMetrics/constants.ts +0 -3
  482. package/src/rtcMetrics/index.ts +0 -124
  483. package/src/webinar/collection.ts +0 -31
  484. package/src/webinar/index.ts +0 -62
  485. package/test/integration/spec/converged-space-meetings.js +0 -233
  486. package/test/unit/spec/annotation/index.ts +0 -418
  487. package/test/unit/spec/breakouts/breakout.ts +0 -237
  488. package/test/unit/spec/breakouts/collection.ts +0 -15
  489. package/test/unit/spec/breakouts/edit-lock-error.ts +0 -30
  490. package/test/unit/spec/breakouts/events.ts +0 -89
  491. package/test/unit/spec/breakouts/index.ts +0 -1790
  492. package/test/unit/spec/breakouts/request.ts +0 -104
  493. package/test/unit/spec/breakouts/utils.js +0 -72
  494. package/test/unit/spec/interpretation/collection.ts +0 -15
  495. package/test/unit/spec/interpretation/index.ts +0 -589
  496. package/test/unit/spec/interpretation/siLanguage.ts +0 -28
  497. package/test/unit/spec/locus-info/mediaSharesUtils.ts +0 -32
  498. package/test/unit/spec/media/index.ts +0 -290
  499. package/test/unit/spec/meeting/locusMediaRequest.ts +0 -442
  500. package/test/unit/spec/meeting-info/index.js +0 -300
  501. package/test/unit/spec/multistream/mediaRequestManager.ts +0 -1418
  502. package/test/unit/spec/multistream/receiveSlot.ts +0 -163
  503. package/test/unit/spec/multistream/receiveSlotManager.ts +0 -203
  504. package/test/unit/spec/multistream/remoteMedia.ts +0 -255
  505. package/test/unit/spec/multistream/remoteMediaGroup.ts +0 -662
  506. package/test/unit/spec/multistream/remoteMediaManager.ts +0 -1924
  507. package/test/unit/spec/multistream/sendSlotManager.ts +0 -242
  508. package/test/unit/spec/reachability/request.js +0 -68
  509. package/test/unit/spec/roap/request.ts +0 -232
  510. package/test/unit/spec/rtcMetrics/index.ts +0 -93
  511. package/test/unit/spec/webinar/collection.ts +0 -13
  512. package/test/unit/spec/webinar/index.ts +0 -60
  513. package/test/utils/constants.js +0 -9
  514. package/test/utils/integrationTestUtils.js +0 -46
  515. /package/dist/common/errors/{reclaim-host-role-errors.d.ts → reclaim-host-role-error.d.ts} +0 -0
  516. /package/src/common/errors/{reclaim-host-role-errors.ts → reclaim-host-role-error.ts} +0 -0
@@ -1,7 +1,8 @@
1
1
  import sinon from 'sinon';
2
2
  import {assert} from '@webex/test-helper-chai';
3
3
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
4
- import {createMuteState, MuteState} from '@webex/plugin-meetings/src/meeting/muteState';
4
+ import createMuteState from '@webex/plugin-meetings/src/meeting/muteState';
5
+ import Media from '@webex/plugin-meetings/src/media/index';
5
6
  import PermissionError from '@webex/plugin-meetings/src/common/errors/permission';
6
7
  import {AUDIO, VIDEO} from '@webex/plugin-meetings/src/constants';
7
8
 
@@ -11,291 +12,277 @@ describe('plugin-meetings', () => {
11
12
  let meeting;
12
13
  let audio;
13
14
  let video;
14
- let originalRemoteUpdateAudioVideo;
15
15
 
16
16
  const fakeLocus = {info: 'this is a fake locus'};
17
17
 
18
- const createFakeLocalStream = (id, muted) => {
19
- return {
20
- id,
21
- setServerMuted: sinon.stub(),
22
- setUnmuteAllowed: sinon.stub(),
23
- setMuted: sinon.stub(),
24
- muted,
25
- };
26
- };
27
-
28
- beforeEach(async () => {
18
+ beforeEach(() => {
29
19
  meeting = {
30
20
  mediaProperties: {
31
- audioStream: createFakeLocalStream('fake audio stream', false),
32
- videoStream: createFakeLocalStream('fake video stream', false),
21
+ audioTrack: 'fake audio track',
22
+ videoTrack: 'fake video track',
33
23
  },
34
24
  remoteMuted: false,
35
25
  unmuteAllowed: true,
36
- remoteVideoMuted: false,
37
- unmuteVideoAllowed: true,
38
-
39
26
  locusInfo: {
40
- handleLocusDelta: sinon.stub(),
27
+ onFullLocus: sinon.stub(),
41
28
  },
42
29
  members: {
43
30
  selfId: 'fake self id',
44
31
  muteMember: sinon.stub().resolves(),
45
32
  },
46
33
  };
47
-
48
- originalRemoteUpdateAudioVideo = MeetingUtil.remoteUpdateAudioVideo;
34
+ audio = createMuteState(AUDIO, meeting, {sendAudio: true});
35
+ video = createMuteState(VIDEO, meeting, {sendVideo: true});
49
36
 
50
37
  MeetingUtil.remoteUpdateAudioVideo = sinon.stub().resolves(fakeLocus);
51
-
52
- audio = createMuteState(AUDIO, meeting, true);
53
- video = createMuteState(VIDEO, meeting, true);
54
-
55
- await testUtils.flushPromises();
56
- });
57
-
58
- afterEach(() => {
59
- MeetingUtil.remoteUpdateAudioVideo = originalRemoteUpdateAudioVideo;
38
+ Media.setLocalTrack = sinon.stub();
60
39
  });
61
40
 
62
41
  describe('mute state library', () => {
42
+ it('does not create an audio instance if we are not sending audio', async () => {
43
+ assert.isNull(createMuteState(AUDIO, meeting, {sendAudio: false}));
44
+ assert.isNull(createMuteState(AUDIO, meeting, {}));
45
+ });
46
+
47
+ it('does not create a video instance if we are not sending video', async () => {
48
+ assert.isNull(createMuteState(VIDEO, meeting, {sendVideo: false}));
49
+ assert.isNull(createMuteState(VIDEO, meeting, {}));
50
+ });
51
+
63
52
  it('takes into account current remote mute status when instantiated', async () => {
64
53
  // simulate being already remote muted
65
54
  meeting.remoteMuted = true;
66
-
67
- // create a new MuteState instance
68
- audio = createMuteState(AUDIO, meeting, true);
69
-
70
- await testUtils.flushPromises();
55
+ // create a new MuteState intance
56
+ audio = createMuteState(AUDIO, meeting, {sendAudio: true});
71
57
 
72
58
  assert.isTrue(audio.isMuted());
73
- assert.isTrue(audio.isRemotelyMuted());
59
+ assert.isFalse(audio.isSelf());
74
60
 
75
61
  // now check the opposite case
76
62
  meeting.remoteMuted = false;
77
63
 
78
- // create a new MuteState instance
79
- audio = createMuteState(AUDIO, meeting, true);
80
-
81
- await testUtils.flushPromises();
64
+ // create a new MuteState intance
65
+ audio = createMuteState(AUDIO, meeting, {sendAudio: true});
82
66
 
83
- assert.isTrue(audio.isMuted()); // because we start with no stream
84
- assert.isFalse(audio.isRemotelyMuted());
67
+ assert.isFalse(audio.isMuted());
68
+ assert.isFalse(audio.isSelf());
85
69
  });
86
70
 
87
71
  it('initialises correctly for video', async () => {
88
- // setup fields related to video remote state
89
- meeting.remoteVideoMuted = false;
90
- meeting.unmuteVideoAllowed = false;
91
-
92
- // create a new video MuteState instance
93
- video = createMuteState(VIDEO, meeting, true);
94
-
95
- await testUtils.flushPromises();
72
+ // setup fields related to audio remote state
73
+ meeting.remoteMuted = true;
74
+ meeting.unmuteAllowed = false;
75
+ // create a new video MuteState intance
76
+ video = createMuteState(VIDEO, meeting, {sendVideo: true});
96
77
 
97
- assert.isTrue(video.isMuted()); // because we start with no stream
98
- assert.isFalse(video.isRemotelyMuted());
78
+ assert.isFalse(video.isMuted());
99
79
  assert.isFalse(video.state.server.remoteMute);
100
- assert.isFalse(video.state.server.unmuteAllowed);
80
+ assert.isTrue(video.state.server.unmuteAllowed);
101
81
  });
102
82
 
103
83
  it('takes remote mute into account when reporting current state', async () => {
104
- assert.isFalse(audio.isRemotelyMuted());
84
+ assert.isFalse(audio.isMuted());
105
85
 
106
86
  // simulate remote mute
107
- audio.handleServerRemoteMuteUpdate(meeting, true, true);
87
+ audio.handleServerRemoteMuteUpdate(true, true);
108
88
 
109
- assert.isTrue(audio.isRemotelyMuted());
89
+ assert.isTrue(audio.isMuted());
90
+ assert.isFalse(audio.isSelf());
110
91
  });
111
92
 
112
93
  it('does local unmute if localAudioUnmuteRequired is received', async () => {
113
- // first we need to mute have the local stream muted
114
- meeting.mediaProperties.audioStream.muted = true;
115
- audio.handleLocalStreamChange(meeting);
94
+ // first we need to mute
95
+ await audio.handleClientRequest(meeting, true);
116
96
 
117
97
  assert.isTrue(audio.isMuted());
98
+ assert.isTrue(audio.isSelf());
118
99
 
119
100
  MeetingUtil.remoteUpdateAudioVideo.resetHistory();
120
101
 
121
102
  // now simulate server requiring us to locally unmute
122
103
  audio.handleServerLocalUnmuteRequired(meeting);
123
-
124
104
  await testUtils.flushPromises();
125
105
 
126
- // check that local stream was unmuted
127
- assert.calledWith(
128
- meeting.mediaProperties.audioStream.setServerMuted,
129
- false,
130
- 'localUnmuteRequired'
131
- );
106
+ // check that local track was enabled
107
+ assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.audioTrack);
132
108
 
133
109
  // and local unmute was sent to server
134
110
  assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
135
- assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, false, undefined);
111
+ assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, false, undefined, meeting);
136
112
 
137
113
  assert.isFalse(audio.isMuted());
114
+ assert.isFalse(audio.isSelf());
138
115
  });
139
116
 
140
- it('does local video unmute if localVideoUnmuteRequired is received', async () => {
141
- // first we need to mute
142
- meeting.mediaProperties.videoStream.muted = true;
143
- video.handleLocalStreamChange(meeting);
117
+ it('rejects client request in progress if localAudioUnmuteRequired is received', async () => {
118
+ let clientPromiseResolved = false;
119
+ let clientPromiseRejected = false;
120
+
121
+ // first we need to mute and make that request last forever
122
+ let serverResponseResolve;
123
+
124
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
125
+ new Promise((resolve) => {
126
+ serverResponseResolve = resolve;
127
+ })
128
+ );
144
129
 
145
- assert.isTrue(video.isMuted());
130
+ audio
131
+ .handleClientRequest(meeting, true)
132
+ .then(() => {
133
+ clientPromiseResolved = true;
134
+ })
135
+ .catch(() => {
136
+ clientPromiseRejected = true;
137
+ });
146
138
 
147
139
  MeetingUtil.remoteUpdateAudioVideo.resetHistory();
148
140
 
149
141
  // now simulate server requiring us to locally unmute
150
- video.handleServerLocalUnmuteRequired(meeting);
142
+ audio.handleServerLocalUnmuteRequired(meeting);
151
143
  await testUtils.flushPromises();
152
144
 
153
- // check that local stream was unmuted
154
- assert.calledWith(
155
- meeting.mediaProperties.videoStream.setServerMuted,
156
- false,
157
- 'localUnmuteRequired'
158
- );
145
+ // the original client request should have been rejected by now
146
+ assert.isTrue(clientPromiseRejected);
147
+ assert.isFalse(clientPromiseResolved);
159
148
 
160
- // and local unmute was sent to server
149
+ // now make the server respond to the original mute request
150
+ serverResponseResolve();
151
+ await testUtils.flushPromises();
152
+
153
+ // local unmute should be sent to server
161
154
  assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
162
- assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, undefined, false);
155
+ assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, false, undefined, meeting);
163
156
 
164
- assert.isFalse(video.isMuted());
157
+ // and local track should be enabled
158
+ assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.audioTrack);
159
+
160
+ assert.isFalse(audio.isMuted());
161
+ assert.isFalse(audio.isSelf());
165
162
  });
166
163
 
167
164
  describe('#isLocallyMuted()', () => {
168
165
  it('does not consider remote mute status for audio', async () => {
169
- // simulate being already remote muted and locally unmuted
166
+ // simulate being already remote muted
170
167
  meeting.remoteMuted = true;
171
- meeting.mediaProperties.audioStream.muted = false;
172
-
173
- // create a new MuteState instance
174
- audio = createMuteState(AUDIO, meeting, true);
175
- audio.handleLocalStreamChange(meeting);
176
-
177
- await testUtils.flushPromises();
168
+ // create a new MuteState intance
169
+ audio = createMuteState(AUDIO, meeting, {sendAudio: true});
178
170
 
179
171
  assert.isFalse(audio.isLocallyMuted());
180
172
  });
173
+ });
181
174
 
182
- it('does not consider remote mute status for video', async () => {
183
- // simulate being already remote muted
184
- meeting.remoteVideoMuted = true;
185
- meeting.mediaProperties.videoStream.muted = false;
186
-
187
- // create a new MuteState instance
188
- video = createMuteState(VIDEO, meeting, true);
189
- video.handleLocalStreamChange(meeting);
190
-
191
- await testUtils.flushPromises();
175
+ describe('#handleClientRequest', () => {
176
+ it('disables/enables the local audio track when audio is muted/unmuted', async () => {
177
+ // mute
178
+ audio.handleClientRequest(meeting, true);
179
+ assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.audioTrack);
192
180
 
193
- assert.isFalse(video.isLocallyMuted());
194
- });
195
- });
181
+ // even when calling mute when it's already muted should still call setLocalTrack
182
+ audio.handleClientRequest(meeting, true);
183
+ assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.audioTrack);
196
184
 
197
- describe('handling local stream mute events', () => {
198
- beforeEach(async () => {
199
- audio.handleLocalStreamChange(meeting);
200
- video.handleLocalStreamChange(meeting);
185
+ // unmute
186
+ audio.handleClientRequest(meeting, false);
187
+ assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.audioTrack);
201
188
 
202
- await testUtils.flushPromises();
189
+ // even when calling unmute when it's already unmuted should still call setLocalTrack
190
+ audio.handleClientRequest(meeting, false);
191
+ assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.audioTrack);
203
192
  });
204
193
 
205
- const simulateAudioMuteChange = async (muteValue) => {
206
- meeting.mediaProperties.audioStream.muted = muteValue;
207
- audio.handleLocalStreamMuteStateChange(meeting, muteValue);
194
+ it('disables/enables the local video track when video is muted/unmuted', async () => {
195
+ // mute
196
+ video.handleClientRequest(meeting, true);
197
+ assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.videoTrack);
208
198
 
209
- await testUtils.flushPromises();
210
- };
199
+ // even when calling mute when it's already muted should still call setLocalTrack
200
+ video.handleClientRequest(meeting, false);
201
+ assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.videoTrack);
211
202
 
212
- const simulateVideoMuteChange = async (muteValue) => {
213
- meeting.mediaProperties.videoStream.muted = muteValue;
214
- video.handleLocalStreamMuteStateChange(meeting, muteValue);
203
+ // unmute
204
+ video.handleClientRequest(meeting, false);
205
+ assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.videoTrack);
215
206
 
216
- await testUtils.flushPromises();
217
- };
207
+ // even when calling unmute when it's already unmuted should still call setLocalTrack
208
+ video.handleClientRequest(meeting, false);
209
+ assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.videoTrack);
210
+ });
218
211
 
219
- it('returns correct value in isMuted() methods after local stream is muted/unmuted', async () => {
212
+ it('returns correct value in isMuted()/isSelf() methods after client mute/unmute requests', async () => {
220
213
  // mute
221
- await simulateAudioMuteChange(true);
214
+ audio.handleClientRequest(meeting, true);
215
+
222
216
  assert.isTrue(audio.isMuted());
217
+ assert.isTrue(audio.isSelf());
223
218
 
224
219
  // unmute
225
- await simulateAudioMuteChange(false);
220
+ audio.handleClientRequest(meeting, false);
221
+
226
222
  assert.isFalse(audio.isMuted());
223
+ assert.isFalse(audio.isSelf());
227
224
  });
228
225
 
229
226
  it('does remote unmute when unmuting and remote mute is on', async () => {
230
227
  // simulate remote mute
231
- audio.handleServerRemoteMuteUpdate(meeting, true, true);
228
+ audio.handleServerRemoteMuteUpdate(true, true);
232
229
 
233
230
  // unmute
234
- await simulateAudioMuteChange(false);
231
+ await audio.handleClientRequest(meeting, false);
235
232
 
236
233
  // check that remote unmute was sent to server
237
234
  assert.calledOnce(meeting.members.muteMember);
238
- assert.calledWith(meeting.members.muteMember, meeting.members.selfId, false, true);
235
+ assert.calledWith(meeting.members.muteMember, meeting.members.selfId, false);
239
236
 
240
237
  assert.isFalse(audio.isMuted());
238
+ assert.isFalse(audio.isSelf());
241
239
  });
242
240
 
243
- it('does video remote unmute when unmuting and remote mute is on', async () => {
244
- // simulate remote mute
245
- video.handleServerRemoteMuteUpdate(meeting, true, true);
246
-
247
- // unmute
248
- await simulateVideoMuteChange(false);
241
+ it('resolves client request promise once the server is updated', async () => {
242
+ let clientPromiseResolved = false;
249
243
 
250
- // check that remote unmute was sent to server
251
- assert.calledOnce(meeting.members.muteMember);
252
- assert.calledWith(meeting.members.muteMember, meeting.members.selfId, false, false);
244
+ let serverResponseResolve;
253
245
 
254
- assert.isFalse(video.isMuted());
255
- });
246
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
247
+ new Promise((resolve) => {
248
+ serverResponseResolve = resolve;
249
+ })
250
+ );
256
251
 
257
- it('does not video remote unmute when unmuting and remote mute is off', async () => {
258
- // simulate remote mute
259
- video.handleServerRemoteMuteUpdate(meeting, false, true);
252
+ audio.handleClientRequest(meeting, true).then(() => {
253
+ clientPromiseResolved = true;
254
+ });
260
255
 
261
- // unmute
262
- await simulateVideoMuteChange(false);
256
+ // do a small delay to make sure that the client promise doesn't resolve in that time
257
+ await testUtils.waitUntil(200);
258
+ assert.isFalse(clientPromiseResolved);
263
259
 
264
- // check that remote unmute was not sent to server
265
- assert.notCalled(meeting.members.muteMember);
260
+ // now allow the server response to arrive, this should trigger the client promise to get resolved
261
+ serverResponseResolve();
262
+ await testUtils.flushPromises();
266
263
 
267
- assert.isFalse(video.isMuted());
264
+ assert.isTrue(clientPromiseResolved);
268
265
  });
269
266
 
270
- it('calls setServerMuted with "clientRequestFailed" when server request for local mute fails', async () => {
271
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().rejects(new Error('fake error'));
272
-
273
- await simulateAudioMuteChange(true);
274
-
275
- assert.calledOnceWithExactly(
276
- meeting.mediaProperties.audioStream.setServerMuted,
277
- false,
278
- 'clientRequestFailed'
267
+ it('rejects client request promise if server request for local mute fails', async () => {
268
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
269
+ new Promise((resolve, reject) => {
270
+ reject();
271
+ })
279
272
  );
273
+
274
+ assert.isRejected(audio.handleClientRequest(meeting, true));
280
275
  });
281
276
 
282
- it('calls setServerMuted with "clientRequestFailed" if server request for remote mute fails', async () => {
277
+ it('rejects client request promise if server request for remote mute fails', async () => {
283
278
  // we only send remote mute requests when we're unmuting, so first we need to do a remote mute
284
- audio.handleServerRemoteMuteUpdate(meeting, true, true);
285
-
286
- await testUtils.flushPromises();
279
+ audio.handleServerRemoteMuteUpdate(true, true);
287
280
 
288
281
  // setup the stub to simulate server error response
289
282
  meeting.members.muteMember = sinon.stub().rejects();
290
- meeting.mediaProperties.audioStream.setServerMuted.resetHistory();
291
283
 
292
- await simulateAudioMuteChange(false);
293
-
294
- assert.calledOnceWithExactly(
295
- meeting.mediaProperties.audioStream.setServerMuted,
296
- true,
297
- 'clientRequestFailed'
298
- );
284
+ // try to unmute - it should fail
285
+ await assert.isRejected(audio.handleClientRequest(meeting, false));
299
286
 
300
287
  // even though remote mute update in the server failed, isMuted() should still return true,
301
288
  // because of local mute
@@ -311,13 +298,12 @@ describe('plugin-meetings', () => {
311
298
  })
312
299
  );
313
300
 
314
- // the stream is initially unmuted
315
- // simulate many mute changes with the last one matching the first one
316
- await simulateAudioMuteChange(true);
317
- await simulateAudioMuteChange(false);
318
- await simulateAudioMuteChange(true);
319
- await simulateAudioMuteChange(false);
320
- await simulateAudioMuteChange(true);
301
+ // simulate many client requests, with the last one matching the initial one
302
+ audio.handleClientRequest(meeting, true);
303
+ audio.handleClientRequest(meeting, false);
304
+ audio.handleClientRequest(meeting, true);
305
+ audio.handleClientRequest(meeting, false);
306
+ audio.handleClientRequest(meeting, true);
321
307
 
322
308
  // so far there should have been only 1 request to server (because our stub hasn't resolved yet
323
309
  // and MuteState sends only 1 server request at a time)
@@ -332,7 +318,7 @@ describe('plugin-meetings', () => {
332
318
  assert.notCalled(MeetingUtil.remoteUpdateAudioVideo);
333
319
  });
334
320
 
335
- it('queues up server requests when multiple mute changes happen to local stream', async () => {
321
+ it('queues up server requests when multiple client requests are received', async () => {
336
322
  let serverResponseResolve;
337
323
 
338
324
  MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
@@ -341,286 +327,104 @@ describe('plugin-meetings', () => {
341
327
  })
342
328
  );
343
329
 
330
+ let firstClientPromiseResolved = false;
331
+ let secondClientPromiseResolved = false;
332
+
344
333
  // 2 client requests, one after another without waiting for first one to resolve
345
- await simulateAudioMuteChange(true);
346
- await simulateAudioMuteChange(false);
334
+ audio.handleClientRequest(meeting, true).then(() => {
335
+ firstClientPromiseResolved = true;
336
+ });
337
+ audio.handleClientRequest(meeting, false).then(() => {
338
+ secondClientPromiseResolved = true;
339
+ });
340
+
341
+ await testUtils.flushPromises();
347
342
 
348
343
  assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
349
- assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, true, undefined);
344
+ assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, true, undefined, meeting);
350
345
 
351
346
  // now allow the first request to complete
352
347
  serverResponseResolve();
353
348
  await testUtils.flushPromises();
349
+ assert.isTrue(firstClientPromiseResolved);
354
350
 
355
351
  // that should trigger the second server request to be sent
356
352
  assert.calledTwice(MeetingUtil.remoteUpdateAudioVideo);
357
- assert.deepEqual(
358
- [meeting, false, undefined],
359
- MeetingUtil.remoteUpdateAudioVideo.getCall(1).args
360
- );
353
+ assert.strictEqual(false, MeetingUtil.remoteUpdateAudioVideo.getCall(1).args[0]);
354
+ assert.strictEqual(undefined, MeetingUtil.remoteUpdateAudioVideo.getCall(1).args[1]);
355
+ assert.strictEqual(meeting, MeetingUtil.remoteUpdateAudioVideo.getCall(1).args[2]);
361
356
 
362
357
  serverResponseResolve();
358
+ await testUtils.flushPromises();
359
+
360
+ assert.isTrue(secondClientPromiseResolved);
361
+ });
362
+
363
+ it('rejects client request to unmute if hard mute is used', (done) => {
364
+ audio.handleServerRemoteMuteUpdate(true, false);
365
+
366
+ audio
367
+ .handleClientRequest(meeting, false)
368
+ .then(() => {
369
+ done(new Error('expected handleClientRequest to fail, but it did not!'));
370
+ })
371
+ .catch((e) => {
372
+ assert.isTrue(e instanceof PermissionError);
373
+ done();
374
+ });
363
375
  });
364
376
 
365
377
  it('does not send remote mute for video', async () => {
366
378
  // mute
367
- await simulateVideoMuteChange(true);
379
+ await video.handleClientRequest(meeting, true);
368
380
 
369
381
  assert.isTrue(video.isMuted());
382
+ assert.isTrue(video.isSelf());
370
383
 
371
384
  // check local mute is done, but not remote one
372
- assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, undefined, true);
385
+ assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.videoTrack);
386
+ assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, undefined, true, meeting);
373
387
  assert.notCalled(meeting.members.muteMember);
374
388
 
389
+ Media.setLocalTrack.resetHistory();
375
390
  MeetingUtil.remoteUpdateAudioVideo.resetHistory();
376
391
  meeting.members.muteMember.resetHistory();
377
392
 
378
393
  // unmute
379
- await simulateVideoMuteChange(false);
394
+ await video.handleClientRequest(meeting, false);
380
395
 
381
396
  assert.isFalse(video.isMuted());
397
+ assert.isFalse(video.isSelf());
382
398
 
383
- assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, undefined, false);
399
+ assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.videoTrack);
400
+ assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, undefined, false, meeting);
384
401
  assert.notCalled(meeting.members.muteMember);
385
402
  });
386
403
 
387
- it('sends undefined value for the other media type when sending local mute', async () => {
404
+ it('sends correct audio value when sending local mute for video', async () => {
388
405
  // make sure the meeting object has mute state machines for both audio and video
389
406
  meeting.audio = audio;
390
407
  meeting.video = video;
391
408
 
392
- // mute audio -> the call to remoteUpdateAudioVideo should have video undefined
393
- await simulateAudioMuteChange(true);
394
- assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, true, undefined);
409
+ // mute audio -> request sent to server should have video unmuted
410
+ await audio.handleClientRequest(meeting, true);
411
+ assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, true, false, meeting);
395
412
  MeetingUtil.remoteUpdateAudioVideo.resetHistory();
396
413
 
397
- // now mute video -> the call to remoteUpdateAudioVideo should have unmute for video and undefined for audio
398
- await simulateVideoMuteChange(true);
399
- assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, undefined, true);
414
+ // now mute video -> request sent to server should have mute for both audio and video
415
+ await video.handleClientRequest(meeting, true);
416
+ assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, true, true, meeting);
400
417
  MeetingUtil.remoteUpdateAudioVideo.resetHistory();
401
418
 
402
- // now unmute the audio -> the call to remoteUpdateAudioVideo should have video undefined
403
- await simulateAudioMuteChange(false);
404
- assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, false, undefined);
419
+ // now unmute the audio -> request sent to server should still have video muted
420
+ await audio.handleClientRequest(meeting, false);
421
+ assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, false, true, meeting);
405
422
  MeetingUtil.remoteUpdateAudioVideo.resetHistory();
406
423
 
407
- // unmute video -> the call to remoteUpdateAudioVideo should have audio undefined
408
- await simulateVideoMuteChange(false);
409
- assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, undefined, false);
424
+ // unmute video -> request sent to server should have both audio and video unmuted
425
+ await video.handleClientRequest(meeting, false);
426
+ assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, false, false, meeting);
410
427
  });
411
428
  });
412
-
413
- describe('#init, #handleLocalStreamChange', () => {
414
- let meeting;
415
- let muteState;
416
- let setServerMutedSpy;
417
- let setMutedSpy, setUnmuteAllowedSpy;
418
-
419
- const setupMeeting = (
420
- mediaType,
421
- remoteMuted = false,
422
- muted = false,
423
- defineStreams = true
424
- ) => {
425
- const remoteMuteField = mediaType === AUDIO ? 'remoteMuted' : 'remoteVideoMuted';
426
-
427
- meeting = {
428
- mediaProperties: {
429
- audioStream: defineStreams
430
- ? createFakeLocalStream('fake audio stream', muted)
431
- : undefined,
432
- videoStream: defineStreams
433
- ? createFakeLocalStream('fake video stream', muted)
434
- : undefined,
435
- },
436
- [remoteMuteField]: remoteMuted,
437
- unmuteAllowed: true,
438
- unmuteVideoAllowed: true,
439
-
440
- locusInfo: {
441
- onFullLocus: sinon.stub(),
442
- },
443
- members: {
444
- selfId: 'fake self id',
445
- muteMember: sinon.stub().resolves(),
446
- },
447
- };
448
- };
449
-
450
- const setup = async (mediaType, remoteMuted = false, muted = false, defineStreams = true) => {
451
- setupMeeting(mediaType, remoteMuted, muted, defineStreams);
452
-
453
- muteState = createMuteState(mediaType, meeting, true);
454
- muteState.handleLocalStreamChange(meeting);
455
-
456
- await testUtils.flushPromises();
457
-
458
- MeetingUtil.remoteUpdateAudioVideo.resetHistory();
459
- };
460
-
461
- const setupSpies = (mediaType) => {
462
- setUnmuteAllowedSpy =
463
- mediaType === AUDIO
464
- ? meeting.mediaProperties.audioStream?.setUnmuteAllowed
465
- : meeting.mediaProperties.videoStream?.setUnmuteAllowed;
466
- setServerMutedSpy =
467
- mediaType === AUDIO
468
- ? meeting.mediaProperties.audioStream?.setServerMuted
469
- : meeting.mediaProperties.videoStream?.setServerMuted;
470
- setMutedSpy =
471
- mediaType === AUDIO
472
- ? meeting.mediaProperties.audioStream?.setMuted
473
- : meeting.mediaProperties.videoStream?.setMuted;
474
-
475
- clearSpies();
476
- };
477
-
478
- const clearSpies = () => {
479
- setUnmuteAllowedSpy?.resetHistory();
480
- setServerMutedSpy?.resetHistory();
481
- setMutedSpy?.resetHistory();
482
- };
483
- const tests = [
484
- {mediaType: AUDIO, title: 'audio'},
485
- {mediaType: VIDEO, title: 'video'},
486
- ];
487
-
488
- tests.forEach(({mediaType, title}) =>
489
- describe(title, () => {
490
- let originalRemoteUpdateAudioVideo;
491
-
492
- beforeEach(() => {
493
- originalRemoteUpdateAudioVideo = MeetingUtil.remoteUpdateAudioVideo;
494
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().resolves({info: 'fake locus'});
495
- });
496
-
497
- afterEach(() => {
498
- MeetingUtil.remoteUpdateAudioVideo = originalRemoteUpdateAudioVideo;
499
- sinon.restore();
500
- });
501
-
502
- describe('#handleLocalStreamChange', () => {
503
- it('calls init()', async () => {
504
- await setup(mediaType);
505
- const spy = sinon.spy(muteState, 'init');
506
- muteState.handleLocalStreamChange(meeting);
507
- assert.calledOnceWithExactly(spy, meeting);
508
- });
509
- });
510
-
511
- describe('#init', () => {
512
- // does the setup by calling new MuteState() so that MuteState.init() doesn't get called
513
- const setupWithoutInit = async (
514
- mediaType,
515
- remoteMuted = false,
516
- muted = false,
517
- defineStreams = true
518
- ) => {
519
- setupMeeting(mediaType, remoteMuted, muted, defineStreams);
520
-
521
- muteState = new MuteState(mediaType, meeting, true);
522
- };
523
-
524
- it('nothing goes bad when stream is undefined', async () => {
525
- await setupWithoutInit(mediaType, false, false, false);
526
- setupSpies(mediaType);
527
-
528
- muteState.init(meeting);
529
-
530
- assert.isTrue(muteState.state.client.localMute);
531
- });
532
-
533
- it('tests when stream muted is true and remoteMuted is false', async () => {
534
- await setupWithoutInit(mediaType, false, true);
535
- setupSpies(mediaType);
536
-
537
- muteState.init(meeting);
538
-
539
- assert.calledWith(setUnmuteAllowedSpy, muteState.state.server.unmuteAllowed);
540
- assert.notCalled(setServerMutedSpy);
541
- assert.notCalled(MeetingUtil.remoteUpdateAudioVideo);
542
- assert.isTrue(muteState.state.client.localMute);
543
- });
544
-
545
- it('tests when stream muted is false and remoteMuted is false', async () => {
546
- await setupWithoutInit(mediaType, false, false);
547
- setupSpies(mediaType);
548
-
549
- muteState.init(meeting);
550
-
551
- assert.calledWith(setUnmuteAllowedSpy, muteState.state.server.unmuteAllowed);
552
- assert.notCalled(setServerMutedSpy);
553
- assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
554
- assert.isFalse(muteState.state.client.localMute);
555
- });
556
-
557
- it('tests when remoteMuted is true', async () => {
558
- // testing that muteLocalStream is called
559
- await setupWithoutInit(mediaType, true);
560
- setupSpies(mediaType);
561
-
562
- muteState.init(meeting);
563
-
564
- assert.calledWith(setUnmuteAllowedSpy, muteState.state.server.unmuteAllowed);
565
- assert.calledOnceWithExactly(setServerMutedSpy, true, 'remotelyMuted');
566
- });
567
- });
568
-
569
- describe('#handleLocalStreamMuteStateChange', () => {
570
- it('checks when ignoreMuteStateChange is true nothing changes', async () => {
571
- await setup(mediaType, false, false);
572
- muteState.ignoreMuteStateChange = true;
573
-
574
- muteState.handleLocalStreamMuteStateChange(meeting, true);
575
- assert.notCalled(MeetingUtil.remoteUpdateAudioVideo);
576
-
577
- assert.isFalse(muteState.state.client.localMute);
578
- });
579
-
580
- it('tests localMute - true to false', async () => {
581
- await setup(mediaType, false, true);
582
-
583
- muteState.handleLocalStreamMuteStateChange(meeting, false);
584
- assert.equal(muteState.state.client.localMute, false);
585
- assert.called(MeetingUtil.remoteUpdateAudioVideo);
586
- });
587
-
588
- it('tests localMute - false to true', async () => {
589
- await setup(mediaType, false, false);
590
-
591
- muteState.handleLocalStreamMuteStateChange(meeting, true);
592
- assert.equal(muteState.state.client.localMute, true);
593
- assert.called(MeetingUtil.remoteUpdateAudioVideo);
594
- });
595
- });
596
-
597
- describe('#applyClientStateLocally', () => {
598
- afterEach(() => {
599
- sinon.restore();
600
- });
601
-
602
- it('calls setServerMuted on the stream', async () => {
603
- await setup(mediaType);
604
- setupSpies(mediaType);
605
-
606
- muteState.applyClientStateLocally(meeting, 'somereason');
607
- assert.calledOnceWithExactly(
608
- setServerMutedSpy,
609
- muteState.state.client.localMute,
610
- 'somereason'
611
- );
612
- assert.notCalled(setMutedSpy);
613
- });
614
-
615
- it('nothing explodes when streams are undefined', async () => {
616
- await setup(mediaType, false, false, false);
617
- setupSpies(mediaType);
618
-
619
- muteState.applyClientStateLocally(meeting, 'somereason');
620
- });
621
- });
622
- })
623
- );
624
- });
625
429
  });
626
430
  });