@webex/plugin-meetings 3.0.0-beta.7 → 3.0.0-beta.71

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 (506) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +178 -0
  4. package/dist/breakouts/breakout.js.map +1 -0
  5. package/dist/breakouts/collection.js +23 -0
  6. package/dist/breakouts/collection.js.map +1 -0
  7. package/dist/breakouts/edit-lock-error.js +52 -0
  8. package/dist/breakouts/edit-lock-error.js.map +1 -0
  9. package/dist/breakouts/index.js +843 -0
  10. package/dist/breakouts/index.js.map +1 -0
  11. package/dist/breakouts/request.js +78 -0
  12. package/dist/breakouts/request.js.map +1 -0
  13. package/dist/breakouts/utils.js +56 -0
  14. package/dist/breakouts/utils.js.map +1 -0
  15. package/dist/common/browser-detection.js +1 -20
  16. package/dist/common/browser-detection.js.map +1 -1
  17. package/dist/common/collection.js +5 -20
  18. package/dist/common/collection.js.map +1 -1
  19. package/dist/common/config.js +0 -7
  20. package/dist/common/config.js.map +1 -1
  21. package/dist/common/errors/captcha-error.js +10 -24
  22. package/dist/common/errors/captcha-error.js.map +1 -1
  23. package/dist/common/errors/intent-to-join.js +11 -24
  24. package/dist/common/errors/intent-to-join.js.map +1 -1
  25. package/dist/common/errors/join-meeting.js +12 -25
  26. package/dist/common/errors/join-meeting.js.map +1 -1
  27. package/dist/common/errors/media.js +10 -24
  28. package/dist/common/errors/media.js.map +1 -1
  29. package/dist/common/errors/parameter.js +5 -33
  30. package/dist/common/errors/parameter.js.map +1 -1
  31. package/dist/common/errors/password-error.js +10 -24
  32. package/dist/common/errors/password-error.js.map +1 -1
  33. package/dist/common/errors/permission.js +9 -23
  34. package/dist/common/errors/permission.js.map +1 -1
  35. package/dist/common/errors/reconnection-in-progress.js +0 -17
  36. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  37. package/dist/common/errors/reconnection.js +10 -24
  38. package/dist/common/errors/reconnection.js.map +1 -1
  39. package/dist/common/errors/stats.js +10 -24
  40. package/dist/common/errors/stats.js.map +1 -1
  41. package/dist/common/errors/webex-errors.js +6 -41
  42. package/dist/common/errors/webex-errors.js.map +1 -1
  43. package/dist/common/errors/webex-meetings-error.js +5 -25
  44. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  45. package/dist/common/events/events-scope.js +0 -22
  46. package/dist/common/events/events-scope.js.map +1 -1
  47. package/dist/common/events/events.js +0 -23
  48. package/dist/common/events/events.js.map +1 -1
  49. package/dist/common/events/trigger-proxy.js +0 -12
  50. package/dist/common/events/trigger-proxy.js.map +1 -1
  51. package/dist/common/events/util.js +0 -15
  52. package/dist/common/events/util.js.map +1 -1
  53. package/dist/common/logs/logger-config.js +0 -4
  54. package/dist/common/logs/logger-config.js.map +1 -1
  55. package/dist/common/logs/logger-proxy.js +1 -8
  56. package/dist/common/logs/logger-proxy.js.map +1 -1
  57. package/dist/common/logs/request.js +37 -60
  58. package/dist/common/logs/request.js.map +1 -1
  59. package/dist/common/queue.js +4 -14
  60. package/dist/common/queue.js.map +1 -1
  61. package/dist/config.js +6 -6
  62. package/dist/config.js.map +1 -1
  63. package/dist/constants.js +143 -52
  64. package/dist/constants.js.map +1 -1
  65. package/dist/controls-options-manager/constants.js +14 -0
  66. package/dist/controls-options-manager/constants.js.map +1 -0
  67. package/dist/controls-options-manager/enums.js +16 -0
  68. package/dist/controls-options-manager/enums.js.map +1 -0
  69. package/dist/controls-options-manager/index.js +261 -0
  70. package/dist/controls-options-manager/index.js.map +1 -0
  71. package/dist/controls-options-manager/util.js +39 -0
  72. package/dist/controls-options-manager/util.js.map +1 -0
  73. package/dist/index.js +11 -18
  74. package/dist/index.js.map +1 -1
  75. package/dist/locus-info/controlsUtils.js +31 -29
  76. package/dist/locus-info/controlsUtils.js.map +1 -1
  77. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  78. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  79. package/dist/locus-info/fullState.js +0 -15
  80. package/dist/locus-info/fullState.js.map +1 -1
  81. package/dist/locus-info/hostUtils.js +4 -12
  82. package/dist/locus-info/hostUtils.js.map +1 -1
  83. package/dist/locus-info/index.js +237 -198
  84. package/dist/locus-info/index.js.map +1 -1
  85. package/dist/locus-info/infoUtils.js +3 -37
  86. package/dist/locus-info/infoUtils.js.map +1 -1
  87. package/dist/locus-info/mediaSharesUtils.js +12 -38
  88. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  89. package/dist/locus-info/parser.js +92 -118
  90. package/dist/locus-info/parser.js.map +1 -1
  91. package/dist/locus-info/selfUtils.js +80 -89
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.js +56 -146
  94. package/dist/media/index.js.map +1 -1
  95. package/dist/media/properties.js +83 -117
  96. package/dist/media/properties.js.map +1 -1
  97. package/dist/media/util.js +2 -9
  98. package/dist/media/util.js.map +1 -1
  99. package/dist/mediaQualityMetrics/config.js +505 -495
  100. package/dist/mediaQualityMetrics/config.js.map +1 -1
  101. package/dist/meeting/in-meeting-actions.js +31 -14
  102. package/dist/meeting/in-meeting-actions.js.map +1 -1
  103. package/dist/meeting/index.js +2225 -2244
  104. package/dist/meeting/index.js.map +1 -1
  105. package/dist/meeting/muteState.js +102 -100
  106. package/dist/meeting/muteState.js.map +1 -1
  107. package/dist/meeting/request.js +308 -264
  108. package/dist/meeting/request.js.map +1 -1
  109. package/dist/meeting/request.type.js +7 -0
  110. package/dist/meeting/request.type.js.map +1 -0
  111. package/dist/meeting/state.js +21 -31
  112. package/dist/meeting/state.js.map +1 -1
  113. package/dist/meeting/util.js +63 -217
  114. package/dist/meeting/util.js.map +1 -1
  115. package/dist/meeting-info/collection.js +6 -25
  116. package/dist/meeting-info/collection.js.map +1 -1
  117. package/dist/meeting-info/index.js +14 -32
  118. package/dist/meeting-info/index.js.map +1 -1
  119. package/dist/meeting-info/meeting-info-v2.js +193 -268
  120. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  121. package/dist/meeting-info/request.js +3 -15
  122. package/dist/meeting-info/request.js.map +1 -1
  123. package/dist/meeting-info/util.js +98 -183
  124. package/dist/meeting-info/util.js.map +1 -1
  125. package/dist/meeting-info/utilv2.js +137 -228
  126. package/dist/meeting-info/utilv2.js.map +1 -1
  127. package/dist/meetings/collection.js +26 -19
  128. package/dist/meetings/collection.js.map +1 -1
  129. package/dist/meetings/index.js +565 -552
  130. package/dist/meetings/index.js.map +1 -1
  131. package/dist/meetings/request.js +26 -41
  132. package/dist/meetings/request.js.map +1 -1
  133. package/dist/meetings/util.js +151 -155
  134. package/dist/meetings/util.js.map +1 -1
  135. package/dist/member/index.js +100 -85
  136. package/dist/member/index.js.map +1 -1
  137. package/dist/member/types.js +15 -0
  138. package/dist/member/types.js.map +1 -0
  139. package/dist/member/util.js +90 -68
  140. package/dist/member/util.js.map +1 -1
  141. package/dist/members/collection.js +13 -12
  142. package/dist/members/collection.js.map +1 -1
  143. package/dist/members/index.js +152 -204
  144. package/dist/members/index.js.map +1 -1
  145. package/dist/members/request.js +35 -39
  146. package/dist/members/request.js.map +1 -1
  147. package/dist/members/types.js +15 -0
  148. package/dist/members/types.js.map +1 -0
  149. package/dist/members/util.js +76 -46
  150. package/dist/members/util.js.map +1 -1
  151. package/dist/metrics/config.js +4 -14
  152. package/dist/metrics/config.js.map +1 -1
  153. package/dist/metrics/constants.js +1 -6
  154. package/dist/metrics/constants.js.map +1 -1
  155. package/dist/metrics/index.js +59 -156
  156. package/dist/metrics/index.js.map +1 -1
  157. package/dist/multistream/mediaRequestManager.js +116 -52
  158. package/dist/multistream/mediaRequestManager.js.map +1 -1
  159. package/dist/multistream/receiveSlot.js +58 -65
  160. package/dist/multistream/receiveSlot.js.map +1 -1
  161. package/dist/multistream/receiveSlotManager.js +58 -93
  162. package/dist/multistream/receiveSlotManager.js.map +1 -1
  163. package/dist/multistream/remoteMedia.js +55 -74
  164. package/dist/multistream/remoteMedia.js.map +1 -1
  165. package/dist/multistream/remoteMediaGroup.js +6 -40
  166. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  167. package/dist/multistream/remoteMediaManager.js +466 -442
  168. package/dist/multistream/remoteMediaManager.js.map +1 -1
  169. package/dist/networkQualityMonitor/index.js +40 -59
  170. package/dist/networkQualityMonitor/index.js.map +1 -1
  171. package/dist/personal-meeting-room/index.js +21 -45
  172. package/dist/personal-meeting-room/index.js.map +1 -1
  173. package/dist/personal-meeting-room/request.js +1 -31
  174. package/dist/personal-meeting-room/request.js.map +1 -1
  175. package/dist/personal-meeting-room/util.js +0 -13
  176. package/dist/personal-meeting-room/util.js.map +1 -1
  177. package/dist/reachability/index.js +192 -191
  178. package/dist/reachability/index.js.map +1 -1
  179. package/dist/reachability/request.js +15 -23
  180. package/dist/reachability/request.js.map +1 -1
  181. package/dist/reactions/constants.js +13 -0
  182. package/dist/reactions/constants.js.map +1 -0
  183. package/dist/reactions/reactions.js +109 -0
  184. package/dist/reactions/reactions.js.map +1 -0
  185. package/dist/reactions/reactions.type.js +36 -0
  186. package/dist/reactions/reactions.type.js.map +1 -0
  187. package/dist/reconnection-manager/index.js +342 -460
  188. package/dist/reconnection-manager/index.js.map +1 -1
  189. package/dist/recording-controller/enums.js +17 -0
  190. package/dist/recording-controller/enums.js.map +1 -0
  191. package/dist/recording-controller/index.js +343 -0
  192. package/dist/recording-controller/index.js.map +1 -0
  193. package/dist/recording-controller/util.js +63 -0
  194. package/dist/recording-controller/util.js.map +1 -0
  195. package/dist/roap/index.js +48 -70
  196. package/dist/roap/index.js.map +1 -1
  197. package/dist/roap/request.js +143 -131
  198. package/dist/roap/request.js.map +1 -1
  199. package/dist/roap/turnDiscovery.js +91 -98
  200. package/dist/roap/turnDiscovery.js.map +1 -1
  201. package/dist/statsAnalyzer/global.js +1 -95
  202. package/dist/statsAnalyzer/global.js.map +1 -1
  203. package/dist/statsAnalyzer/index.js +372 -455
  204. package/dist/statsAnalyzer/index.js.map +1 -1
  205. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  206. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  207. package/dist/transcription/index.js +22 -47
  208. package/dist/transcription/index.js.map +1 -1
  209. package/dist/types/breakouts/breakout.d.ts +8 -0
  210. package/dist/types/breakouts/collection.d.ts +5 -0
  211. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  212. package/dist/types/breakouts/index.d.ts +5 -0
  213. package/dist/types/breakouts/request.d.ts +22 -0
  214. package/dist/types/breakouts/utils.d.ts +8 -0
  215. package/dist/types/common/browser-detection.d.ts +9 -0
  216. package/dist/types/common/collection.d.ts +48 -0
  217. package/dist/types/common/config.d.ts +2 -0
  218. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  219. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  220. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  221. package/dist/types/common/errors/media.d.ts +15 -0
  222. package/dist/types/common/errors/parameter.d.ts +15 -0
  223. package/dist/types/common/errors/password-error.d.ts +15 -0
  224. package/dist/types/common/errors/permission.d.ts +14 -0
  225. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  226. package/dist/types/common/errors/reconnection.d.ts +15 -0
  227. package/dist/types/common/errors/stats.d.ts +15 -0
  228. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  229. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  230. package/dist/types/common/events/events-scope.d.ts +17 -0
  231. package/dist/types/common/events/events.d.ts +12 -0
  232. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  233. package/dist/types/common/events/util.d.ts +2 -0
  234. package/dist/types/common/logs/logger-config.d.ts +2 -0
  235. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  236. package/dist/types/common/logs/request.d.ts +34 -0
  237. package/dist/types/common/queue.d.ts +32 -0
  238. package/dist/types/config.d.ts +77 -0
  239. package/dist/types/constants.d.ts +944 -0
  240. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  241. package/dist/types/controls-options-manager/enums.d.ts +6 -0
  242. package/dist/types/controls-options-manager/index.d.ts +128 -0
  243. package/dist/types/controls-options-manager/util.d.ts +9 -0
  244. package/dist/types/index.d.ts +6 -0
  245. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  246. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  247. package/dist/types/locus-info/fullState.d.ts +2 -0
  248. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  249. package/dist/types/locus-info/index.d.ts +276 -0
  250. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  251. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  252. package/dist/types/locus-info/parser.d.ts +212 -0
  253. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  254. package/dist/types/media/index.d.ts +32 -0
  255. package/dist/types/media/properties.d.ts +108 -0
  256. package/dist/types/media/util.d.ts +2 -0
  257. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  258. package/dist/types/meeting/in-meeting-actions.d.ts +101 -0
  259. package/dist/types/meeting/index.d.ts +1720 -0
  260. package/dist/types/meeting/muteState.d.ts +132 -0
  261. package/dist/types/meeting/request.d.ts +271 -0
  262. package/dist/types/meeting/request.type.d.ts +11 -0
  263. package/dist/types/meeting/state.d.ts +9 -0
  264. package/dist/types/meeting/util.d.ts +2 -0
  265. package/dist/types/meeting-info/collection.d.ts +20 -0
  266. package/dist/types/meeting-info/index.d.ts +57 -0
  267. package/dist/types/meeting-info/meeting-info-v2.d.ts +93 -0
  268. package/dist/types/meeting-info/request.d.ts +22 -0
  269. package/dist/types/meeting-info/util.d.ts +2 -0
  270. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  271. package/dist/types/meetings/collection.d.ts +31 -0
  272. package/dist/types/meetings/index.d.ts +315 -0
  273. package/dist/types/meetings/request.d.ts +27 -0
  274. package/dist/types/meetings/util.d.ts +18 -0
  275. package/dist/types/member/index.d.ts +156 -0
  276. package/dist/types/member/types.d.ts +21 -0
  277. package/dist/types/member/util.d.ts +2 -0
  278. package/dist/types/members/collection.d.ts +29 -0
  279. package/dist/types/members/index.d.ts +343 -0
  280. package/dist/types/members/request.d.ts +58 -0
  281. package/dist/types/members/types.d.ts +24 -0
  282. package/dist/types/members/util.d.ts +2 -0
  283. package/dist/types/metrics/config.d.ts +171 -0
  284. package/dist/types/metrics/constants.d.ts +53 -0
  285. package/dist/types/metrics/index.d.ts +152 -0
  286. package/dist/types/multistream/mediaRequestManager.d.ts +68 -0
  287. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  288. package/dist/types/multistream/receiveSlotManager.d.ts +49 -0
  289. package/dist/types/multistream/remoteMedia.d.ts +100 -0
  290. package/dist/types/multistream/remoteMediaGroup.d.ts +56 -0
  291. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  292. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  293. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  294. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  295. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  296. package/dist/types/reachability/index.d.ts +152 -0
  297. package/dist/types/reachability/request.d.ts +37 -0
  298. package/dist/types/reactions/constants.d.ts +3 -0
  299. package/dist/types/reactions/reactions.d.ts +4 -0
  300. package/dist/types/reactions/reactions.type.d.ts +52 -0
  301. package/dist/types/reconnection-manager/index.d.ts +126 -0
  302. package/dist/types/recording-controller/enums.d.ts +7 -0
  303. package/dist/types/recording-controller/index.d.ts +193 -0
  304. package/dist/types/recording-controller/util.d.ts +13 -0
  305. package/dist/types/roap/index.d.ts +77 -0
  306. package/dist/types/roap/request.d.ts +38 -0
  307. package/dist/types/roap/turnDiscovery.d.ts +74 -0
  308. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  309. package/dist/types/statsAnalyzer/index.d.ts +195 -0
  310. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  311. package/dist/types/transcription/index.d.ts +64 -0
  312. package/internal-README.md +7 -6
  313. package/package.json +27 -21
  314. package/src/breakouts/README.md +219 -0
  315. package/src/breakouts/breakout.ts +153 -0
  316. package/src/breakouts/collection.ts +19 -0
  317. package/src/breakouts/edit-lock-error.ts +25 -0
  318. package/src/breakouts/index.ts +745 -0
  319. package/src/breakouts/request.ts +55 -0
  320. package/src/breakouts/utils.ts +44 -0
  321. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  322. package/src/common/collection.ts +9 -7
  323. package/src/common/{config.js → config.ts} +1 -1
  324. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  325. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  326. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  327. package/src/common/errors/{media.js → media.ts} +11 -7
  328. package/src/common/errors/parameter.ts +11 -7
  329. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  330. package/src/common/errors/{permission.js → permission.ts} +10 -6
  331. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  332. package/src/common/errors/{stats.js → stats.ts} +11 -7
  333. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  334. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  335. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  336. package/src/common/events/{events.js → events.ts} +5 -1
  337. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  338. package/src/common/events/{util.js → util.ts} +2 -3
  339. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  340. package/src/common/logs/logger-proxy.ts +44 -0
  341. package/src/common/logs/{request.js → request.ts} +22 -9
  342. package/src/common/queue.ts +1 -2
  343. package/src/{config.js → config.ts} +17 -12
  344. package/src/constants.ts +92 -5
  345. package/src/controls-options-manager/constants.ts +5 -0
  346. package/src/controls-options-manager/enums.ts +7 -0
  347. package/src/controls-options-manager/index.ts +240 -0
  348. package/src/controls-options-manager/util.ts +30 -0
  349. package/src/index.js +4 -1
  350. package/src/locus-info/controlsUtils.ts +141 -0
  351. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  352. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  353. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  354. package/src/locus-info/{index.js → index.ts} +211 -71
  355. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  356. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  357. package/src/locus-info/{parser.js → parser.ts} +67 -79
  358. package/src/locus-info/{selfUtils.js → selfUtils.ts} +183 -67
  359. package/src/media/{index.js → index.ts} +179 -176
  360. package/src/media/{properties.js → properties.ts} +60 -37
  361. package/src/media/{util.js → util.ts} +2 -2
  362. package/src/mediaQualityMetrics/config.ts +384 -0
  363. package/src/meeting/in-meeting-actions.ts +67 -3
  364. package/src/meeting/{index.js → index.ts} +2605 -1605
  365. package/src/meeting/{muteState.js → muteState.ts} +138 -73
  366. package/src/meeting/{request.js → request.ts} +326 -142
  367. package/src/meeting/request.type.ts +13 -0
  368. package/src/meeting/{state.js → state.ts} +50 -35
  369. package/src/meeting/{util.js → util.ts} +131 -115
  370. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  371. package/src/meeting-info/{index.js → index.ts} +42 -36
  372. package/src/meeting-info/meeting-info-v2.ts +273 -0
  373. package/src/meeting-info/{request.js → request.ts} +14 -4
  374. package/src/meeting-info/{util.js → util.ts} +60 -51
  375. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  376. package/src/meetings/{collection.js → collection.ts} +26 -3
  377. package/src/meetings/index.ts +1275 -0
  378. package/src/meetings/{request.js → request.ts} +34 -25
  379. package/src/meetings/{util.js → util.ts} +99 -33
  380. package/src/member/{index.js → index.ts} +124 -56
  381. package/src/member/types.ts +24 -0
  382. package/src/member/{util.js → util.ts} +105 -25
  383. package/src/members/{collection.js → collection.ts} +10 -2
  384. package/src/members/{index.js → index.ts} +281 -144
  385. package/src/members/{request.js → request.ts} +80 -16
  386. package/src/members/types.ts +28 -0
  387. package/src/members/{util.js → util.ts} +108 -55
  388. package/src/metrics/{config.js → config.ts} +255 -92
  389. package/src/metrics/{constants.js → constants.ts} +0 -6
  390. package/src/metrics/{index.js → index.ts} +110 -94
  391. package/src/multistream/mediaRequestManager.ts +144 -40
  392. package/src/multistream/receiveSlot.ts +69 -26
  393. package/src/multistream/receiveSlotManager.ts +50 -38
  394. package/src/multistream/remoteMedia.ts +30 -4
  395. package/src/multistream/remoteMediaGroup.ts +4 -3
  396. package/src/multistream/remoteMediaManager.ts +230 -66
  397. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  398. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  399. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  400. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  401. package/src/reachability/{index.js → index.ts} +157 -94
  402. package/src/reachability/request.ts +46 -35
  403. package/src/reactions/constants.ts +4 -0
  404. package/src/reactions/reactions.ts +104 -0
  405. package/src/reactions/reactions.type.ts +62 -0
  406. package/src/reconnection-manager/{index.js → index.ts} +228 -120
  407. package/src/recording-controller/enums.ts +8 -0
  408. package/src/recording-controller/index.ts +315 -0
  409. package/src/recording-controller/util.ts +58 -0
  410. package/src/roap/{index.js → index.ts} +77 -60
  411. package/src/roap/request.ts +172 -0
  412. package/src/roap/turnDiscovery.ts +81 -41
  413. package/src/statsAnalyzer/global.ts +37 -0
  414. package/src/statsAnalyzer/index.ts +1242 -0
  415. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  416. package/src/transcription/{index.js → index.ts} +46 -39
  417. package/test/integration/spec/converged-space-meetings.js +176 -0
  418. package/test/integration/spec/journey.js +665 -464
  419. package/test/integration/spec/space-meeting.js +320 -206
  420. package/test/integration/spec/transcription.js +7 -8
  421. package/test/unit/spec/breakouts/breakout.ts +178 -0
  422. package/test/unit/spec/breakouts/collection.ts +15 -0
  423. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  424. package/test/unit/spec/breakouts/index.ts +1252 -0
  425. package/test/unit/spec/breakouts/request.ts +104 -0
  426. package/test/unit/spec/breakouts/utils.js +54 -0
  427. package/test/unit/spec/common/browser-detection.js +9 -28
  428. package/test/unit/spec/controls-options-manager/index.js +204 -0
  429. package/test/unit/spec/controls-options-manager/util.js +86 -0
  430. package/test/unit/spec/fixture/locus.js +92 -90
  431. package/test/unit/spec/locus-info/controlsUtils.js +133 -34
  432. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  433. package/test/unit/spec/locus-info/index.js +303 -2
  434. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  435. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  436. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  437. package/test/unit/spec/locus-info/parser.js +3 -9
  438. package/test/unit/spec/locus-info/selfConstant.js +101 -103
  439. package/test/unit/spec/locus-info/selfUtils.js +165 -12
  440. package/test/unit/spec/media/index.ts +72 -8
  441. package/test/unit/spec/media/properties.ts +9 -9
  442. package/test/unit/spec/meeting/in-meeting-actions.ts +29 -2
  443. package/test/unit/spec/meeting/index.js +2503 -802
  444. package/test/unit/spec/meeting/muteState.js +146 -61
  445. package/test/unit/spec/meeting/request.js +141 -43
  446. package/test/unit/spec/meeting/utils.js +135 -164
  447. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  448. package/test/unit/spec/meeting-info/request.js +7 -9
  449. package/test/unit/spec/meeting-info/util.js +11 -12
  450. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  451. package/test/unit/spec/meetings/collection.js +15 -1
  452. package/test/unit/spec/meetings/index.js +622 -263
  453. package/test/unit/spec/meetings/utils.js +65 -14
  454. package/test/unit/spec/member/index.js +24 -1
  455. package/test/unit/spec/member/util.js +359 -32
  456. package/test/unit/spec/members/index.js +294 -54
  457. package/test/unit/spec/members/request.js +50 -20
  458. package/test/unit/spec/members/utils.js +147 -4
  459. package/test/unit/spec/metrics/index.js +16 -21
  460. package/test/unit/spec/multistream/mediaRequestManager.ts +369 -68
  461. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  462. package/test/unit/spec/multistream/receiveSlotManager.ts +60 -38
  463. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  464. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  465. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
  466. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  467. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  468. package/test/unit/spec/reachability/index.ts +176 -27
  469. package/test/unit/spec/reachability/request.js +66 -0
  470. package/test/unit/spec/reconnection-manager/index.js +58 -30
  471. package/test/unit/spec/recording-controller/index.js +231 -0
  472. package/test/unit/spec/recording-controller/util.js +102 -0
  473. package/test/unit/spec/roap/index.ts +12 -8
  474. package/test/unit/spec/roap/request.ts +217 -0
  475. package/test/unit/spec/roap/turnDiscovery.ts +72 -49
  476. package/test/unit/spec/stats-analyzer/index.js +108 -57
  477. package/test/utils/cmr.js +44 -42
  478. package/test/utils/constants.js +9 -0
  479. package/test/utils/testUtils.js +98 -77
  480. package/test/utils/webex-config.js +22 -18
  481. package/test/utils/webex-test-users.js +57 -50
  482. package/tsconfig.json +6 -0
  483. package/dist/media/internal-media-core-wrapper.js +0 -22
  484. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  485. package/dist/meeting/effectsState.js +0 -327
  486. package/dist/meeting/effectsState.js.map +0 -1
  487. package/dist/multistream/multistreamMedia.js +0 -116
  488. package/dist/multistream/multistreamMedia.js.map +0 -1
  489. package/dist/peer-connection-manager/util.js +0 -124
  490. package/dist/peer-connection-manager/util.js.map +0 -1
  491. package/src/common/logs/logger-proxy.js +0 -33
  492. package/src/locus-info/controlsUtils.js +0 -102
  493. package/src/media/internal-media-core-wrapper.ts +0 -9
  494. package/src/mediaQualityMetrics/config.js +0 -382
  495. package/src/meeting/effectsState.js +0 -205
  496. package/src/meeting-info/meeting-info-v2.js +0 -255
  497. package/src/meetings/index.js +0 -1015
  498. package/src/multistream/multistreamMedia.ts +0 -92
  499. package/src/peer-connection-manager/util.ts +0 -117
  500. package/src/roap/request.js +0 -127
  501. package/src/statsAnalyzer/global.js +0 -133
  502. package/src/statsAnalyzer/index.js +0 -1006
  503. package/src/statsAnalyzer/mqaUtil.js +0 -173
  504. package/test/unit/spec/meeting/effectsState.js +0 -291
  505. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  506. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -1,56 +1,42 @@
