@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.104

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 (548) 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 +919 -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 +10 -24
  30. package/dist/common/errors/captcha-error.js.map +1 -1
  31. package/dist/common/errors/intent-to-join.js +11 -24
  32. package/dist/common/errors/intent-to-join.js.map +1 -1
  33. package/dist/common/errors/join-meeting.js +12 -25
  34. package/dist/common/errors/join-meeting.js.map +1 -1
  35. package/dist/common/errors/media.js +10 -24
  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 +10 -24
  40. package/dist/common/errors/password-error.js.map +1 -1
  41. package/dist/common/errors/permission.js +9 -23
  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 +10 -24
  46. package/dist/common/errors/reconnection.js.map +1 -1
  47. package/dist/common/errors/stats.js +10 -24
  48. package/dist/common/errors/stats.js.map +1 -1
  49. package/dist/common/errors/webex-errors.js +10 -69
  50. package/dist/common/errors/webex-errors.js.map +1 -1
  51. package/dist/common/errors/webex-meetings-error.js +5 -25
  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 +37 -60
  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 +7 -6
  70. package/dist/config.js.map +1 -1
  71. package/dist/constants.js +184 -122
  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 +25 -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 +250 -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 +56 -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 +362 -208
  94. package/dist/locus-info/index.js.map +1 -1
  95. package/dist/locus-info/infoUtils.js +3 -37
  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 +92 -118
  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 +113 -337
  104. package/dist/media/index.js.map +1 -1
  105. package/dist/media/properties.js +96 -135
  106. package/dist/media/properties.js.map +1 -1
  107. package/dist/media/util.js +1 -35
  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 +59 -14
  112. package/dist/meeting/in-meeting-actions.js.map +1 -1
  113. package/dist/meeting/index.js +2909 -2398
  114. package/dist/meeting/index.js.map +1 -1
  115. package/dist/meeting/muteState.js +257 -112
  116. package/dist/meeting/muteState.js.map +1 -1
  117. package/dist/meeting/request.js +330 -264
  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 +63 -261
  124. package/dist/meeting/util.js.map +1 -1
  125. package/dist/meeting-info/collection.js +6 -25
  126. package/dist/meeting-info/collection.js.map +1 -1
  127. package/dist/meeting-info/index.js +14 -32
  128. package/dist/meeting-info/index.js.map +1 -1
  129. package/dist/meeting-info/meeting-info-v2.js +273 -280
  130. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  131. package/dist/meeting-info/request.js +3 -15
  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 +26 -19
  138. package/dist/meetings/collection.js.map +1 -1
  139. package/dist/meetings/index.js +741 -548
  140. package/dist/meetings/index.js.map +1 -1
  141. package/dist/meetings/request.js +26 -41
  142. package/dist/meetings/request.js.map +1 -1
  143. package/dist/meetings/util.js +194 -149
  144. package/dist/meetings/util.js.map +1 -1
  145. package/dist/member/index.js +100 -85
  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 +90 -68
  150. package/dist/member/util.js.map +1 -1
  151. package/dist/members/collection.js +13 -12
  152. package/dist/members/collection.js.map +1 -1
  153. package/dist/members/index.js +227 -188
  154. package/dist/members/index.js.map +1 -1
  155. package/dist/members/request.js +54 -39
  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 +5 -14
  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 +67 -159
  166. package/dist/metrics/index.js.map +1 -1
  167. package/dist/multistream/mediaRequestManager.js +250 -0
  168. package/dist/multistream/mediaRequestManager.js.map +1 -0
  169. package/dist/multistream/receiveSlot.js +202 -0
  170. package/dist/multistream/receiveSlot.js.map +1 -0
  171. package/dist/multistream/receiveSlotManager.js +176 -0
  172. package/dist/multistream/receiveSlotManager.js.map +1 -0
  173. package/dist/multistream/remoteMedia.js +270 -0
  174. package/dist/multistream/remoteMedia.js.map +1 -0
  175. package/dist/multistream/remoteMediaGroup.js +209 -0
  176. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  177. package/dist/multistream/remoteMediaManager.js +1137 -0
  178. package/dist/multistream/remoteMediaManager.js.map +1 -0
  179. package/dist/networkQualityMonitor/index.js +40 -59
  180. package/dist/networkQualityMonitor/index.js.map +1 -1
  181. package/dist/personal-meeting-room/index.js +21 -45
  182. package/dist/personal-meeting-room/index.js.map +1 -1
  183. package/dist/personal-meeting-room/request.js +1 -31
  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 +192 -191
  188. package/dist/reachability/index.js.map +1 -1
  189. package/dist/reachability/request.js +15 -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 +109 -0
  194. package/dist/reactions/reactions.js.map +1 -0
  195. package/dist/reactions/reactions.type.js +36 -0
  196. package/dist/reactions/reactions.type.js.map +1 -0
  197. package/dist/reconnection-manager/index.js +386 -527
  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 +84 -286
  206. package/dist/roap/index.js.map +1 -1
  207. package/dist/roap/request.js +138 -238
  208. package/dist/roap/request.js.map +1 -1
  209. package/dist/roap/turnDiscovery.js +164 -102
  210. package/dist/roap/turnDiscovery.js.map +1 -1
  211. package/dist/statsAnalyzer/global.js +1 -93
  212. package/dist/statsAnalyzer/global.js.map +1 -1
  213. package/dist/statsAnalyzer/index.js +399 -470
  214. package/dist/statsAnalyzer/index.js.map +1 -1
  215. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  216. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  217. package/dist/transcription/index.js +22 -47
  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 +968 -0
  254. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  255. package/dist/types/controls-options-manager/enums.d.ts +13 -0
  256. package/dist/types/controls-options-manager/index.d.ts +136 -0
  257. package/dist/types/controls-options-manager/types.d.ts +37 -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 +129 -0
  274. package/dist/types/meeting/index.d.ts +1748 -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 +112 -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 +156 -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 +172 -0
  299. package/dist/types/metrics/constants.d.ts +54 -0
  300. package/dist/types/metrics/index.d.ts +152 -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 +29 -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 +219 -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 +823 -0
  338. package/src/breakouts/request.ts +55 -0
  339. package/src/breakouts/utils.ts +57 -0
  340. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  341. package/src/common/collection.ts +9 -7
  342. package/src/common/{config.js → config.ts} +1 -1
  343. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  344. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  345. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  346. package/src/common/errors/{media.js → media.ts} +11 -7
  347. package/src/common/errors/parameter.ts +11 -7
  348. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  349. package/src/common/errors/{permission.js → permission.ts} +10 -6
  350. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  351. package/src/common/errors/{stats.js → stats.ts} +11 -7
  352. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -25
  353. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  354. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  355. package/src/common/events/{events.js → events.ts} +5 -1
  356. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  357. package/src/common/events/{util.js → util.ts} +2 -3
  358. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  359. package/src/common/logs/logger-proxy.ts +44 -0
  360. package/src/common/logs/{request.js → request.ts} +22 -9
  361. package/src/common/queue.ts +1 -2
  362. package/src/{config.js → config.ts} +18 -12
  363. package/src/constants.ts +256 -183
  364. package/src/controls-options-manager/constants.ts +5 -0
  365. package/src/controls-options-manager/enums.ts +16 -0
  366. package/src/controls-options-manager/index.ts +278 -0
  367. package/src/controls-options-manager/types.ts +49 -0
  368. package/src/controls-options-manager/util.ts +229 -0
  369. package/src/index.ts +33 -0
  370. package/src/locus-info/controlsUtils.ts +169 -0
  371. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  372. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  373. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  374. package/src/locus-info/{index.js → index.ts} +331 -80
  375. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  376. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  377. package/src/locus-info/{parser.js → parser.ts} +67 -79
  378. package/src/locus-info/{selfUtils.js → selfUtils.ts} +196 -67
  379. package/src/media/index.ts +488 -0
  380. package/src/media/{properties.js → properties.ts} +67 -54
  381. package/src/media/util.ts +16 -0
  382. package/src/mediaQualityMetrics/config.ts +384 -0
  383. package/src/meeting/in-meeting-actions.ts +123 -3
  384. package/src/meeting/{index.js → index.ts} +3334 -1775
  385. package/src/meeting/muteState.ts +526 -0
  386. package/src/meeting/{request.js → request.ts} +350 -142
  387. package/src/meeting/request.type.ts +13 -0
  388. package/src/meeting/{state.js → state.ts} +50 -35
  389. package/src/meeting/{util.js → util.ts} +126 -159
  390. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  391. package/src/meeting-info/{index.js → index.ts} +42 -36
  392. package/src/meeting-info/meeting-info-v2.ts +345 -0
  393. package/src/meeting-info/{request.js → request.ts} +14 -4
  394. package/src/meeting-info/{util.js → util.ts} +60 -51
  395. package/src/meeting-info/{utilv2.js → utilv2.ts} +76 -60
  396. package/src/meetings/{collection.js → collection.ts} +26 -3
  397. package/src/meetings/index.ts +1394 -0
  398. package/src/meetings/{request.js → request.ts} +34 -25
  399. package/src/meetings/util.ts +288 -0
  400. package/src/member/{index.js → index.ts} +124 -56
  401. package/src/member/types.ts +24 -0
  402. package/src/member/{util.js → util.ts} +105 -25
  403. package/src/members/{collection.js → collection.ts} +10 -2
  404. package/src/members/{index.js → index.ts} +359 -139
  405. package/src/members/request.ts +215 -0
  406. package/src/members/types.ts +28 -0
  407. package/src/members/{util.js → util.ts} +145 -54
  408. package/src/metrics/{config.js → config.ts} +256 -92
  409. package/src/metrics/{constants.js → constants.ts} +1 -6
  410. package/src/metrics/{index.js → index.ts} +116 -97
  411. package/src/multistream/mediaRequestManager.ts +324 -0
  412. package/src/multistream/receiveSlot.ts +184 -0
  413. package/src/multistream/receiveSlotManager.ts +166 -0
  414. package/src/multistream/remoteMedia.ts +254 -0
  415. package/src/multistream/remoteMediaGroup.ts +225 -0
  416. package/src/multistream/remoteMediaManager.ts +1075 -0
  417. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  418. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  419. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  420. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  421. package/src/reachability/{index.js → index.ts} +157 -94
  422. package/src/reachability/request.ts +46 -35
  423. package/src/reactions/constants.ts +4 -0
  424. package/src/reactions/reactions.ts +104 -0
  425. package/src/reactions/reactions.type.ts +62 -0
  426. package/src/reconnection-manager/{index.js → index.ts} +261 -163
  427. package/src/recording-controller/enums.ts +8 -0
  428. package/src/recording-controller/index.ts +315 -0
  429. package/src/recording-controller/util.ts +58 -0
  430. package/src/roap/index.ts +241 -0
  431. package/src/roap/request.ts +172 -0
  432. package/src/roap/turnDiscovery.ts +127 -53
  433. package/src/statsAnalyzer/global.ts +37 -0
  434. package/src/statsAnalyzer/index.ts +1273 -0
  435. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  436. package/src/transcription/{index.js → index.ts} +46 -39
  437. package/test/integration/spec/converged-space-meetings.js +177 -0
  438. package/test/integration/spec/journey.js +666 -464
  439. package/test/integration/spec/space-meeting.js +321 -206
  440. package/test/integration/spec/transcription.js +7 -8
  441. package/test/unit/spec/annotation/index.ts +435 -0
  442. package/test/unit/spec/breakouts/breakout.ts +184 -0
  443. package/test/unit/spec/breakouts/collection.ts +15 -0
  444. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  445. package/test/unit/spec/breakouts/events.ts +77 -0
  446. package/test/unit/spec/breakouts/index.ts +1504 -0
  447. package/test/unit/spec/breakouts/request.ts +104 -0
  448. package/test/unit/spec/breakouts/utils.js +72 -0
  449. package/test/unit/spec/common/browser-detection.js +9 -28
  450. package/test/unit/spec/controls-options-manager/index.js +287 -0
  451. package/test/unit/spec/controls-options-manager/util.js +403 -0
  452. package/test/unit/spec/fixture/locus.js +92 -90
  453. package/test/unit/spec/locus-info/controlsUtils.js +177 -32
  454. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  455. package/test/unit/spec/locus-info/index.js +493 -3
  456. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  457. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  458. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  459. package/test/unit/spec/locus-info/parser.js +3 -9
  460. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  461. package/test/unit/spec/locus-info/selfUtils.js +236 -12
  462. package/test/unit/spec/media/index.ts +303 -0
  463. package/test/unit/spec/media/properties.ts +73 -82
  464. package/test/unit/spec/meeting/in-meeting-actions.ts +58 -3
  465. package/test/unit/spec/meeting/index.js +3127 -975
  466. package/test/unit/spec/meeting/muteState.js +375 -70
  467. package/test/unit/spec/meeting/request.js +217 -43
  468. package/test/unit/spec/meeting/utils.js +205 -163
  469. package/test/unit/spec/meeting-info/meetinginfov2.js +268 -74
  470. package/test/unit/spec/meeting-info/request.js +7 -9
  471. package/test/unit/spec/meeting-info/util.js +11 -12
  472. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  473. package/test/unit/spec/meetings/collection.js +15 -1
  474. package/test/unit/spec/meetings/index.js +1052 -333
  475. package/test/unit/spec/meetings/utils.js +163 -14
  476. package/test/unit/spec/member/index.js +24 -1
  477. package/test/unit/spec/member/util.js +359 -32
  478. package/test/unit/spec/members/index.js +547 -37
  479. package/test/unit/spec/members/request.js +76 -20
  480. package/test/unit/spec/members/utils.js +191 -4
  481. package/test/unit/spec/metrics/index.js +46 -20
  482. package/test/unit/spec/multistream/mediaRequestManager.ts +1060 -0
  483. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  484. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  485. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  486. package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
  487. package/test/unit/spec/multistream/remoteMediaManager.ts +1793 -0
  488. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  489. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  490. package/test/unit/spec/reachability/index.ts +176 -27
  491. package/test/unit/spec/reachability/request.js +66 -0
  492. package/test/unit/spec/reconnection-manager/index.js +106 -9
  493. package/test/unit/spec/recording-controller/index.js +231 -0
  494. package/test/unit/spec/recording-controller/util.js +102 -0
  495. package/test/unit/spec/roap/index.ts +78 -45
  496. package/test/unit/spec/roap/request.ts +217 -0
  497. package/test/unit/spec/roap/turnDiscovery.ts +93 -49
  498. package/test/unit/spec/stats-analyzer/index.js +118 -65
  499. package/test/utils/cmr.js +44 -42
  500. package/test/utils/constants.js +9 -0
  501. package/test/utils/integrationTestUtils.js +64 -0
  502. package/test/utils/testUtils.js +63 -99
  503. package/test/utils/webex-config.js +22 -18
  504. package/test/utils/webex-test-users.js +57 -50
  505. package/tsconfig.json +6 -0
  506. package/dist/meeting/effectsState.js +0 -327
  507. package/dist/meeting/effectsState.js.map +0 -1
  508. package/dist/peer-connection-manager/index.js +0 -794
  509. package/dist/peer-connection-manager/index.js.map +0 -1
  510. package/dist/peer-connection-manager/util.js +0 -124
  511. package/dist/peer-connection-manager/util.js.map +0 -1
  512. package/dist/roap/collection.js +0 -73
  513. package/dist/roap/collection.js.map +0 -1
  514. package/dist/roap/handler.js +0 -337
  515. package/dist/roap/handler.js.map +0 -1
  516. package/dist/roap/state.js +0 -164
  517. package/dist/roap/state.js.map +0 -1
  518. package/dist/roap/util.js +0 -102
  519. package/dist/roap/util.js.map +0 -1
  520. package/src/common/logs/logger-proxy.js +0 -33
  521. package/src/index.js +0 -15
  522. package/src/locus-info/controlsUtils.js +0 -102
  523. package/src/media/index.js +0 -593
  524. package/src/media/util.js +0 -38
  525. package/src/mediaQualityMetrics/config.js +0 -382
  526. package/src/meeting/effectsState.js +0 -205
  527. package/src/meeting/muteState.js +0 -318
  528. package/src/meeting-info/meeting-info-v2.js +0 -255
  529. package/src/meetings/index.js +0 -986
  530. package/src/meetings/util.js +0 -176
  531. package/src/members/request.js +0 -131
  532. package/src/peer-connection-manager/index.js +0 -723
  533. package/src/peer-connection-manager/util.ts +0 -117
  534. package/src/roap/collection.js +0 -63
  535. package/src/roap/handler.js +0 -252
  536. package/src/roap/index.js +0 -380
  537. package/src/roap/request.js +0 -198
  538. package/src/roap/state.js +0 -149
  539. package/src/roap/util.js +0 -93
  540. package/src/statsAnalyzer/global.js +0 -131
  541. package/src/statsAnalyzer/index.js +0 -1020
  542. package/src/statsAnalyzer/mqaUtil.js +0 -173
  543. package/test/unit/spec/meeting/effectsState.js +0 -293
  544. package/test/unit/spec/peerconnection-manager/index.js +0 -188
  545. package/test/unit/spec/peerconnection-manager/utils.js +0 -48
  546. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  547. package/test/unit/spec/roap/util.js +0 -30
  548. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -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
 
