@webex/plugin-meetings 3.0.0-beta.11 → 3.0.0-beta.111

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