1
1
  "use strict";
2
2
 
3
3
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
-
5
4
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
-
7
5
  _Object$defineProperty(exports, "__esModule", {
8
6
  value: true
9
7
  });
10
-
11
- exports.default = void 0;
12
-
8
+ exports.createMuteState = void 0;
13
9
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
14
-
15
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
16
-
17
11
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
18
-
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
19
13
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
20
-
21
14
  var _parameter = _interopRequireDefault(require("../common/errors/parameter"));
22
-
23
15
  var _permission = _interopRequireDefault(require("../common/errors/permission"));
24
-
25
- var _media = _interopRequireDefault(require("../media"));
26
-
27
- var _util = _interopRequireDefault(require("../meeting/util"));
28
-
16
+ var _util = _interopRequireDefault(require("./util"));
29
17
  var _constants = require("../constants");
30
-
31
18
  /* Certain aspects of server interaction for video muting are not implemented as we currently don't support remote muting of video.
32
19
  If we ever need to support it, search for REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION string to find the places that need updating
33
20
  */
21
+
22
+ // eslint-disable-next-line import/prefer-default-export
34
23
  var createMuteState = function createMuteState(type, meeting, mediaDirection) {
35
24
  if (type === _constants.AUDIO && !mediaDirection.sendAudio) {
36
25
  return null;
37
26
  }
38
-
39
27
  if (type === _constants.VIDEO && !mediaDirection.sendVideo) {
40
28
  return null;
41
29
  }
42
-
43
30
  _loggerProxy.default.logger.info("Meeting:muteState#createMuteState --> ".concat(type, ": creating MuteState for meeting id ").concat(meeting === null || meeting === void 0 ? void 0 : meeting.id));
44
-
45
31
  return new MuteState(type, meeting);
46
32
  };