@@ -12,36 +11,55 @@ describe('plugin-meetings', () => {
12
11
  let meeting;
13
12
  let audio;
14
13
  let video;
14
+ let originalRemoteUpdateAudioVideo;
15
15
 
16
16
  const fakeLocus = {info: 'this is a fake locus'};
17
17
 
18
+ const createFakeLocalTrack = (id) => {
19
+ return {
20
+ id,
21
+ setMuted: sinon.stub(),
22
+ setServerMuted: sinon.stub(),
23
+ setUnmuteAllowed: sinon.stub(),
24
+ };
25
+ };
26
+
18
27
  beforeEach(() => {
19
28
  meeting = {
20
29
  mediaProperties: {
21
- audioTrack: 'fake audio track',
22
- videoTrack: 'fake video track'
30
+ audioTrack: createFakeLocalTrack('fake audio track'),
31
+ videoTrack: createFakeLocalTrack('fake video track'),
23
32
  },
24
33
  remoteMuted: false,
25
34
  unmuteAllowed: true,
35
+ remoteVideoMuted: false,
36
+ unmuteVideoAllowed: true,
37
+
26
38
  locusInfo: {
27
- onFullLocus: sinon.stub()
39
+ onFullLocus: sinon.stub(),
28
40
  },
29
41
  members: {
30
42
  selfId: 'fake self id',
31
- muteMember: sinon.stub().resolves()
32
- }
43
+ muteMember: sinon.stub().resolves(),
44
+ },
33
45
  };
34
- audio = createMuteState(AUDIO, meeting, {sendAudio: true});
35
- video = createMuteState(VIDEO, meeting, {sendVideo: true});
46
+
47
+ audio = createMuteState(AUDIO, meeting, {sendAudio: true}, true);
48
+ video = createMuteState(VIDEO, meeting, {sendVideo: true}, true);
49
+
50
+ originalRemoteUpdateAudioVideo = MeetingUtil.remoteUpdateAudioVideo;
36
51
 
37
52
  MeetingUtil.remoteUpdateAudioVideo = sinon.stub().resolves(fakeLocus);
38
- Media.setLocalTrack = sinon.stub();
53
+ });
54
+
55
+ afterEach(() => {
56
+ MeetingUtil.remoteUpdateAudioVideo = originalRemoteUpdateAudioVideo;
39
57
  });
40
58
 
41
59
  describe('mute state library', () => {
42
60
  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, {}));
61
+ assert.isNull(createMuteState(AUDIO, meeting, {sendAudio: false}, true));
62
+ assert.isNull(createMuteState(AUDIO, meeting, {}, true));
45
63
  });