33
+
47
34
  /** The purpose of this class is to manage the local and remote mute state and make sure that the server state always matches
48
35
  the last requested state by the client.
49
36
 
50
37
  More info about Locus muting API: https://sqbu-github.cisco.com/pages/WebExSquared/locus/guides/mute.html#
51
38
  */
52
-
53
-
39
+ exports.createMuteState = createMuteState;
54
40
  var MuteState = /*#__PURE__*/function () {
55
41
  /**
56
42
  * Constructor
@@ -59,12 +45,15 @@ var MuteState = /*#__PURE__*/function () {
59
45
  * @param {Object} meeting - the meeting object (used for reading current remote mute status)
60
46
  */
61
47
  function MuteState(type, meeting) {
48
+ var _meeting$remoteVideoM, _meeting$unmuteVideoA;
62
49
  (0, _classCallCheck2.default)(this, MuteState);
63
-
50
+ (0, _defineProperty2.default)(this, "pendingPromiseReject", void 0);
51
+ (0, _defineProperty2.default)(this, "pendingPromiseResolve", void 0);
52
+ (0, _defineProperty2.default)(this, "state", void 0);
53
+ (0, _defineProperty2.default)(this, "type", void 0);
64
54
  if (type !== _constants.AUDIO && type !== _constants.VIDEO) {
65
55
  throw new _parameter.default('Mute state is designed for handling audio or video only');
66
56
  }
67
-
68
57
  this.type = type;
69
58
  this.state = {
70
59
  client: {
@@ -72,16 +61,17 @@ var MuteState = /*#__PURE__*/function () {
72
61
  },
73
62
  server: {
74
63
  localMute: false,
75
- // initial values available only for audio (REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION)
76
- remoteMute: type === _constants.AUDIO ? meeting.remoteMuted : false,
77
- unmuteAllowed: type === _constants.AUDIO ? meeting.unmuteAllowed : true
64
+ // because remoteVideoMuted and unmuteVideoAllowed are updated seperately, they might be undefined
65
+ remoteMute: type === _constants.AUDIO ? meeting.remoteMuted : (_meeting$remoteVideoM = meeting.remoteVideoMuted) !== null && _meeting$remoteVideoM !== void 0 ? _meeting$remoteVideoM : false,
66
+ unmuteAllowed: type === _constants.AUDIO ? meeting.unmuteAllowed : (_meeting$unmuteVideoA = meeting.unmuteVideoAllowed) !== null && _meeting$unmuteVideoA !== void 0 ? _meeting$unmuteVideoA : true
78
67
  },
79
68
  syncToServerInProgress: false
80
- }; // these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call
81
-
69
+ };
70
+ // these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call
82
71
  this.pendingPromiseResolve = null;
83
72
  this.pendingPromiseReject = null;
84
73
  }
74
+
85
75
  /**
86
76
  * Handles mute/unmute request from the client/user. Returns a promise that's resolved once the server update is completed or
87
77
  * at the point that this request becomese superseded by another client request.
@@ -96,21 +86,17 @@ var MuteState = /*#__PURE__*/function () {
96
86
  * @param {Boolean} [mute] true for muting, false for unmuting request
97
87
  * @returns {Promise}
98
88
  */
99
-
100
-
101
89
  (0, _createClass2.default)(MuteState, [{
102
90
  key: "handleClientRequest",
103
91
  value: function handleClientRequest(meeting, mute) {
104
92
  var _this = this;
105
-
106
93
  _loggerProxy.default.logger.info("Meeting:muteState#handleClientRequest --> ".concat(this.type, ": user requesting new mute state: ").concat(mute));
107
-
108
94
  if (!mute && !this.state.server.unmuteAllowed) {
109
95
  return _promise.default.reject(new _permission.default('User is not allowed to unmute self (hard mute feature is being used)'));
110
- } // we don't check if we're already in the same state, because even if we were, we would still have to apply the mute state locally,
111
- // because the client may have changed the audio/vidoe tracks
112
-
96
+ }
113
97
 
98
+ // we don't check if we're already in the same state, because even if we were, we would still have to apply the mute state locally,
99
+ // because the client may have changed the audio/vidoe tracks
114
100
  this.state.client.localMute = mute;
115
101
  this.applyClientStateLocally(meeting);
116
102
  return new _promise.default(function (resolve, reject) {
@@ -118,13 +104,12 @@ var MuteState = /*#__PURE__*/function () {
118
104
  // resolve the last promise we returned to the client as the client has issued a new request that has superseded the previous one
119
105
  _this.pendingPromiseResolve();
120
106
  }
121
-
122
107
  _this.pendingPromiseResolve = resolve;
123
108
  _this.pendingPromiseReject = reject;
124
-
125
109
  _this.applyClientStateToServer(meeting);
126
110
  });
127
111
  }
112
+
128
113
  /**
129
114
  * Applies the current mute state to the local track (by enabling or disabling it accordingly)
130
115
  *
@@ -133,12 +118,18 @@ var MuteState = /*#__PURE__*/function () {
133
118
  * @memberof MuteState
134
119
  * @returns {void}
135
120
  */
136
-
137
121
  }, {
138
122
  key: "applyClientStateLocally",
139
123
  value: function applyClientStateLocally(meeting) {
140
- _media.default.setLocalTrack(!this.state.client.localMute, this.type === _constants.AUDIO ? meeting.mediaProperties.audioTrack : meeting.mediaProperties.videoTrack);
124
+ if (this.type === _constants.AUDIO) {
125
+ var _meeting$mediaPropert;
126
+ (_meeting$mediaPropert = meeting.mediaProperties.audioTrack) === null || _meeting$mediaPropert === void 0 ? void 0 : _meeting$mediaPropert.setMuted(this.state.client.localMute);
127
+ } else {
128
+ var _meeting$mediaPropert2;
129
+ (_meeting$mediaPropert2 = meeting.mediaProperties.videoTrack) === null || _meeting$mediaPropert2 === void 0 ? void 0 : _meeting$mediaPropert2.setMuted(this.state.client.localMute);
130
+ }
141
131
  }
132
+
142
133
  /**
143
134
  * Updates the server local and remote mute values so that they match the current client desired state.
144
135
  *
@@ -147,62 +138,52 @@ var MuteState = /*#__PURE__*/function () {
147
138
  * @memberof MuteState
148
139
  * @returns {void}
149
140
  */
150
-
151
141
  }, {
152
142
  key: "applyClientStateToServer",
153
143
  value: function applyClientStateToServer(meeting) {
154
144
  var _this2 = this;
155
-
156
145
  if (this.state.syncToServerInProgress) {
157
146
  _loggerProxy.default.logger.info("Meeting:muteState#applyClientStateToServer --> ".concat(this.type, ": request to server in progress, we need to wait for it to complete"));
158
-
159
147
  return;
160
148
  }
161
-
162
149
  var localMuteRequiresSync = this.state.client.localMute !== this.state.server.localMute;
163
150
  var remoteMuteRequiresSync = !this.state.client.localMute && this.state.server.remoteMute;
164
-
165
151
  _loggerProxy.default.logger.info("Meeting:muteState#applyClientStateToServer --> ".concat(this.type, ": localMuteRequiresSync: ").concat(localMuteRequiresSync, " (").concat(this.state.client.localMute, " ?= ").concat(this.state.server.localMute, ")"));
166
-
167
152
  _loggerProxy.default.logger.info("Meeting:muteState#applyClientStateToServer --> ".concat(this.type, ": remoteMuteRequiresSync: ").concat(remoteMuteRequiresSync));
168
-
169
153
  if (!localMuteRequiresSync && !remoteMuteRequiresSync) {
170
154
  _loggerProxy.default.logger.info("Meeting:muteState#applyClientStateToServer --> ".concat(this.type, ": client state already matching server state, nothing to do"));
171
-
172
155
  if (this.pendingPromiseResolve) {
173
156
  this.pendingPromiseResolve();
174
157
  }
175
-
176
158
  this.pendingPromiseResolve = null;
177
159
  this.pendingPromiseReject = null;
178
160
  return;
179
161
  }
162
+ this.state.syncToServerInProgress = true;
180
163
 
181
- this.state.syncToServerInProgress = true; // first sync local mute with server
182
-
164
+ // first sync local mute with server
183
165
  var localMuteSyncPromise = localMuteRequiresSync ? this.sendLocalMuteRequestToServer(meeting) : _promise.default.resolve();
184
166
  localMuteSyncPromise.then(function () {
185
- return (// then follow it up with remote mute sync
167
+ return (
168
+ // then follow it up with remote mute sync
186
169
  remoteMuteRequiresSync ? _this2.sendRemoteMuteRequestToServer(meeting) : _promise.default.resolve()
187
170
  );
188
171
  }).then(function () {
189
172
  _this2.state.syncToServerInProgress = false;
173
+ _loggerProxy.default.logger.info("Meeting:muteState#applyClientStateToServer --> ".concat(_this2.type, ": sync with server completed"));
190
174
 
191
- _loggerProxy.default.logger.info("Meeting:muteState#applyClientStateToServer --> ".concat(_this2.type, ": sync with server completed")); // need to check if a new sync is required, because this.state.client may have changed while we were doing the current sync
192
-
193
-
175
+ // need to check if a new sync is required, because this.state.client may have changed while we were doing the current sync
194
176
  _this2.applyClientStateToServer(meeting);
195
177
  }).catch(function (e) {
196
178
  _this2.state.syncToServerInProgress = false;
197
-
198
179
  if (_this2.pendingPromiseReject) {
199
180
  _this2.pendingPromiseReject(e);
200
181
  }
201
-
202
182
  _this2.pendingPromiseResolve = null;
203
183
  _this2.pendingPromiseReject = null;
204
184
  });
205
185
  }
186
+
206
187
  /**
207
188
  * Sets the local mute value in the server
208
189
  *
@@ -211,31 +192,26 @@ var MuteState = /*#__PURE__*/function () {
211
192
  * @memberof MuteState
212
193
  * @returns {Promise}
213
194
  */
214
-
215
195
  }, {
216
196
  key: "sendLocalMuteRequestToServer",
217
197
  value: function sendLocalMuteRequestToServer(meeting) {
218
198
  var _meeting$audio,
219
- _meeting$video,
220
- _this3 = this;
221
-
199
+ _meeting$video,
200
+ _this3 = this;
222
201
  var audioMuted = this.type === _constants.AUDIO ? this.state.client.localMute : (_meeting$audio = meeting.audio) === null || _meeting$audio === void 0 ? void 0 : _meeting$audio.state.client.localMute;
223
202
  var videoMuted = this.type === _constants.VIDEO ? this.state.client.localMute : (_meeting$video = meeting.video) === null || _meeting$video === void 0 ? void 0 : _meeting$video.state.client.localMute;
224
-
225
203
  _loggerProxy.default.logger.info("Meeting:muteState#sendLocalMuteRequestToServer --> ".concat(this.type, ": sending local mute (audio=").concat(audioMuted, ", video=").concat(videoMuted, ") to server"));
226
-
227
204
  return _util.default.remoteUpdateAudioVideo(audioMuted, videoMuted, meeting).then(function (locus) {
228
205
  _loggerProxy.default.logger.info("Meeting:muteState#sendLocalMuteRequestToServer --> ".concat(_this3.type, ": local mute (audio=").concat(audioMuted, ", video=").concat(videoMuted, ") applied to server"));
229
-
230
206
  _this3.state.server.localMute = _this3.type === _constants.AUDIO ? audioMuted : videoMuted;
231
207
  meeting.locusInfo.onFullLocus(locus);
232
208
  return locus;
233
209
  }).catch(function (remoteUpdateError) {
234
210
  _loggerProxy.default.logger.warn("Meeting:muteState#sendLocalMuteRequestToServer --> ".concat(_this3.type, ": failed to apply local mute (audio=").concat(audioMuted, ", video=").concat(videoMuted, ") to server: ").concat(remoteUpdateError));
235
-
236
211
  return _promise.default.reject(remoteUpdateError);
237
212
  });
238
213
  }
214
+
239
215
  /**
240
216
  * Sets the remote mute value in the server
241
217
  *
@@ -244,32 +220,21 @@ var MuteState = /*#__PURE__*/function () {
244
220
  * @memberof MuteState
245
221
  * @returns {Promise}
246
222
  */
247
-
248
223
  }, {
249
224
  key: "sendRemoteMuteRequestToServer",
250
225
  value: function sendRemoteMuteRequestToServer(meeting) {
251
226
  var _this4 = this;
252
-
253
- if (this.type === _constants.AUDIO) {
254
- var remoteMute = this.state.client.localMute;
255
-
256
- _loggerProxy.default.logger.info("Meeting:muteState#sendRemoteMuteRequestToServer --> ".concat(this.type, ": sending remote mute:").concat(remoteMute, " to server"));
257
-
258
- return meeting.members.muteMember(meeting.members.selfId, remoteMute).then(function () {
259
- _loggerProxy.default.logger.info("Meeting:muteState#sendRemoteMuteRequestToServer --> ".concat(_this4.type, ": remote mute:").concat(remoteMute, " applied to server"));
260
-
261
- _this4.state.server.remoteMute = remoteMute;
262
- }).catch(function (remoteUpdateError) {
263
- _loggerProxy.default.logger.warn("Meeting:muteState#sendRemoteMuteRequestToServer --> ".concat(_this4.type, ": failed to apply remote mute ").concat(remoteMute, " to server: ").concat(remoteUpdateError));
264
-
265
- return _promise.default.reject(remoteUpdateError);
266
- });
267
- } // for now we don't need to support remote muting of video (REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION)
268
-
269
-
270
- this.state.server.remoteMute = this.state.client.localMute;
271
- return _promise.default.resolve();
227
+ var remoteMute = this.state.client.localMute;
228
+ _loggerProxy.default.logger.info("Meeting:muteState#sendRemoteMuteRequestToServer --> ".concat(this.type, ": sending remote mute:").concat(remoteMute, " to server"));
229
+ return meeting.members.muteMember(meeting.members.selfId, remoteMute, this.type === _constants.AUDIO).then(function () {
230
+ _loggerProxy.default.logger.info("Meeting:muteState#sendRemoteMuteRequestToServer --> ".concat(_this4.type, ": remote mute:").concat(remoteMute, " applied to server"));
231
+ _this4.state.server.remoteMute = remoteMute;
232
+ }).catch(function (remoteUpdateError) {
233
+ _loggerProxy.default.logger.warn("Meeting:muteState#sendRemoteMuteRequestToServer --> ".concat(_this4.type, ": failed to apply remote mute ").concat(remoteMute, " to server: ").concat(remoteUpdateError));
234
+ return _promise.default.reject(remoteUpdateError);
235
+ });
272
236
  }
237
+
273
238
  /**
274
239
  * This method should be called whenever the server remote mute state is changed
275
240
  *
@@ -279,15 +244,18 @@ var MuteState = /*#__PURE__*/function () {
279
244
  * @param {Boolean} [unmuteAllowed] indicates if user is allowed to unmute self (false when "hard mute" feature is used)
280
245
  * @returns {undefined}
281
246
  */
282
-
283
247
  }, {
284
248
  key: "handleServerRemoteMuteUpdate",
285
249
  value: function handleServerRemoteMuteUpdate(muted, unmuteAllowed) {
286
250
  _loggerProxy.default.logger.info("Meeting:muteState#handleServerRemoteMuteUpdate --> ".concat(this.type, ": updating server remoteMute to (").concat(muted, ")"));
287
-
288
- this.state.server.remoteMute = muted;
289
- this.state.server.unmuteAllowed = unmuteAllowed;
251
+ if (muted !== undefined) {
252
+ this.state.server.remoteMute = muted;
253
+ }
254
+ if (unmuteAllowed !== undefined) {
255
+ this.state.server.unmuteAllowed = unmuteAllowed;
256
+ }
290
257
  }
258
+
291
259
  /**
292
260
  * This method should be called whenever we receive from the server a requirement to locally unmute
293
261
  *
@@ -296,24 +264,21 @@ var MuteState = /*#__PURE__*/function () {
296
264
  * @param {Object} [meeting] the meeting object
297
265
  * @returns {undefined}
298
266
  */
299
-
300
267
  }, {
301
268
  key: "handleServerLocalUnmuteRequired",
302
269
  value: function handleServerLocalUnmuteRequired(meeting) {
303
270
  _loggerProxy.default.logger.info("Meeting:muteState#handleServerLocalUnmuteRequired --> ".concat(this.type, ": localAudioUnmuteRequired received -> doing local unmute"));
304
-
305
271
  this.state.server.remoteMute = false;
306
272
  this.state.client.localMute = false;
307
-
308
273
  if (this.pendingPromiseReject) {
309
274
  this.pendingPromiseReject(new Error('Server requested local unmute - this overrides any client request in progress'));
310
275
  this.pendingPromiseResolve = null;
311
276
  this.pendingPromiseReject = null;
312
277
  }
313
-
314
278
  this.applyClientStateLocally(meeting);
315
279
  this.applyClientStateToServer(meeting);
316
280
  }
281
+
317
282
  /**
318
283
  * Returns true if the user is locally or remotely muted
319
284
  *
@@ -321,32 +286,72 @@ var MuteState = /*#__PURE__*/function () {
321
286
  * @memberof MuteState
322
287
  * @returns {Boolean}
323
288
  */
324
-
325
289
  }, {
326
290
  key: "isMuted",
327
291
  value: function isMuted() {
328
292
  return this.state.client.localMute || this.state.server.localMute || this.state.server.remoteMute;
329
293
  }
294
+
330
295
  /**
331
- * Returns true if the user is muted as a result of the client request (and not remotely muted)
296
+ * Returns true if the user is remotely muted
297
+ *
298
+ * @public
299
+ * @memberof MuteState
300
+ * @returns {Boolean}
301
+ */
302
+ }, {
303
+ key: "isRemotelyMuted",
304
+ value: function isRemotelyMuted() {
305
+ return this.state.server.remoteMute;
306
+ }
307
+
308
+ /**
309
+ * Returns true if unmute is allowed
332
310
  *
333
311
  * @public
334
312
  * @memberof MuteState
335
313
  * @returns {Boolean}
336
314
  */
315
+ }, {
316
+ key: "isUnmuteAllowed",
317
+ value: function isUnmuteAllowed() {
318
+ return this.state.server.unmuteAllowed;
319
+ }
337
320
 
321
+ /**
322
+ * Returns true if the user is locally muted
323
+ *
324
+ * @public
325
+ * @memberof MuteState
326
+ * @returns {Boolean}
327
+ */
328
+ }, {
329
+ key: "isLocallyMuted",
330
+ value: function isLocallyMuted() {
331
+ return this.state.client.localMute || this.state.server.localMute;
332
+ }
333
+
334
+ /**
335
+ * Returns true if the user is muted as a result of the client request (and not remotely muted)
336
+ *
337
+ * @public
338
+ * @memberof MuteState
339
+ * @returns {Boolean}
340
+ */
338
341
  }, {
339
342
  key: "isSelf",
340
343
  value: function isSelf() {
341
344
  return this.state.client.localMute && !this.state.server.remoteMute;
342
- } // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes
345
+ }
343
346
 
347
+ // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes
344
348
  }, {
345
349
  key: "muted",
346
350
  get: function get() {
347
351
  return this.isMuted();
348
- } // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes
352
+ }
349
353
 
354
+ // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes
350
355
  }, {
351
356
  key: "self",
352
357
  get: function get() {
@@ -355,7 +360,4 @@ var MuteState = /*#__PURE__*/function () {
355
360
  }]);
356
361
  return MuteState;
357
362
  }();
358
-
359
- var _default = createMuteState;
360
- exports.default = _default;
361
363
  //# sourceMappingURL=muteState.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createMuteState","type","meeting","mediaDirection","AUDIO","sendAudio","VIDEO","sendVideo","LoggerProxy","logger","info","id","MuteState","ParameterError","state","client","localMute","server","remoteMute","remoteMuted","unmuteAllowed","syncToServerInProgress","pendingPromiseResolve","pendingPromiseReject","mute","reject","PermissionError","applyClientStateLocally","resolve","applyClientStateToServer","Media","setLocalTrack","mediaProperties","audioTrack","videoTrack","localMuteRequiresSync","remoteMuteRequiresSync","localMuteSyncPromise","sendLocalMuteRequestToServer","then","sendRemoteMuteRequestToServer","catch","e","audioMuted","audio","videoMuted","video","MeetingUtil","remoteUpdateAudioVideo","locus","locusInfo","onFullLocus","remoteUpdateError","warn","members","muteMember","selfId","muted","Error","isMuted","isSelf"],"sources":["muteState.js"],"sourcesContent":["\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport ParameterError from '../common/errors/parameter';\nimport PermissionError from '../common/errors/permission';\nimport Media from '../media';\nimport MeetingUtil from '../meeting/util';\nimport {AUDIO, VIDEO} from '../constants';\n\n\n/* Certain aspects of server interaction for video muting are not implemented as we currently don't support remote muting of video.\n If we ever need to support it, search for REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION string to find the places that need updating\n*/\n\nconst createMuteState = (type, meeting, mediaDirection) => {\n if (type === AUDIO && !mediaDirection.sendAudio) {\n return null;\n }\n if (type === VIDEO && !mediaDirection.sendVideo) {\n return null;\n }\n\n LoggerProxy.logger.info(`Meeting:muteState#createMuteState --> ${type}: creating MuteState for meeting id ${meeting?.id}`);\n\n return new MuteState(type, meeting);\n};\n\n/** The purpose of this class is to manage the local and remote mute state and make sure that the server state always matches\n the last requested state by the client.\n\n More info about Locus muting API: https://sqbu-github.cisco.com/pages/WebExSquared/locus/guides/mute.html#\n*/\nclass MuteState {\n /**\n * Constructor\n *\n * @param {String} type - audio or video\n * @param {Object} meeting - the meeting object (used for reading current remote mute status)\n */\n constructor(type, meeting) {\n if ((type !== AUDIO) && (type !== VIDEO)) {\n throw new ParameterError('Mute state is designed for handling audio or video only');\n }\n this.type = type;\n this.state = {\n client: {\n localMute: false\n },\n server: {\n localMute: false,\n // initial values available only for audio (REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION)\n remoteMute: type === AUDIO ? meeting.remoteMuted : false,\n unmuteAllowed: type === AUDIO ? meeting.unmuteAllowed : true\n },\n syncToServerInProgress: false\n };\n // these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n }\n\n /**\n * Handles mute/unmute request from the client/user. Returns a promise that's resolved once the server update is completed or\n * at the point that this request becomese superseded by another client request.\n *\n * The client doesn't have to wait for the returned promise to resolve before calling handleClientRequest() again. If\n * handleClientRequest() is called again before the previous one resolved, the MuteState class will make sure that eventually\n * the server state will match the last requested state from the client.\n *\n * @public\n * @memberof MuteState\n * @param {Object} [meeting] the meeting object\n * @param {Boolean} [mute] true for muting, false for unmuting request\n * @returns {Promise}\n */\n handleClientRequest(meeting, mute) {\n LoggerProxy.logger.info(`Meeting:muteState#handleClientRequest --> ${this.type}: user requesting new mute state: ${mute}`);\n\n if (!mute && !this.state.server.unmuteAllowed) {\n return Promise.reject(new PermissionError('User is not allowed to unmute self (hard mute feature is being used)'));\n }\n\n // we don't check if we're already in the same state, because even if we were, we would still have to apply the mute state locally,\n // because the client may have changed the audio/vidoe tracks\n this.state.client.localMute = mute;\n this.applyClientStateLocally(meeting);\n\n return new Promise((resolve, reject) => {\n if (this.pendingPromiseResolve) {\n // resolve the last promise we returned to the client as the client has issued a new request that has superseded the previous one\n this.pendingPromiseResolve();\n }\n this.pendingPromiseResolve = resolve;\n this.pendingPromiseReject = reject;\n this.applyClientStateToServer(meeting);\n });\n }\n\n /**\n * Applies the current mute state to the local track (by enabling or disabling it accordingly)\n *\n * @public\n * @param {Object} [meeting] the meeting object\n * @memberof MuteState\n * @returns {void}\n */\n applyClientStateLocally(meeting) {\n Media.setLocalTrack(\n !this.state.client.localMute,\n (this.type === AUDIO) ? meeting.mediaProperties.audioTrack : meeting.mediaProperties.videoTrack\n );\n }\n\n /**\n * Updates the server local and remote mute values so that they match the current client desired state.\n *\n * @private\n * @param {Object} [meeting] the meeting object\n * @memberof MuteState\n * @returns {void}\n */\n applyClientStateToServer(meeting) {\n if (this.state.syncToServerInProgress) {\n LoggerProxy.logger.info(`Meeting:muteState#applyClientStateToServer --> ${this.type}: request to server in progress, we need to wait for it to complete`);\n\n return;\n }\n\n const localMuteRequiresSync = (this.state.client.localMute !== this.state.server.localMute);\n const remoteMuteRequiresSync = (!this.state.client.localMute && this.state.server.remoteMute);\n\n LoggerProxy.logger.info(`Meeting:muteState#applyClientStateToServer --> ${this.type}: localMuteRequiresSync: ${localMuteRequiresSync} (${this.state.client.localMute} ?= ${this.state.server.localMute})`);\n LoggerProxy.logger.info(`Meeting:muteState#applyClientStateToServer --> ${this.type}: remoteMuteRequiresSync: ${remoteMuteRequiresSync}`);\n\n if (!localMuteRequiresSync && !remoteMuteRequiresSync) {\n LoggerProxy.logger.info(`Meeting:muteState#applyClientStateToServer --> ${this.type}: client state already matching server state, nothing to do`);\n\n if (this.pendingPromiseResolve) {\n this.pendingPromiseResolve();\n }\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n\n return;\n }\n\n this.state.syncToServerInProgress = true;\n\n // first sync local mute with server\n const localMuteSyncPromise = (localMuteRequiresSync) ? this.sendLocalMuteRequestToServer(meeting) : Promise.resolve();\n\n localMuteSyncPromise\n .then(() =>\n // then follow it up with remote mute sync\n ((remoteMuteRequiresSync) ? this.sendRemoteMuteRequestToServer(meeting) : Promise.resolve()))\n .then(() => {\n this.state.syncToServerInProgress = false;\n LoggerProxy.logger.info(`Meeting:muteState#applyClientStateToServer --> ${this.type}: sync with server completed`);\n\n // need to check if a new sync is required, because this.state.client may have changed while we were doing the current sync\n this.applyClientStateToServer(meeting);\n })\n .catch((e) => {\n this.state.syncToServerInProgress = false;\n\n if (this.pendingPromiseReject) {\n this.pendingPromiseReject(e);\n }\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n });\n }\n\n /**\n * Sets the local mute value in the server\n *\n * @private\n * @param {Object} [meeting] the meeting object\n * @memberof MuteState\n * @returns {Promise}\n */\n sendLocalMuteRequestToServer(meeting) {\n const audioMuted = (this.type === AUDIO) ? this.state.client.localMute : meeting.audio?.state.client.localMute;\n const videoMuted = (this.type === VIDEO) ? this.state.client.localMute : meeting.video?.state.client.localMute;\n\n LoggerProxy.logger.info(`Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: sending local mute (audio=${audioMuted}, video=${videoMuted}) to server`);\n\n return MeetingUtil.remoteUpdateAudioVideo(audioMuted, videoMuted, meeting)\n .then((locus) => {\n LoggerProxy.logger.info(\n `Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: local mute (audio=${audioMuted}, video=${videoMuted}) applied to server`\n );\n\n this.state.server.localMute = (this.type === AUDIO) ? audioMuted : videoMuted;\n\n meeting.locusInfo.onFullLocus(locus);\n\n return locus;\n })\n .catch((remoteUpdateError) => {\n LoggerProxy.logger.warn(\n `Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: failed to apply local mute (audio=${audioMuted}, video=${videoMuted}) to server: ${remoteUpdateError}`\n );\n\n return Promise.reject(remoteUpdateError);\n });\n }\n\n\n /**\n * Sets the remote mute value in the server\n *\n * @private\n * @param {Object} [meeting] the meeting object\n * @memberof MuteState\n * @returns {Promise}\n */\n sendRemoteMuteRequestToServer(meeting) {\n if (this.type === AUDIO) {\n const remoteMute = this.state.client.localMute;\n\n LoggerProxy.logger.info(`Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: sending remote mute:${remoteMute} to server`);\n\n return meeting.members.muteMember(meeting.members.selfId, remoteMute)\n .then(() => {\n LoggerProxy.logger.info(\n `Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: remote mute:${remoteMute} applied to server`\n );\n\n this.state.server.remoteMute = remoteMute;\n })\n .catch((remoteUpdateError) => {\n LoggerProxy.logger.warn(\n `Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: failed to apply remote mute ${remoteMute} to server: ${remoteUpdateError}`\n );\n\n return Promise.reject(remoteUpdateError);\n });\n }\n\n // for now we don't need to support remote muting of video (REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION)\n this.state.server.remoteMute = this.state.client.localMute;\n\n return Promise.resolve();\n }\n\n /**\n * This method should be called whenever the server remote mute state is changed\n *\n * @public\n * @memberof MuteState\n * @param {Boolean} [muted] true if user is remotely muted, false otherwise\n * @param {Boolean} [unmuteAllowed] indicates if user is allowed to unmute self (false when \"hard mute\" feature is used)\n * @returns {undefined}\n */\n handleServerRemoteMuteUpdate(muted, unmuteAllowed) {\n LoggerProxy.logger.info(`Meeting:muteState#handleServerRemoteMuteUpdate --> ${this.type}: updating server remoteMute to (${muted})`);\n this.state.server.remoteMute = muted;\n this.state.server.unmuteAllowed = unmuteAllowed;\n }\n\n /**\n * This method should be called whenever we receive from the server a requirement to locally unmute\n *\n * @public\n * @memberof MuteState\n * @param {Object} [meeting] the meeting object\n * @returns {undefined}\n */\n handleServerLocalUnmuteRequired(meeting) {\n LoggerProxy.logger.info(`Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received -> doing local unmute`);\n\n this.state.server.remoteMute = false;\n this.state.client.localMute = false;\n\n if (this.pendingPromiseReject) {\n this.pendingPromiseReject(new Error('Server requested local unmute - this overrides any client request in progress'));\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n }\n\n this.applyClientStateLocally(meeting);\n this.applyClientStateToServer(meeting);\n }\n\n /**\n * Returns true if the user is locally or remotely muted\n *\n * @public\n * @memberof MuteState\n * @returns {Boolean}\n */\n isMuted() {\n return this.state.client.localMute || this.state.server.localMute || this.state.server.remoteMute;\n }\n\n /**\n * Returns true if the user is muted as a result of the client request (and not remotely muted)\n *\n * @public\n * @memberof MuteState\n * @returns {Boolean}\n */\n isSelf() {\n return this.state.client.localMute && !this.state.server.remoteMute;\n }\n\n // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes\n get muted() {\n return this.isMuted();\n }\n\n // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes\n get self() {\n return this.isSelf();\n }\n}\n\nexport default createMuteState;\n"],"mappings":";;;;;;;;;;;;;;;;;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAGA;AACA;AACA;AAEA,IAAMA,eAAe,GAAG,SAAlBA,eAAkB,CAACC,IAAD,EAAOC,OAAP,EAAgBC,cAAhB,EAAmC;EACzD,IAAIF,IAAI,KAAKG,gBAAT,IAAkB,CAACD,cAAc,CAACE,SAAtC,EAAiD;IAC/C,OAAO,IAAP;EACD;;EACD,IAAIJ,IAAI,KAAKK,gBAAT,IAAkB,CAACH,cAAc,CAACI,SAAtC,EAAiD;IAC/C,OAAO,IAAP;EACD;;EAEDC,oBAAA,CAAYC,MAAZ,CAAmBC,IAAnB,iDAAiET,IAAjE,iDAA4GC,OAA5G,aAA4GA,OAA5G,uBAA4GA,OAAO,CAAES,EAArH;;EAEA,OAAO,IAAIC,SAAJ,CAAcX,IAAd,EAAoBC,OAApB,CAAP;AACD,CAXD;AAaA;AACA;AACA;AACA;AACA;;;IACMU,S;EACJ;AACF;AACA;AACA;AACA;AACA;EACE,mBAAYX,IAAZ,EAAkBC,OAAlB,EAA2B;IAAA;;IACzB,IAAKD,IAAI,KAAKG,gBAAV,IAAqBH,IAAI,KAAKK,gBAAlC,EAA0C;MACxC,MAAM,IAAIO,kBAAJ,CAAmB,yDAAnB,CAAN;IACD;;IACD,KAAKZ,IAAL,GAAYA,IAAZ;IACA,KAAKa,KAAL,GAAa;MACXC,MAAM,EAAE;QACNC,SAAS,EAAE;MADL,CADG;MAIXC,MAAM,EAAE;QACND,SAAS,EAAE,KADL;QAEN;QACAE,UAAU,EAAEjB,IAAI,KAAKG,gBAAT,GAAiBF,OAAO,CAACiB,WAAzB,GAAuC,KAH7C;QAINC,aAAa,EAAEnB,IAAI,KAAKG,gBAAT,GAAiBF,OAAO,CAACkB,aAAzB,GAAyC;MAJlD,CAJG;MAUXC,sBAAsB,EAAE;IAVb,CAAb,CALyB,CAiBzB;;IACA,KAAKC,qBAAL,GAA6B,IAA7B;IACA,KAAKC,oBAAL,GAA4B,IAA5B;EACD;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;WACE,6BAAoBrB,OAApB,EAA6BsB,IAA7B,EAAmC;MAAA;;MACjChB,oBAAA,CAAYC,MAAZ,CAAmBC,IAAnB,qDAAqE,KAAKT,IAA1E,+CAAmHuB,IAAnH;;MAEA,IAAI,CAACA,IAAD,IAAS,CAAC,KAAKV,KAAL,CAAWG,MAAX,CAAkBG,aAAhC,EAA+C;QAC7C,OAAO,iBAAQK,MAAR,CAAe,IAAIC,mBAAJ,CAAoB,sEAApB,CAAf,CAAP;MACD,CALgC,CAOjC;MACA;;;MACA,KAAKZ,KAAL,CAAWC,MAAX,CAAkBC,SAAlB,GAA8BQ,IAA9B;MACA,KAAKG,uBAAL,CAA6BzB,OAA7B;MAEA,OAAO,qBAAY,UAAC0B,OAAD,EAAUH,MAAV,EAAqB;QACtC,IAAI,KAAI,CAACH,qBAAT,EAAgC;UAC9B;UACA,KAAI,CAACA,qBAAL;QACD;;QACD,KAAI,CAACA,qBAAL,GAA6BM,OAA7B;QACA,KAAI,CAACL,oBAAL,GAA4BE,MAA5B;;QACA,KAAI,CAACI,wBAAL,CAA8B3B,OAA9B;MACD,CARM,CAAP;IASD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,iCAAwBA,OAAxB,EAAiC;MAC/B4B,cAAA,CAAMC,aAAN,CACE,CAAC,KAAKjB,KAAL,CAAWC,MAAX,CAAkBC,SADrB,EAEG,KAAKf,IAAL,KAAcG,gBAAf,GAAwBF,OAAO,CAAC8B,eAAR,CAAwBC,UAAhD,GAA6D/B,OAAO,CAAC8B,eAAR,CAAwBE,UAFvF;IAID;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,kCAAyBhC,OAAzB,EAAkC;MAAA;;MAChC,IAAI,KAAKY,KAAL,CAAWO,sBAAf,EAAuC;QACrCb,oBAAA,CAAYC,MAAZ,CAAmBC,IAAnB,0DAA0E,KAAKT,IAA/E;;QAEA;MACD;;MAED,IAAMkC,qBAAqB,GAAI,KAAKrB,KAAL,CAAWC,MAAX,CAAkBC,SAAlB,KAAgC,KAAKF,KAAL,CAAWG,MAAX,CAAkBD,SAAjF;MACA,IAAMoB,sBAAsB,GAAI,CAAC,KAAKtB,KAAL,CAAWC,MAAX,CAAkBC,SAAnB,IAAgC,KAAKF,KAAL,CAAWG,MAAX,CAAkBC,UAAlF;;MAEAV,oBAAA,CAAYC,MAAZ,CAAmBC,IAAnB,0DAA0E,KAAKT,IAA/E,sCAA+GkC,qBAA/G,eAAyI,KAAKrB,KAAL,CAAWC,MAAX,CAAkBC,SAA3J,iBAA2K,KAAKF,KAAL,CAAWG,MAAX,CAAkBD,SAA7L;;MACAR,oBAAA,CAAYC,MAAZ,CAAmBC,IAAnB,0DAA0E,KAAKT,IAA/E,uCAAgHmC,sBAAhH;;MAEA,IAAI,CAACD,qBAAD,IAA0B,CAACC,sBAA/B,EAAuD;QACrD5B,oBAAA,CAAYC,MAAZ,CAAmBC,IAAnB,0DAA0E,KAAKT,IAA/E;;QAEA,IAAI,KAAKqB,qBAAT,EAAgC;UAC9B,KAAKA,qBAAL;QACD;;QACD,KAAKA,qBAAL,GAA6B,IAA7B;QACA,KAAKC,oBAAL,GAA4B,IAA5B;QAEA;MACD;;MAED,KAAKT,KAAL,CAAWO,sBAAX,GAAoC,IAApC,CAzBgC,CA2BhC;;MACA,IAAMgB,oBAAoB,GAAIF,qBAAD,GAA0B,KAAKG,4BAAL,CAAkCpC,OAAlC,CAA1B,GAAuE,iBAAQ0B,OAAR,EAApG;MAEAS,oBAAoB,CACjBE,IADH,CACQ;QAAA,OACJ;UACEH,sBAAD,GAA2B,MAAI,CAACI,6BAAL,CAAmCtC,OAAnC,CAA3B,GAAyE,iBAAQ0B,OAAR;QAFtE;MAAA,CADR,EAIGW,IAJH,CAIQ,YAAM;QACV,MAAI,CAACzB,KAAL,CAAWO,sBAAX,GAAoC,KAApC;;QACAb,oBAAA,CAAYC,MAAZ,CAAmBC,IAAnB,0DAA0E,MAAI,CAACT,IAA/E,mCAFU,CAIV;;;QACA,MAAI,CAAC4B,wBAAL,CAA8B3B,OAA9B;MACD,CAVH,EAWGuC,KAXH,CAWS,UAACC,CAAD,EAAO;QACZ,MAAI,CAAC5B,KAAL,CAAWO,sBAAX,GAAoC,KAApC;;QAEA,IAAI,MAAI,CAACE,oBAAT,EAA+B;UAC7B,MAAI,CAACA,oBAAL,CAA0BmB,CAA1B;QACD;;QACD,MAAI,CAACpB,qBAAL,GAA6B,IAA7B;QACA,MAAI,CAACC,oBAAL,GAA4B,IAA5B;MACD,CAnBH;IAoBD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,sCAA6BrB,OAA7B,EAAsC;MAAA;MAAA;MAAA;;MACpC,IAAMyC,UAAU,GAAI,KAAK1C,IAAL,KAAcG,gBAAf,GAAwB,KAAKU,KAAL,CAAWC,MAAX,CAAkBC,SAA1C,qBAAsDd,OAAO,CAAC0C,KAA9D,mDAAsD,eAAe9B,KAAf,CAAqBC,MAArB,CAA4BC,SAArG;MACA,IAAM6B,UAAU,GAAI,KAAK5C,IAAL,KAAcK,gBAAf,GAAwB,KAAKQ,KAAL,CAAWC,MAAX,CAAkBC,SAA1C,qBAAsDd,OAAO,CAAC4C,KAA9D,mDAAsD,eAAehC,KAAf,CAAqBC,MAArB,CAA4BC,SAArG;;MAEAR,oBAAA,CAAYC,MAAZ,CAAmBC,IAAnB,8DAA8E,KAAKT,IAAnF,yCAAsH0C,UAAtH,qBAA2IE,UAA3I;;MAEA,OAAOE,aAAA,CAAYC,sBAAZ,CAAmCL,UAAnC,EAA+CE,UAA/C,EAA2D3C,OAA3D,EACJqC,IADI,CACC,UAACU,KAAD,EAAW;QACfzC,oBAAA,CAAYC,MAAZ,CAAmBC,IAAnB,8DACwD,MAAI,CAACT,IAD7D,iCACwF0C,UADxF,qBAC6GE,UAD7G;;QAIA,MAAI,CAAC/B,KAAL,CAAWG,MAAX,CAAkBD,SAAlB,GAA+B,MAAI,CAACf,IAAL,KAAcG,gBAAf,GAAwBuC,UAAxB,GAAqCE,UAAnE;QAEA3C,OAAO,CAACgD,SAAR,CAAkBC,WAAlB,CAA8BF,KAA9B;QAEA,OAAOA,KAAP;MACD,CAXI,EAYJR,KAZI,CAYE,UAACW,iBAAD,EAAuB;QAC5B5C,oBAAA,CAAYC,MAAZ,CAAmB4C,IAAnB,8DACwD,MAAI,CAACpD,IAD7D,iDACwG0C,UADxG,qBAC6HE,UAD7H,0BACuJO,iBADvJ;;QAIA,OAAO,iBAAQ3B,MAAR,CAAe2B,iBAAf,CAAP;MACD,CAlBI,CAAP;IAmBD;IAGD;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,uCAA8BlD,OAA9B,EAAuC;MAAA;;MACrC,IAAI,KAAKD,IAAL,KAAcG,gBAAlB,EAAyB;QACvB,IAAMc,UAAU,GAAG,KAAKJ,KAAL,CAAWC,MAAX,CAAkBC,SAArC;;QAEAR,oBAAA,CAAYC,MAAZ,CAAmBC,IAAnB,+DAA+E,KAAKT,IAApF,mCAAiHiB,UAAjH;;QAEA,OAAOhB,OAAO,CAACoD,OAAR,CAAgBC,UAAhB,CAA2BrD,OAAO,CAACoD,OAAR,CAAgBE,MAA3C,EAAmDtC,UAAnD,EACJqB,IADI,CACC,YAAM;UACV/B,oBAAA,CAAYC,MAAZ,CAAmBC,IAAnB,+DACyD,MAAI,CAACT,IAD9D,2BACmFiB,UADnF;;UAIA,MAAI,CAACJ,KAAL,CAAWG,MAAX,CAAkBC,UAAlB,GAA+BA,UAA/B;QACD,CAPI,EAQJuB,KARI,CAQE,UAACW,iBAAD,EAAuB;UAC5B5C,oBAAA,CAAYC,MAAZ,CAAmB4C,IAAnB,+DACyD,MAAI,CAACpD,IAD9D,2CACmGiB,UADnG,yBAC4HkC,iBAD5H;;UAIA,OAAO,iBAAQ3B,MAAR,CAAe2B,iBAAf,CAAP;QACD,CAdI,CAAP;MAeD,CArBoC,CAuBrC;;;MACA,KAAKtC,KAAL,CAAWG,MAAX,CAAkBC,UAAlB,GAA+B,KAAKJ,KAAL,CAAWC,MAAX,CAAkBC,SAAjD;MAEA,OAAO,iBAAQY,OAAR,EAAP;IACD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,sCAA6B6B,KAA7B,EAAoCrC,aAApC,EAAmD;MACjDZ,oBAAA,CAAYC,MAAZ,CAAmBC,IAAnB,8DAA8E,KAAKT,IAAnF,8CAA2HwD,KAA3H;;MACA,KAAK3C,KAAL,CAAWG,MAAX,CAAkBC,UAAlB,GAA+BuC,KAA/B;MACA,KAAK3C,KAAL,CAAWG,MAAX,CAAkBG,aAAlB,GAAkCA,aAAlC;IACD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,yCAAgClB,OAAhC,EAAyC;MACvCM,oBAAA,CAAYC,MAAZ,CAAmBC,IAAnB,iEAAiF,KAAKT,IAAtF;;MAEA,KAAKa,KAAL,CAAWG,MAAX,CAAkBC,UAAlB,GAA+B,KAA/B;MACA,KAAKJ,KAAL,CAAWC,MAAX,CAAkBC,SAAlB,GAA8B,KAA9B;;MAEA,IAAI,KAAKO,oBAAT,EAA+B;QAC7B,KAAKA,oBAAL,CAA0B,IAAImC,KAAJ,CAAU,+EAAV,CAA1B;QACA,KAAKpC,qBAAL,GAA6B,IAA7B;QACA,KAAKC,oBAAL,GAA4B,IAA5B;MACD;;MAED,KAAKI,uBAAL,CAA6BzB,OAA7B;MACA,KAAK2B,wBAAL,CAA8B3B,OAA9B;IACD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,mBAAU;MACR,OAAO,KAAKY,KAAL,CAAWC,MAAX,CAAkBC,SAAlB,IAA+B,KAAKF,KAAL,CAAWG,MAAX,CAAkBD,SAAjD,IAA8D,KAAKF,KAAL,CAAWG,MAAX,CAAkBC,UAAvF;IACD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,kBAAS;MACP,OAAO,KAAKJ,KAAL,CAAWC,MAAX,CAAkBC,SAAlB,IAA+B,CAAC,KAAKF,KAAL,CAAWG,MAAX,CAAkBC,UAAzD;IACD,C,CAED;;;;SACA,eAAY;MACV,OAAO,KAAKyC,OAAL,EAAP;IACD,C,CAED;;;;SACA,eAAW;MACT,OAAO,KAAKC,MAAL,EAAP;IACD;;;;;eAGY5D,e"}
1
+ {"version":3,"names":["createMuteState","type","meeting","mediaDirection","AUDIO","sendAudio","VIDEO","sendVideo","LoggerProxy","logger","info","id","MuteState","ParameterError","state","client","localMute","server","remoteMute","remoteMuted","remoteVideoMuted","unmuteAllowed","unmuteVideoAllowed","syncToServerInProgress","pendingPromiseResolve","pendingPromiseReject","mute","reject","PermissionError","applyClientStateLocally","resolve","applyClientStateToServer","mediaProperties","audioTrack","setMuted","videoTrack","localMuteRequiresSync","remoteMuteRequiresSync","localMuteSyncPromise","sendLocalMuteRequestToServer","then","sendRemoteMuteRequestToServer","catch","e","audioMuted","audio","videoMuted","video","MeetingUtil","remoteUpdateAudioVideo","locus","locusInfo","onFullLocus","remoteUpdateError","warn","members","muteMember","selfId","muted","undefined","Error","isMuted","isSelf"],"sources":["muteState.ts"],"sourcesContent":["import LoggerProxy from '../common/logs/logger-proxy';\nimport ParameterError from '../common/errors/parameter';\nimport PermissionError from '../common/errors/permission';\nimport MeetingUtil from './util';\nimport {AUDIO, VIDEO} from '../constants';\n\n/* Certain aspects of server interaction for video muting are not implemented as we currently don't support remote muting of video.\n If we ever need to support it, search for REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION string to find the places that need updating\n*/\n\n// eslint-disable-next-line import/prefer-default-export\nexport const createMuteState = (type, meeting, mediaDirection) => {\n if (type === AUDIO && !mediaDirection.sendAudio) {\n return null;\n }\n if (type === VIDEO && !mediaDirection.sendVideo) {\n return null;\n }\n\n LoggerProxy.logger.info(\n `Meeting:muteState#createMuteState --> ${type}: creating MuteState for meeting id ${meeting?.id}`\n );\n\n return new MuteState(type, meeting);\n};\n\n/** The purpose of this class is to manage the local and remote mute state and make sure that the server state always matches\n the last requested state by the client.\n\n More info about Locus muting API: https://sqbu-github.cisco.com/pages/WebExSquared/locus/guides/mute.html#\n*/\nclass MuteState {\n pendingPromiseReject: any;\n pendingPromiseResolve: any;\n state: any;\n type: any;\n\n /**\n * Constructor\n *\n * @param {String} type - audio or video\n * @param {Object} meeting - the meeting object (used for reading current remote mute status)\n */\n constructor(type: string, meeting: any) {\n if (type !== AUDIO && type !== VIDEO) {\n throw new ParameterError('Mute state is designed for handling audio or video only');\n }\n this.type = type;\n this.state = {\n client: {\n localMute: false,\n },\n server: {\n localMute: false,\n // because remoteVideoMuted and unmuteVideoAllowed are updated seperately, they might be undefined\n remoteMute: type === AUDIO ? meeting.remoteMuted : meeting.remoteVideoMuted ?? false,\n unmuteAllowed: type === AUDIO ? meeting.unmuteAllowed : meeting.unmuteVideoAllowed ?? true,\n },\n syncToServerInProgress: false,\n };\n // these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n }\n\n /**\n * Handles mute/unmute request from the client/user. Returns a promise that's resolved once the server update is completed or\n * at the point that this request becomese superseded by another client request.\n *\n * The client doesn't have to wait for the returned promise to resolve before calling handleClientRequest() again. If\n * handleClientRequest() is called again before the previous one resolved, the MuteState class will make sure that eventually\n * the server state will match the last requested state from the client.\n *\n * @public\n * @memberof MuteState\n * @param {Object} [meeting] the meeting object\n * @param {Boolean} [mute] true for muting, false for unmuting request\n * @returns {Promise}\n */\n public handleClientRequest(meeting?: object, mute?: boolean) {\n LoggerProxy.logger.info(\n `Meeting:muteState#handleClientRequest --> ${this.type}: user requesting new mute state: ${mute}`\n );\n\n if (!mute && !this.state.server.unmuteAllowed) {\n return Promise.reject(\n new PermissionError('User is not allowed to unmute self (hard mute feature is being used)')\n );\n }\n\n // we don't check if we're already in the same state, because even if we were, we would still have to apply the mute state locally,\n // because the client may have changed the audio/vidoe tracks\n this.state.client.localMute = mute;\n this.applyClientStateLocally(meeting);\n\n return new Promise((resolve, reject) => {\n if (this.pendingPromiseResolve) {\n // resolve the last promise we returned to the client as the client has issued a new request that has superseded the previous one\n this.pendingPromiseResolve();\n }\n this.pendingPromiseResolve = resolve;\n this.pendingPromiseReject = reject;\n this.applyClientStateToServer(meeting);\n });\n }\n\n /**\n * Applies the current mute state to the local track (by enabling or disabling it accordingly)\n *\n * @public\n * @param {Object} [meeting] the meeting object\n * @memberof MuteState\n * @returns {void}\n */\n public applyClientStateLocally(meeting?: any) {\n if (this.type === AUDIO) {\n meeting.mediaProperties.audioTrack?.setMuted(this.state.client.localMute);\n } else {\n meeting.mediaProperties.videoTrack?.setMuted(this.state.client.localMute);\n }\n }\n\n /**\n * Updates the server local and remote mute values so that they match the current client desired state.\n *\n * @private\n * @param {Object} [meeting] the meeting object\n * @memberof MuteState\n * @returns {void}\n */\n private applyClientStateToServer(meeting?: object) {\n if (this.state.syncToServerInProgress) {\n LoggerProxy.logger.info(\n `Meeting:muteState#applyClientStateToServer --> ${this.type}: request to server in progress, we need to wait for it to complete`\n );\n\n return;\n }\n\n const localMuteRequiresSync = this.state.client.localMute !== this.state.server.localMute;\n const remoteMuteRequiresSync = !this.state.client.localMute && this.state.server.remoteMute;\n\n LoggerProxy.logger.info(\n `Meeting:muteState#applyClientStateToServer --> ${this.type}: localMuteRequiresSync: ${localMuteRequiresSync} (${this.state.client.localMute} ?= ${this.state.server.localMute})`\n );\n LoggerProxy.logger.info(\n `Meeting:muteState#applyClientStateToServer --> ${this.type}: remoteMuteRequiresSync: ${remoteMuteRequiresSync}`\n );\n\n if (!localMuteRequiresSync && !remoteMuteRequiresSync) {\n LoggerProxy.logger.info(\n `Meeting:muteState#applyClientStateToServer --> ${this.type}: client state already matching server state, nothing to do`\n );\n\n if (this.pendingPromiseResolve) {\n this.pendingPromiseResolve();\n }\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n\n return;\n }\n\n this.state.syncToServerInProgress = true;\n\n // first sync local mute with server\n const localMuteSyncPromise = localMuteRequiresSync\n ? this.sendLocalMuteRequestToServer(meeting)\n : Promise.resolve();\n\n localMuteSyncPromise\n .then(() =>\n // then follow it up with remote mute sync\n remoteMuteRequiresSync ? this.sendRemoteMuteRequestToServer(meeting) : Promise.resolve()\n )\n .then(() => {\n this.state.syncToServerInProgress = false;\n LoggerProxy.logger.info(\n `Meeting:muteState#applyClientStateToServer --> ${this.type}: sync with server completed`\n );\n\n // need to check if a new sync is required, because this.state.client may have changed while we were doing the current sync\n this.applyClientStateToServer(meeting);\n })\n .catch((e) => {\n this.state.syncToServerInProgress = false;\n\n if (this.pendingPromiseReject) {\n this.pendingPromiseReject(e);\n }\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n });\n }\n\n /**\n * Sets the local mute value in the server\n *\n * @private\n * @param {Object} [meeting] the meeting object\n * @memberof MuteState\n * @returns {Promise}\n */\n private sendLocalMuteRequestToServer(meeting?: any) {\n const audioMuted =\n this.type === AUDIO ? this.state.client.localMute : meeting.audio?.state.client.localMute;\n const videoMuted =\n this.type === VIDEO ? this.state.client.localMute : meeting.video?.state.client.localMute;\n\n LoggerProxy.logger.info(\n `Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: sending local mute (audio=${audioMuted}, video=${videoMuted}) to server`\n );\n\n return MeetingUtil.remoteUpdateAudioVideo(audioMuted, videoMuted, meeting)\n .then((locus) => {\n LoggerProxy.logger.info(\n `Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: local mute (audio=${audioMuted}, video=${videoMuted}) applied to server`\n );\n\n this.state.server.localMute = this.type === AUDIO ? audioMuted : videoMuted;\n\n meeting.locusInfo.onFullLocus(locus);\n\n return locus;\n })\n .catch((remoteUpdateError) => {\n LoggerProxy.logger.warn(\n `Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: failed to apply local mute (audio=${audioMuted}, video=${videoMuted}) to server: ${remoteUpdateError}`\n );\n\n return Promise.reject(remoteUpdateError);\n });\n }\n\n /**\n * Sets the remote mute value in the server\n *\n * @private\n * @param {Object} [meeting] the meeting object\n * @memberof MuteState\n * @returns {Promise}\n */\n private sendRemoteMuteRequestToServer(meeting?: any) {\n const remoteMute = this.state.client.localMute;\n\n LoggerProxy.logger.info(\n `Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: sending remote mute:${remoteMute} to server`\n );\n\n return meeting.members\n .muteMember(meeting.members.selfId, remoteMute, this.type === AUDIO)\n .then(() => {\n LoggerProxy.logger.info(\n `Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: remote mute:${remoteMute} applied to server`\n );\n\n this.state.server.remoteMute = remoteMute;\n })\n .catch((remoteUpdateError) => {\n LoggerProxy.logger.warn(\n `Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: failed to apply remote mute ${remoteMute} to server: ${remoteUpdateError}`\n );\n\n return Promise.reject(remoteUpdateError);\n });\n }\n\n /**\n * This method should be called whenever the server remote mute state is changed\n *\n * @public\n * @memberof MuteState\n * @param {Boolean} [muted] true if user is remotely muted, false otherwise\n * @param {Boolean} [unmuteAllowed] indicates if user is allowed to unmute self (false when \"hard mute\" feature is used)\n * @returns {undefined}\n */\n public handleServerRemoteMuteUpdate(muted?: boolean, unmuteAllowed?: boolean) {\n LoggerProxy.logger.info(\n `Meeting:muteState#handleServerRemoteMuteUpdate --> ${this.type}: updating server remoteMute to (${muted})`\n );\n if (muted !== undefined) {\n this.state.server.remoteMute = muted;\n }\n if (unmuteAllowed !== undefined) {\n this.state.server.unmuteAllowed = unmuteAllowed;\n }\n }\n\n /**\n * This method should be called whenever we receive from the server a requirement to locally unmute\n *\n * @public\n * @memberof MuteState\n * @param {Object} [meeting] the meeting object\n * @returns {undefined}\n */\n public handleServerLocalUnmuteRequired(meeting?: object) {\n LoggerProxy.logger.info(\n `Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received -> doing local unmute`\n );\n\n this.state.server.remoteMute = false;\n this.state.client.localMute = false;\n\n if (this.pendingPromiseReject) {\n this.pendingPromiseReject(\n new Error('Server requested local unmute - this overrides any client request in progress')\n );\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n }\n\n this.applyClientStateLocally(meeting);\n this.applyClientStateToServer(meeting);\n }\n\n /**\n * Returns true if the user is locally or remotely muted\n *\n * @public\n * @memberof MuteState\n * @returns {Boolean}\n */\n public isMuted() {\n return (\n this.state.client.localMute || this.state.server.localMute || this.state.server.remoteMute\n );\n }\n\n /**\n * Returns true if the user is remotely muted\n *\n * @public\n * @memberof MuteState\n * @returns {Boolean}\n */\n public isRemotelyMuted() {\n return this.state.server.remoteMute;\n }\n\n /**\n * Returns true if unmute is allowed\n *\n * @public\n * @memberof MuteState\n * @returns {Boolean}\n */\n public isUnmuteAllowed() {\n return this.state.server.unmuteAllowed;\n }\n\n /**\n * Returns true if the user is locally muted\n *\n * @public\n * @memberof MuteState\n * @returns {Boolean}\n */\n public isLocallyMuted() {\n return this.state.client.localMute || this.state.server.localMute;\n }\n\n /**\n * Returns true if the user is muted as a result of the client request (and not remotely muted)\n *\n * @public\n * @memberof MuteState\n * @returns {Boolean}\n */\n public isSelf() {\n return this.state.client.localMute && !this.state.server.remoteMute;\n }\n\n // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes\n get muted() {\n return this.isMuted();\n }\n\n // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes\n get self() {\n return this.isSelf();\n }\n}\n"],"mappings":";;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAEA;AACO,IAAMA,eAAe,GAAG,SAAlBA,eAAe,CAAIC,IAAI,EAAEC,OAAO,EAAEC,cAAc,EAAK;EAChE,IAAIF,IAAI,KAAKG,gBAAK,IAAI,CAACD,cAAc,CAACE,SAAS,EAAE;IAC/C,OAAO,IAAI;EACb;EACA,IAAIJ,IAAI,KAAKK,gBAAK,IAAI,CAACH,cAAc,CAACI,SAAS,EAAE;IAC/C,OAAO,IAAI;EACb;EAEAC,oBAAW,CAACC,MAAM,CAACC,IAAI,iDACoBT,IAAI,iDAAuCC,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAES,EAAE,EAChG;EAED,OAAO,IAAIC,SAAS,CAACX,IAAI,EAAEC,OAAO,CAAC;AACrC,CAAC;;AAED;AACA;AACA;AACA;AACA;AAJA;AAAA,IAKMU,SAAS;EAMb;AACF;AACA;AACA;AACA;AACA;EACE,mBAAYX,IAAY,EAAEC,OAAY,EAAE;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IACtC,IAAID,IAAI,KAAKG,gBAAK,IAAIH,IAAI,KAAKK,gBAAK,EAAE;MACpC,MAAM,IAAIO,kBAAc,CAAC,yDAAyD,CAAC;IACrF;IACA,IAAI,CAACZ,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACa,KAAK,GAAG;MACXC,MAAM,EAAE;QACNC,SAAS,EAAE;MACb,CAAC;MACDC,MAAM,EAAE;QACND,SAAS,EAAE,KAAK;QAChB;QACAE,UAAU,EAAEjB,IAAI,KAAKG,gBAAK,GAAGF,OAAO,CAACiB,WAAW,4BAAGjB,OAAO,CAACkB,gBAAgB,yEAAI,KAAK;QACpFC,aAAa,EAAEpB,IAAI,KAAKG,gBAAK,GAAGF,OAAO,CAACmB,aAAa,4BAAGnB,OAAO,CAACoB,kBAAkB,yEAAI;MACxF,CAAC;MACDC,sBAAsB,EAAE;IAC1B,CAAC;IACD;IACA,IAAI,CAACC,qBAAqB,GAAG,IAAI;IACjC,IAAI,CAACC,oBAAoB,GAAG,IAAI;EAClC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EAbE;IAAA;IAAA,OAcA,6BAA2BvB,OAAgB,EAAEwB,IAAc,EAAE;MAAA;MAC3DlB,oBAAW,CAACC,MAAM,CAACC,IAAI,qDACwB,IAAI,CAACT,IAAI,+CAAqCyB,IAAI,EAChG;MAED,IAAI,CAACA,IAAI,IAAI,CAAC,IAAI,CAACZ,KAAK,CAACG,MAAM,CAACI,aAAa,EAAE;QAC7C,OAAO,iBAAQM,MAAM,CACnB,IAAIC,mBAAe,CAAC,sEAAsE,CAAC,CAC5F;MACH;;MAEA;MACA;MACA,IAAI,CAACd,KAAK,CAACC,MAAM,CAACC,SAAS,GAAGU,IAAI;MAClC,IAAI,CAACG,uBAAuB,CAAC3B,OAAO,CAAC;MAErC,OAAO,qBAAY,UAAC4B,OAAO,EAAEH,MAAM,EAAK;QACtC,IAAI,KAAI,CAACH,qBAAqB,EAAE;UAC9B;UACA,KAAI,CAACA,qBAAqB,EAAE;QAC9B;QACA,KAAI,CAACA,qBAAqB,GAAGM,OAAO;QACpC,KAAI,CAACL,oBAAoB,GAAGE,MAAM;QAClC,KAAI,CAACI,wBAAwB,CAAC7B,OAAO,CAAC;MACxC,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,iCAA+BA,OAAa,EAAE;MAC5C,IAAI,IAAI,CAACD,IAAI,KAAKG,gBAAK,EAAE;QAAA;QACvB,yBAAAF,OAAO,CAAC8B,eAAe,CAACC,UAAU,0DAAlC,sBAAoCC,QAAQ,CAAC,IAAI,CAACpB,KAAK,CAACC,MAAM,CAACC,SAAS,CAAC;MAC3E,CAAC,MAAM;QAAA;QACL,0BAAAd,OAAO,CAAC8B,eAAe,CAACG,UAAU,2DAAlC,uBAAoCD,QAAQ,CAAC,IAAI,CAACpB,KAAK,CAACC,MAAM,CAACC,SAAS,CAAC;MAC3E;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,kCAAiCd,OAAgB,EAAE;MAAA;MACjD,IAAI,IAAI,CAACY,KAAK,CAACS,sBAAsB,EAAE;QACrCf,oBAAW,CAACC,MAAM,CAACC,IAAI,0DAC6B,IAAI,CAACT,IAAI,yEAC5D;QAED;MACF;MAEA,IAAMmC,qBAAqB,GAAG,IAAI,CAACtB,KAAK,CAACC,MAAM,CAACC,SAAS,KAAK,IAAI,CAACF,KAAK,CAACG,MAAM,CAACD,SAAS;MACzF,IAAMqB,sBAAsB,GAAG,CAAC,IAAI,CAACvB,KAAK,CAACC,MAAM,CAACC,SAAS,IAAI,IAAI,CAACF,KAAK,CAACG,MAAM,CAACC,UAAU;MAE3FV,oBAAW,CAACC,MAAM,CAACC,IAAI,0DAC6B,IAAI,CAACT,IAAI,sCAA4BmC,qBAAqB,eAAK,IAAI,CAACtB,KAAK,CAACC,MAAM,CAACC,SAAS,iBAAO,IAAI,CAACF,KAAK,CAACG,MAAM,CAACD,SAAS,OAC/K;MACDR,oBAAW,CAACC,MAAM,CAACC,IAAI,0DAC6B,IAAI,CAACT,IAAI,uCAA6BoC,sBAAsB,EAC/G;MAED,IAAI,CAACD,qBAAqB,IAAI,CAACC,sBAAsB,EAAE;QACrD7B,oBAAW,CAACC,MAAM,CAACC,IAAI,0DAC6B,IAAI,CAACT,IAAI,iEAC5D;QAED,IAAI,IAAI,CAACuB,qBAAqB,EAAE;UAC9B,IAAI,CAACA,qBAAqB,EAAE;QAC9B;QACA,IAAI,CAACA,qBAAqB,GAAG,IAAI;QACjC,IAAI,CAACC,oBAAoB,GAAG,IAAI;QAEhC;MACF;MAEA,IAAI,CAACX,KAAK,CAACS,sBAAsB,GAAG,IAAI;;MAExC;MACA,IAAMe,oBAAoB,GAAGF,qBAAqB,GAC9C,IAAI,CAACG,4BAA4B,CAACrC,OAAO,CAAC,GAC1C,iBAAQ4B,OAAO,EAAE;MAErBQ,oBAAoB,CACjBE,IAAI,CAAC;QAAA;UACJ;UACAH,sBAAsB,GAAG,MAAI,CAACI,6BAA6B,CAACvC,OAAO,CAAC,GAAG,iBAAQ4B,OAAO;QAAE;MAAA,EACzF,CACAU,IAAI,CAAC,YAAM;QACV,MAAI,CAAC1B,KAAK,CAACS,sBAAsB,GAAG,KAAK;QACzCf,oBAAW,CAACC,MAAM,CAACC,IAAI,0DAC6B,MAAI,CAACT,IAAI,kCAC5D;;QAED;QACA,MAAI,CAAC8B,wBAAwB,CAAC7B,OAAO,CAAC;MACxC,CAAC,CAAC,CACDwC,KAAK,CAAC,UAACC,CAAC,EAAK;QACZ,MAAI,CAAC7B,KAAK,CAACS,sBAAsB,GAAG,KAAK;QAEzC,IAAI,MAAI,CAACE,oBAAoB,EAAE;UAC7B,MAAI,CAACA,oBAAoB,CAACkB,CAAC,CAAC;QAC9B;QACA,MAAI,CAACnB,qBAAqB,GAAG,IAAI;QACjC,MAAI,CAACC,oBAAoB,GAAG,IAAI;MAClC,CAAC,CAAC;IACN;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,sCAAqCvB,OAAa,EAAE;MAAA;QAAA;QAAA;MAClD,IAAM0C,UAAU,GACd,IAAI,CAAC3C,IAAI,KAAKG,gBAAK,GAAG,IAAI,CAACU,KAAK,CAACC,MAAM,CAACC,SAAS,qBAAGd,OAAO,CAAC2C,KAAK,mDAAb,eAAe/B,KAAK,CAACC,MAAM,CAACC,SAAS;MAC3F,IAAM8B,UAAU,GACd,IAAI,CAAC7C,IAAI,KAAKK,gBAAK,GAAG,IAAI,CAACQ,KAAK,CAACC,MAAM,CAACC,SAAS,qBAAGd,OAAO,CAAC6C,KAAK,mDAAb,eAAejC,KAAK,CAACC,MAAM,CAACC,SAAS;MAE3FR,oBAAW,CAACC,MAAM,CAACC,IAAI,8DACiC,IAAI,CAACT,IAAI,yCAA+B2C,UAAU,qBAAWE,UAAU,iBAC9H;MAED,OAAOE,aAAW,CAACC,sBAAsB,CAACL,UAAU,EAAEE,UAAU,EAAE5C,OAAO,CAAC,CACvEsC,IAAI,CAAC,UAACU,KAAK,EAAK;QACf1C,oBAAW,CAACC,MAAM,CAACC,IAAI,8DACiC,MAAI,CAACT,IAAI,iCAAuB2C,UAAU,qBAAWE,UAAU,yBACtH;QAED,MAAI,CAAChC,KAAK,CAACG,MAAM,CAACD,SAAS,GAAG,MAAI,CAACf,IAAI,KAAKG,gBAAK,GAAGwC,UAAU,GAAGE,UAAU;QAE3E5C,OAAO,CAACiD,SAAS,CAACC,WAAW,CAACF,KAAK,CAAC;QAEpC,OAAOA,KAAK;MACd,CAAC,CAAC,CACDR,KAAK,CAAC,UAACW,iBAAiB,EAAK;QAC5B7C,oBAAW,CAACC,MAAM,CAAC6C,IAAI,8DACiC,MAAI,CAACrD,IAAI,iDAAuC2C,UAAU,qBAAWE,UAAU,0BAAgBO,iBAAiB,EACvK;QAED,OAAO,iBAAQ1B,MAAM,CAAC0B,iBAAiB,CAAC;MAC1C,CAAC,CAAC;IACN;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,uCAAsCnD,OAAa,EAAE;MAAA;MACnD,IAAMgB,UAAU,GAAG,IAAI,CAACJ,KAAK,CAACC,MAAM,CAACC,SAAS;MAE9CR,oBAAW,CAACC,MAAM,CAACC,IAAI,+DACkC,IAAI,CAACT,IAAI,mCAAyBiB,UAAU,gBACpG;MAED,OAAOhB,OAAO,CAACqD,OAAO,CACnBC,UAAU,CAACtD,OAAO,CAACqD,OAAO,CAACE,MAAM,EAAEvC,UAAU,EAAE,IAAI,CAACjB,IAAI,KAAKG,gBAAK,CAAC,CACnEoC,IAAI,CAAC,YAAM;QACVhC,oBAAW,CAACC,MAAM,CAACC,IAAI,+DACkC,MAAI,CAACT,IAAI,2BAAiBiB,UAAU,wBAC5F;QAED,MAAI,CAACJ,KAAK,CAACG,MAAM,CAACC,UAAU,GAAGA,UAAU;MAC3C,CAAC,CAAC,CACDwB,KAAK,CAAC,UAACW,iBAAiB,EAAK;QAC5B7C,oBAAW,CAACC,MAAM,CAAC6C,IAAI,+DACkC,MAAI,CAACrD,IAAI,2CAAiCiB,UAAU,yBAAemC,iBAAiB,EAC5I;QAED,OAAO,iBAAQ1B,MAAM,CAAC0B,iBAAiB,CAAC;MAC1C,CAAC,CAAC;IACN;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EARE;IAAA;IAAA,OASA,sCAAoCK,KAAe,EAAErC,aAAuB,EAAE;MAC5Eb,oBAAW,CAACC,MAAM,CAACC,IAAI,8DACiC,IAAI,CAACT,IAAI,8CAAoCyD,KAAK,OACzG;MACD,IAAIA,KAAK,KAAKC,SAAS,EAAE;QACvB,IAAI,CAAC7C,KAAK,CAACG,MAAM,CAACC,UAAU,GAAGwC,KAAK;MACtC;MACA,IAAIrC,aAAa,KAAKsC,SAAS,EAAE;QAC/B,IAAI,CAAC7C,KAAK,CAACG,MAAM,CAACI,aAAa,GAAGA,aAAa;MACjD;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,yCAAuCnB,OAAgB,EAAE;MACvDM,oBAAW,CAACC,MAAM,CAACC,IAAI,iEACoC,IAAI,CAACT,IAAI,+DACnE;MAED,IAAI,CAACa,KAAK,CAACG,MAAM,CAACC,UAAU,GAAG,KAAK;MACpC,IAAI,CAACJ,KAAK,CAACC,MAAM,CAACC,SAAS,GAAG,KAAK;MAEnC,IAAI,IAAI,CAACS,oBAAoB,EAAE;QAC7B,IAAI,CAACA,oBAAoB,CACvB,IAAImC,KAAK,CAAC,+EAA+E,CAAC,CAC3F;QACD,IAAI,CAACpC,qBAAqB,GAAG,IAAI;QACjC,IAAI,CAACC,oBAAoB,GAAG,IAAI;MAClC;MAEA,IAAI,CAACI,uBAAuB,CAAC3B,OAAO,CAAC;MACrC,IAAI,CAAC6B,wBAAwB,CAAC7B,OAAO,CAAC;IACxC;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,mBAAiB;MACf,OACE,IAAI,CAACY,KAAK,CAACC,MAAM,CAACC,SAAS,IAAI,IAAI,CAACF,KAAK,CAACG,MAAM,CAACD,SAAS,IAAI,IAAI,CAACF,KAAK,CAACG,MAAM,CAACC,UAAU;IAE9F;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,2BAAyB;MACvB,OAAO,IAAI,CAACJ,KAAK,CAACG,MAAM,CAACC,UAAU;IACrC;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,2BAAyB;MACvB,OAAO,IAAI,CAACJ,KAAK,CAACG,MAAM,CAACI,aAAa;IACxC;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,0BAAwB;MACtB,OAAO,IAAI,CAACP,KAAK,CAACC,MAAM,CAACC,SAAS,IAAI,IAAI,CAACF,KAAK,CAACG,MAAM,CAACD,SAAS;IACnE;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,kBAAgB;MACd,OAAO,IAAI,CAACF,KAAK,CAACC,MAAM,CAACC,SAAS,IAAI,CAAC,IAAI,CAACF,KAAK,CAACG,MAAM,CAACC,UAAU;IACrE;;IAEA;EAAA;IAAA;IAAA,KACA,eAAY;MACV,OAAO,IAAI,CAAC2C,OAAO,EAAE;IACvB;;IAEA;EAAA;IAAA;IAAA,KACA,eAAW;MACT,OAAO,IAAI,CAACC,MAAM,EAAE;IACtB;EAAC;EAAA;AAAA"}