46
64
 
47
65
  it('does not create a video instance if we are not sending video', async () => {
@@ -69,22 +87,23 @@ describe('plugin-meetings', () => {
69
87
  });
70
88
 
71
89
  it('initialises correctly for video', async () => {
72
- // setup fields related to audio remote state
73
- meeting.remoteMuted = true;
74
- meeting.unmuteAllowed = false;
75
- // 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
76
95
  video = createMuteState(VIDEO, meeting, {sendVideo: true});
77
96
 
78
97
  assert.isFalse(video.isMuted());
79
98
  assert.isFalse(video.state.server.remoteMute);
80
- assert.isTrue(video.state.server.unmuteAllowed);
99
+ assert.isFalse(video.state.server.unmuteAllowed);
81
100
  });
82
101
 
83
102
  it('takes remote mute into account when reporting current state', async () => {
84
103
  assert.isFalse(audio.isMuted());
85
104
 
86
105
  // simulate remote mute
87
- audio.handleServerRemoteMuteUpdate(true, true);
106
+ audio.handleServerRemoteMuteUpdate(meeting, true, true);
88
107
 
89
108
  assert.isTrue(audio.isMuted());
90
109
  assert.isFalse(audio.isSelf());
@@ -103,8 +122,8 @@ describe('plugin-meetings', () => {
103
122
  audio.handleServerLocalUnmuteRequired(meeting);
104
123
  await testUtils.flushPromises();
105
124
 
106
- // check that local track was enabled
107
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.audioTrack);
125
+ // check that local track was unmuted
126
+ assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
108
127
 
109
128
  // and local unmute was sent to server
110
129
  assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
@@ -121,11 +140,14 @@ describe('plugin-meetings', () => {
121
140
  // first we need to mute and make that request last forever
122
141
  let serverResponseResolve;
123
142
 
124
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
125
- serverResponseResolve = resolve;
126
- }));
143
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
144
+ new Promise((resolve) => {
145
+ serverResponseResolve = resolve;
146
+ })
147
+ );
127
148
 
128
- audio.handleClientRequest(meeting, true)
149
+ audio
150
+ .handleClientRequest(meeting, true)
129
151
  .then(() => {
130
152
  clientPromiseResolved = true;
131
153
  })
@@ -151,48 +173,92 @@ describe('plugin-meetings', () => {
151
173
  assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
152
174
  assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, false, undefined, meeting);
153
175
 
154
- // and local track should be enabled
155
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.audioTrack);
176
+ // and local track should be unmuted
177
+ assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
156
178
 
157
179
  assert.isFalse(audio.isMuted());
158
180
  assert.isFalse(audio.isSelf());
159
181
  });
160
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
+
161
227
  describe('#handleClientRequest', () => {
162
228
  it('disables/enables the local audio track when audio is muted/unmuted', async () => {
163
229
  // mute
164
230
  audio.handleClientRequest(meeting, true);
165
- assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.audioTrack);
231
+ assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, true);
166
232
 
167
- // 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
168
234
  audio.handleClientRequest(meeting, true);
169
- assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.audioTrack);
235
+ assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, true);
170
236
 
171
237
  // unmute
172
238
  audio.handleClientRequest(meeting, false);
173
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.audioTrack);
239
+ assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
174
240
 
175
- // 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
176
242
  audio.handleClientRequest(meeting, false);
177
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.audioTrack);
243
+ assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
178
244
  });
179
245
 
180
246
  it('disables/enables the local video track when video is muted/unmuted', async () => {
181
247
  // mute
182
248
  video.handleClientRequest(meeting, true);
183
- assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.videoTrack);
249
+ assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
184
250
 
185
- // 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
186
252
  video.handleClientRequest(meeting, false);
187
- assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.videoTrack);
253
+ assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
188
254
 
189
255
  // unmute
190
256
  video.handleClientRequest(meeting, false);
191
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.videoTrack);
257
+ assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
192
258
 
193
- // 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
194
260
  video.handleClientRequest(meeting, false);
195
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.videoTrack);
261
+ assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
196
262
  });
197
263
 
198
264
  it('returns correct value in isMuted()/isSelf() methods after client mute/unmute requests', async () => {
@@ -211,32 +277,62 @@ describe('plugin-meetings', () => {
211
277
 
212
278
  it('does remote unmute when unmuting and remote mute is on', async () => {
213
279
  // simulate remote mute
214
- audio.handleServerRemoteMuteUpdate(true, true);
280
+ audio.handleServerRemoteMuteUpdate(meeting, true, true);
215
281
 
216
282
  // unmute
217
283
  await audio.handleClientRequest(meeting, false);
218
284
 
219
285
  // check that remote unmute was sent to server
220
286
  assert.calledOnce(meeting.members.muteMember);
221
- assert.calledWith(meeting.members.muteMember, meeting.members.selfId, false);
287
+ assert.calledWith(meeting.members.muteMember, meeting.members.selfId, false, true);
222
288
 
223
289
  assert.isFalse(audio.isMuted());
224
290
  assert.isFalse(audio.isSelf());
225
291
  });
226
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
+
227
322
  it('resolves client request promise once the server is updated', async () => {
228
323
  let clientPromiseResolved = false;
229
324
 
230
325
  let serverResponseResolve;
231
326
 
232
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
233
- serverResponseResolve = resolve;
234
- }));
327
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
328
+ new Promise((resolve) => {
329
+ serverResponseResolve = resolve;
330
+ })
331
+ );
235
332
 
236
- audio.handleClientRequest(meeting, true)
237
- .then(() => {
238
- clientPromiseResolved = true;
239
- });
333
+ audio.handleClientRequest(meeting, true).then(() => {
334
+ clientPromiseResolved = true;
335
+ });
240
336
 
241
337
  // do a small delay to make sure that the client promise doesn't resolve in that time
242
338
  await testUtils.waitUntil(200);
@@ -250,16 +346,18 @@ describe('plugin-meetings', () => {
250
346
  });
251
347
 
252
348
  it('rejects client request promise if server request for local mute fails', async () => {
253
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve, reject) => {
254
- reject();
255
- }));
349
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
350
+ new Promise((resolve, reject) => {
351
+ reject();
352
+ })
353
+ );
256
354
 
257
355
  assert.isRejected(audio.handleClientRequest(meeting, true));
258
356
  });
259
357
 
260
358
  it('rejects client request promise if server request for remote mute fails', async () => {
261
359
  // we only send remote mute requests when we're unmuting, so first we need to do a remote mute
262
- audio.handleServerRemoteMuteUpdate(true, true);
360
+ audio.handleServerRemoteMuteUpdate(meeting, true, true);
263
361
 
264
362
  // setup the stub to simulate server error response
265
363
  meeting.members.muteMember = sinon.stub().rejects();
@@ -275,9 +373,11 @@ describe('plugin-meetings', () => {
275
373
  it('does not send a server request if client state matches the server', async () => {
276
374
  let serverResponseResolve;
277
375
 
278
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
279
- serverResponseResolve = resolve;
280
- }));
376
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
377
+ new Promise((resolve) => {
378
+ serverResponseResolve = resolve;
379
+ })
380
+ );
281
381
 
282
382
  // simulate many client requests, with the last one matching the initial one
283
383
  audio.handleClientRequest(meeting, true);
@@ -302,22 +402,22 @@ describe('plugin-meetings', () => {
302
402
  it('queues up server requests when multiple client requests are received', async () => {
303
403
  let serverResponseResolve;
304
404
 
305
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
306
- serverResponseResolve = resolve;
307
- }));
405
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
406
+ new Promise((resolve) => {
407
+ serverResponseResolve = resolve;
408
+ })
409
+ );
308
410
 
309
411
  let firstClientPromiseResolved = false;
310
412
  let secondClientPromiseResolved = false;
311
413
 
312
414
  // 2 client requests, one after another without waiting for first one to resolve
313
- audio.handleClientRequest(meeting, true)
314
- .then(() => {
315
- firstClientPromiseResolved = true;
316
- });
317
- audio.handleClientRequest(meeting, false)
318
- .then(() => {
319
- secondClientPromiseResolved = true;
320
- });
415
+ audio.handleClientRequest(meeting, true).then(() => {
416
+ firstClientPromiseResolved = true;
417
+ });
418
+ audio.handleClientRequest(meeting, false).then(() => {
419
+ secondClientPromiseResolved = true;
420
+ });
321
421
 
322
422
  await testUtils.flushPromises();
323
423
 
@@ -342,9 +442,10 @@ describe('plugin-meetings', () => {
342
442
  });
343
443
 
344
444
  it('rejects client request to unmute if hard mute is used', (done) => {
345
- audio.handleServerRemoteMuteUpdate(true, false);
445
+ audio.handleServerRemoteMuteUpdate(meeting, true, false);
346
446
 
347
- audio.handleClientRequest(meeting, false)
447
+ audio
448
+ .handleClientRequest(meeting, false)
348
449
  .then(() => {
349
450
  done(new Error('expected handleClientRequest to fail, but it did not!'));
350
451
  })
@@ -362,11 +463,11 @@ describe('plugin-meetings', () => {
362
463
  assert.isTrue(video.isSelf());
363
464
 
364
465
  // check local mute is done, but not remote one
365
- assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.videoTrack);
466
+ assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
366
467
  assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, undefined, true, meeting);
367
468
  assert.notCalled(meeting.members.muteMember);
368
469
 
369
- Media.setLocalTrack.resetHistory();
470
+ meeting.mediaProperties.videoTrack.setMuted.resetHistory();
370
471
  MeetingUtil.remoteUpdateAudioVideo.resetHistory();
371
472
  meeting.members.muteMember.resetHistory();
372
473
 
@@ -376,7 +477,7 @@ describe('plugin-meetings', () => {
376
477
  assert.isFalse(video.isMuted());
377
478
  assert.isFalse(video.isSelf());
378
479
 
379
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.videoTrack);
480
+ assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
380
481
  assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, undefined, false, meeting);
381
482
  assert.notCalled(meeting.members.muteMember);
382
483
  });
@@ -408,3 +509,207 @@ describe('plugin-meetings', () => {
408
509
  });
409
510
  });
410
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
+ });