@webex/plugin-meetings 3.0.0-beta.4 → 3.0.0-beta.40

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 (498) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +137 -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 +546 -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 +48 -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 +109 -49
  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 +15 -0
  68. package/dist/controls-options-manager/enums.js.map +1 -0
  69. package/dist/controls-options-manager/index.js +203 -0
  70. package/dist/controls-options-manager/index.js.map +1 -0
  71. package/dist/controls-options-manager/util.js +28 -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 +12 -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 +186 -192
  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 +34 -91
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.js +66 -153
  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 +13 -14
  102. package/dist/meeting/in-meeting-actions.js.map +1 -1
  103. package/dist/meeting/index.js +2141 -2210
  104. package/dist/meeting/index.js.map +1 -1
  105. package/dist/meeting/muteState.js +59 -82
  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 +45 -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 +5 -20
  128. package/dist/meetings/collection.js.map +1 -1
  129. package/dist/meetings/index.js +490 -560
  130. package/dist/meetings/index.js.map +1 -1
  131. package/dist/meetings/request.js +24 -41
  132. package/dist/meetings/request.js.map +1 -1
  133. package/dist/meetings/util.js +116 -155
  134. package/dist/meetings/util.js.map +1 -1
  135. package/dist/member/index.js +78 -86
  136. package/dist/member/index.js.map +1 -1
  137. package/dist/member/util.js +31 -68
  138. package/dist/member/util.js.map +1 -1
  139. package/dist/members/collection.js +3 -12
  140. package/dist/members/collection.js.map +1 -1
  141. package/dist/members/index.js +95 -200
  142. package/dist/members/index.js.map +1 -1
  143. package/dist/members/request.js +16 -39
  144. package/dist/members/request.js.map +1 -1
  145. package/dist/members/util.js +9 -38
  146. package/dist/members/util.js.map +1 -1
  147. package/dist/metrics/config.js +1 -13
  148. package/dist/metrics/config.js.map +1 -1
  149. package/dist/metrics/constants.js +1 -6
  150. package/dist/metrics/constants.js.map +1 -1
  151. package/dist/metrics/index.js +54 -156
  152. package/dist/metrics/index.js.map +1 -1
  153. package/dist/multistream/mediaRequestManager.js +74 -52
  154. package/dist/multistream/mediaRequestManager.js.map +1 -1
  155. package/dist/multistream/receiveSlot.js +48 -65
  156. package/dist/multistream/receiveSlot.js.map +1 -1
  157. package/dist/multistream/receiveSlotManager.js +60 -82
  158. package/dist/multistream/receiveSlotManager.js.map +1 -1
  159. package/dist/multistream/remoteMedia.js +60 -76
  160. package/dist/multistream/remoteMedia.js.map +1 -1
  161. package/dist/multistream/remoteMediaGroup.js +6 -40
  162. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  163. package/dist/multistream/remoteMediaManager.js +360 -413
  164. package/dist/multistream/remoteMediaManager.js.map +1 -1
  165. package/dist/networkQualityMonitor/index.js +40 -59
  166. package/dist/networkQualityMonitor/index.js.map +1 -1
  167. package/dist/personal-meeting-room/index.js +21 -45
  168. package/dist/personal-meeting-room/index.js.map +1 -1
  169. package/dist/personal-meeting-room/request.js +1 -31
  170. package/dist/personal-meeting-room/request.js.map +1 -1
  171. package/dist/personal-meeting-room/util.js +0 -13
  172. package/dist/personal-meeting-room/util.js.map +1 -1
  173. package/dist/reachability/index.js +147 -183
  174. package/dist/reachability/index.js.map +1 -1
  175. package/dist/reachability/request.js +15 -23
  176. package/dist/reachability/request.js.map +1 -1
  177. package/dist/reactions/constants.js +13 -0
  178. package/dist/reactions/constants.js.map +1 -0
  179. package/dist/reactions/reactions.js +109 -0
  180. package/dist/reactions/reactions.js.map +1 -0
  181. package/dist/reactions/reactions.type.js +36 -0
  182. package/dist/reactions/reactions.type.js.map +1 -0
  183. package/dist/reconnection-manager/index.js +322 -456
  184. package/dist/reconnection-manager/index.js.map +1 -1
  185. package/dist/recording-controller/enums.js +17 -0
  186. package/dist/recording-controller/enums.js.map +1 -0
  187. package/dist/recording-controller/index.js +343 -0
  188. package/dist/recording-controller/index.js.map +1 -0
  189. package/dist/recording-controller/util.js +63 -0
  190. package/dist/recording-controller/util.js.map +1 -0
  191. package/dist/roap/index.js +48 -70
  192. package/dist/roap/index.js.map +1 -1
  193. package/dist/roap/request.js +143 -131
  194. package/dist/roap/request.js.map +1 -1
  195. package/dist/roap/turnDiscovery.js +91 -98
  196. package/dist/roap/turnDiscovery.js.map +1 -1
  197. package/dist/statsAnalyzer/global.js +1 -95
  198. package/dist/statsAnalyzer/global.js.map +1 -1
  199. package/dist/statsAnalyzer/index.js +361 -449
  200. package/dist/statsAnalyzer/index.js.map +1 -1
  201. package/dist/statsAnalyzer/mqaUtil.js +137 -81
  202. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  203. package/dist/transcription/index.js +22 -47
  204. package/dist/transcription/index.js.map +1 -1
  205. package/dist/types/breakouts/breakout.d.ts +8 -0
  206. package/dist/types/breakouts/collection.d.ts +5 -0
  207. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  208. package/dist/types/breakouts/index.d.ts +5 -0
  209. package/dist/types/breakouts/request.d.ts +22 -0
  210. package/dist/types/breakouts/utils.d.ts +8 -0
  211. package/dist/types/common/browser-detection.d.ts +9 -0
  212. package/dist/types/common/collection.d.ts +48 -0
  213. package/dist/types/common/config.d.ts +2 -0
  214. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  215. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  216. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  217. package/dist/types/common/errors/media.d.ts +15 -0
  218. package/dist/types/common/errors/parameter.d.ts +15 -0
  219. package/dist/types/common/errors/password-error.d.ts +15 -0
  220. package/dist/types/common/errors/permission.d.ts +14 -0
  221. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  222. package/dist/types/common/errors/reconnection.d.ts +15 -0
  223. package/dist/types/common/errors/stats.d.ts +15 -0
  224. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  225. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  226. package/dist/types/common/events/events-scope.d.ts +17 -0
  227. package/dist/types/common/events/events.d.ts +12 -0
  228. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  229. package/dist/types/common/events/util.d.ts +2 -0
  230. package/dist/types/common/logs/logger-config.d.ts +2 -0
  231. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  232. package/dist/types/common/logs/request.d.ts +34 -0
  233. package/dist/types/common/queue.d.ts +32 -0
  234. package/dist/types/config.d.ts +77 -0
  235. package/dist/types/constants.d.ts +916 -0
  236. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  237. package/dist/types/controls-options-manager/enums.d.ts +5 -0
  238. package/dist/types/controls-options-manager/index.d.ts +120 -0
  239. package/dist/types/controls-options-manager/util.d.ts +7 -0
  240. package/dist/types/index.d.ts +6 -0
  241. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  242. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  243. package/dist/types/locus-info/fullState.d.ts +2 -0
  244. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  245. package/dist/types/locus-info/index.d.ts +269 -0
  246. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  247. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  248. package/dist/types/locus-info/parser.d.ts +212 -0
  249. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  250. package/dist/types/media/index.d.ts +32 -0
  251. package/dist/types/media/properties.d.ts +108 -0
  252. package/dist/types/media/util.d.ts +2 -0
  253. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  254. package/dist/types/meeting/in-meeting-actions.d.ts +83 -0
  255. package/dist/types/meeting/index.d.ts +1699 -0
  256. package/dist/types/meeting/muteState.d.ts +116 -0
  257. package/dist/types/meeting/request.d.ts +271 -0
  258. package/dist/types/meeting/request.type.d.ts +11 -0
  259. package/dist/types/meeting/state.d.ts +9 -0
  260. package/dist/types/meeting/util.d.ts +2 -0
  261. package/dist/types/meeting-info/collection.d.ts +20 -0
  262. package/dist/types/meeting-info/index.d.ts +57 -0
  263. package/dist/types/meeting-info/meeting-info-v2.d.ts +93 -0
  264. package/dist/types/meeting-info/request.d.ts +22 -0
  265. package/dist/types/meeting-info/util.d.ts +2 -0
  266. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  267. package/dist/types/meetings/collection.d.ts +23 -0
  268. package/dist/types/meetings/index.d.ts +297 -0
  269. package/dist/types/meetings/request.d.ts +27 -0
  270. package/dist/types/meetings/util.d.ts +18 -0
  271. package/dist/types/member/index.d.ts +146 -0
  272. package/dist/types/member/util.d.ts +2 -0
  273. package/dist/types/members/collection.d.ts +24 -0
  274. package/dist/types/members/index.d.ts +320 -0
  275. package/dist/types/members/request.d.ts +50 -0
  276. package/dist/types/members/util.d.ts +2 -0
  277. package/dist/types/metrics/config.d.ts +169 -0
  278. package/dist/types/metrics/constants.d.ts +53 -0
  279. package/dist/types/metrics/index.d.ts +152 -0
  280. package/dist/types/multistream/mediaRequestManager.d.ts +51 -0
  281. package/dist/types/multistream/receiveSlot.d.ts +64 -0
  282. package/dist/types/multistream/receiveSlotManager.d.ts +46 -0
  283. package/dist/types/multistream/remoteMedia.d.ts +100 -0
  284. package/dist/types/multistream/remoteMediaGroup.d.ts +56 -0
  285. package/dist/types/multistream/remoteMediaManager.d.ts +241 -0
  286. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  287. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  288. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  289. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  290. package/dist/types/reachability/index.d.ts +140 -0
  291. package/dist/types/reachability/request.d.ts +37 -0
  292. package/dist/types/reactions/constants.d.ts +3 -0
  293. package/dist/types/reactions/reactions.d.ts +4 -0
  294. package/dist/types/reactions/reactions.type.d.ts +52 -0
  295. package/dist/types/reconnection-manager/index.d.ts +117 -0
  296. package/dist/types/recording-controller/enums.d.ts +7 -0
  297. package/dist/types/recording-controller/index.d.ts +193 -0
  298. package/dist/types/recording-controller/util.d.ts +13 -0
  299. package/dist/types/roap/index.d.ts +77 -0
  300. package/dist/types/roap/request.d.ts +38 -0
  301. package/dist/types/roap/turnDiscovery.d.ts +74 -0
  302. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  303. package/dist/types/statsAnalyzer/index.d.ts +195 -0
  304. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  305. package/dist/types/transcription/index.d.ts +64 -0
  306. package/internal-README.md +7 -6
  307. package/package.json +27 -21
  308. package/src/breakouts/README.md +199 -0
  309. package/src/breakouts/breakout.ts +130 -0
  310. package/src/breakouts/collection.ts +19 -0
  311. package/src/breakouts/edit-lock-error.ts +25 -0
  312. package/src/breakouts/index.ts +504 -0
  313. package/src/breakouts/request.ts +55 -0
  314. package/src/breakouts/utils.ts +39 -0
  315. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  316. package/src/common/collection.ts +9 -7
  317. package/src/common/{config.js → config.ts} +1 -1
  318. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  319. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  320. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  321. package/src/common/errors/{media.js → media.ts} +11 -7
  322. package/src/common/errors/parameter.ts +11 -7
  323. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  324. package/src/common/errors/{permission.js → permission.ts} +10 -6
  325. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  326. package/src/common/errors/{stats.js → stats.ts} +11 -7
  327. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  328. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  329. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  330. package/src/common/events/{events.js → events.ts} +5 -1
  331. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  332. package/src/common/events/{util.js → util.ts} +2 -3
  333. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  334. package/src/common/logs/logger-proxy.ts +44 -0
  335. package/src/common/logs/{request.js → request.ts} +22 -9
  336. package/src/common/queue.ts +1 -2
  337. package/src/{config.js → config.ts} +17 -12
  338. package/src/constants.ts +62 -5
  339. package/src/controls-options-manager/constants.ts +5 -0
  340. package/src/controls-options-manager/enums.ts +6 -0
  341. package/src/controls-options-manager/index.ts +183 -0
  342. package/src/controls-options-manager/util.ts +20 -0
  343. package/src/index.js +4 -1
  344. package/src/locus-info/controlsUtils.ts +114 -0
  345. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  346. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  347. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  348. package/src/locus-info/{index.js → index.ts} +150 -66
  349. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  350. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  351. package/src/locus-info/{parser.js → parser.ts} +67 -79
  352. package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
  353. package/src/media/{index.js → index.ts} +182 -173
  354. package/src/media/{properties.js → properties.ts} +60 -37
  355. package/src/media/{util.js → util.ts} +2 -2
  356. package/src/mediaQualityMetrics/config.ts +384 -0
  357. package/src/meeting/in-meeting-actions.ts +31 -3
  358. package/src/meeting/{index.js → index.ts} +2512 -1579
  359. package/src/meeting/{muteState.js → muteState.ts} +95 -49
  360. package/src/meeting/{request.js → request.ts} +326 -142
  361. package/src/meeting/request.type.ts +13 -0
  362. package/src/meeting/{state.js → state.ts} +50 -35
  363. package/src/meeting/{util.js → util.ts} +117 -119
  364. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  365. package/src/meeting-info/{index.js → index.ts} +42 -36
  366. package/src/meeting-info/meeting-info-v2.ts +273 -0
  367. package/src/meeting-info/{request.js → request.ts} +14 -4
  368. package/src/meeting-info/{util.js → util.ts} +60 -51
  369. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  370. package/src/meetings/{collection.js → collection.ts} +6 -3
  371. package/src/meetings/index.ts +1159 -0
  372. package/src/meetings/{request.js → request.ts} +32 -25
  373. package/src/meetings/{util.js → util.ts} +58 -32
  374. package/src/member/{index.js → index.ts} +102 -56
  375. package/src/member/{util.js → util.ts} +52 -25
  376. package/src/members/{collection.js → collection.ts} +2 -2
  377. package/src/members/{index.js → index.ts} +221 -142
  378. package/src/members/{request.js → request.ts} +60 -16
  379. package/src/members/{util.js → util.ts} +50 -48
  380. package/src/metrics/{config.js → config.ts} +253 -92
  381. package/src/metrics/{constants.js → constants.ts} +0 -6
  382. package/src/metrics/{index.js → index.ts} +105 -94
  383. package/src/multistream/mediaRequestManager.ts +101 -39
  384. package/src/multistream/receiveSlot.ts +62 -26
  385. package/src/multistream/receiveSlotManager.ts +35 -21
  386. package/src/multistream/remoteMedia.ts +38 -5
  387. package/src/multistream/remoteMediaGroup.ts +4 -3
  388. package/src/multistream/remoteMediaManager.ts +152 -36
  389. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  390. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  391. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  392. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  393. package/src/reachability/{index.js → index.ts} +109 -85
  394. package/src/reachability/request.ts +46 -35
  395. package/src/reactions/constants.ts +4 -0
  396. package/src/reactions/reactions.ts +104 -0
  397. package/src/reactions/reactions.type.ts +62 -0
  398. package/src/reconnection-manager/{index.js → index.ts} +196 -103
  399. package/src/recording-controller/enums.ts +8 -0
  400. package/src/recording-controller/index.ts +315 -0
  401. package/src/recording-controller/util.ts +58 -0
  402. package/src/roap/{index.js → index.ts} +77 -60
  403. package/src/roap/request.ts +172 -0
  404. package/src/roap/turnDiscovery.ts +81 -41
  405. package/src/statsAnalyzer/global.ts +37 -0
  406. package/src/statsAnalyzer/index.ts +1234 -0
  407. package/src/statsAnalyzer/mqaUtil.ts +293 -0
  408. package/src/transcription/{index.js → index.ts} +46 -39
  409. package/test/integration/spec/converged-space-meetings.js +176 -0
  410. package/test/integration/spec/journey.js +665 -464
  411. package/test/integration/spec/space-meeting.js +320 -206
  412. package/test/integration/spec/transcription.js +7 -8
  413. package/test/unit/spec/breakouts/breakout.ts +147 -0
  414. package/test/unit/spec/breakouts/collection.ts +15 -0
  415. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  416. package/test/unit/spec/breakouts/index.ts +707 -0
  417. package/test/unit/spec/breakouts/request.ts +104 -0
  418. package/test/unit/spec/breakouts/utils.js +47 -0
  419. package/test/unit/spec/common/browser-detection.js +9 -28
  420. package/test/unit/spec/controls-options-manager/index.js +124 -0
  421. package/test/unit/spec/controls-options-manager/util.js +66 -0
  422. package/test/unit/spec/fixture/locus.js +92 -90
  423. package/test/unit/spec/locus-info/controlsUtils.js +25 -5
  424. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  425. package/test/unit/spec/locus-info/index.js +104 -2
  426. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  427. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  428. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  429. package/test/unit/spec/locus-info/parser.js +3 -9
  430. package/test/unit/spec/locus-info/selfConstant.js +97 -103
  431. package/test/unit/spec/locus-info/selfUtils.js +105 -12
  432. package/test/unit/spec/media/index.ts +39 -53
  433. package/test/unit/spec/media/properties.ts +9 -9
  434. package/test/unit/spec/meeting/in-meeting-actions.ts +13 -2
  435. package/test/unit/spec/meeting/index.js +2253 -811
  436. package/test/unit/spec/meeting/muteState.js +74 -55
  437. package/test/unit/spec/meeting/request.js +141 -43
  438. package/test/unit/spec/meeting/utils.js +106 -171
  439. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  440. package/test/unit/spec/meeting-info/request.js +7 -9
  441. package/test/unit/spec/meeting-info/util.js +11 -12
  442. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  443. package/test/unit/spec/meetings/collection.js +1 -1
  444. package/test/unit/spec/meetings/index.js +439 -257
  445. package/test/unit/spec/meetings/utils.js +14 -12
  446. package/test/unit/spec/member/index.js +0 -1
  447. package/test/unit/spec/member/util.js +31 -7
  448. package/test/unit/spec/members/index.js +104 -54
  449. package/test/unit/spec/members/request.js +29 -20
  450. package/test/unit/spec/members/utils.js +8 -5
  451. package/test/unit/spec/metrics/index.js +16 -21
  452. package/test/unit/spec/multistream/mediaRequestManager.ts +318 -64
  453. package/test/unit/spec/multistream/receiveSlot.ts +68 -17
  454. package/test/unit/spec/multistream/receiveSlotManager.ts +41 -13
  455. package/test/unit/spec/multistream/remoteMedia.ts +38 -2
  456. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  457. package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
  458. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  459. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  460. package/test/unit/spec/reachability/index.ts +70 -27
  461. package/test/unit/spec/reachability/request.js +66 -0
  462. package/test/unit/spec/reconnection-manager/index.js +58 -30
  463. package/test/unit/spec/recording-controller/index.js +231 -0
  464. package/test/unit/spec/recording-controller/util.js +102 -0
  465. package/test/unit/spec/roap/index.ts +12 -8
  466. package/test/unit/spec/roap/request.ts +217 -0
  467. package/test/unit/spec/roap/turnDiscovery.ts +72 -49
  468. package/test/unit/spec/stats-analyzer/index.js +86 -57
  469. package/test/utils/cmr.js +44 -42
  470. package/test/utils/constants.js +9 -0
  471. package/test/utils/testUtils.js +98 -77
  472. package/test/utils/webex-config.js +22 -18
  473. package/test/utils/webex-test-users.js +57 -50
  474. package/tsconfig.json +6 -0
  475. package/dist/media/internal-media-core-wrapper.js +0 -22
  476. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  477. package/dist/meeting/effectsState.js +0 -327
  478. package/dist/meeting/effectsState.js.map +0 -1
  479. package/dist/multistream/multistreamMedia.js +0 -116
  480. package/dist/multistream/multistreamMedia.js.map +0 -1
  481. package/dist/peer-connection-manager/util.js +0 -124
  482. package/dist/peer-connection-manager/util.js.map +0 -1
  483. package/src/common/logs/logger-proxy.js +0 -33
  484. package/src/locus-info/controlsUtils.js +0 -102
  485. package/src/media/internal-media-core-wrapper.ts +0 -9
  486. package/src/mediaQualityMetrics/config.js +0 -382
  487. package/src/meeting/effectsState.js +0 -205
  488. package/src/meeting-info/meeting-info-v2.js +0 -255
  489. package/src/meetings/index.js +0 -1015
  490. package/src/multistream/multistreamMedia.ts +0 -92
  491. package/src/peer-connection-manager/util.ts +0 -117
  492. package/src/roap/request.js +0 -127
  493. package/src/statsAnalyzer/global.js +0 -133
  494. package/src/statsAnalyzer/index.js +0 -1006
  495. package/src/statsAnalyzer/mqaUtil.js +0 -173
  496. package/test/unit/spec/meeting/effectsState.js +0 -291
  497. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  498. /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
@@ -60,11 +46,13 @@ var MuteState = /*#__PURE__*/function () {
60
46
  */
61
47
  function MuteState(type, meeting) {
62
48
  (0, _classCallCheck2.default)(this, MuteState);
63
-
49
+ (0, _defineProperty2.default)(this, "pendingPromiseReject", void 0);
50
+ (0, _defineProperty2.default)(this, "pendingPromiseResolve", void 0);
51
+ (0, _defineProperty2.default)(this, "state", void 0);
52
+ (0, _defineProperty2.default)(this, "type", void 0);
64
53
  if (type !== _constants.AUDIO && type !== _constants.VIDEO) {
65
54
  throw new _parameter.default('Mute state is designed for handling audio or video only');
66
55
  }
67
-
68
56
  this.type = type;
69
57
  this.state = {
70
58
  client: {
@@ -77,11 +65,12 @@ var MuteState = /*#__PURE__*/function () {
77
65
  unmuteAllowed: type === _constants.AUDIO ? meeting.unmuteAllowed : true
78
66
  },
79
67
  syncToServerInProgress: false
80
- }; // these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call
81
-
68
+ };
69
+ // these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call
82
70
  this.pendingPromiseResolve = null;
83
71
  this.pendingPromiseReject = null;
84
72
  }
73
+
85
74
  /**
86
75
  * Handles mute/unmute request from the client/user. Returns a promise that's resolved once the server update is completed or
87
76
  * at the point that this request becomese superseded by another client request.
@@ -96,21 +85,17 @@ var MuteState = /*#__PURE__*/function () {
96
85
  * @param {Boolean} [mute] true for muting, false for unmuting request
97
86
  * @returns {Promise}
98
87
  */
99
-
100
-
101
88
  (0, _createClass2.default)(MuteState, [{
102
89
  key: "handleClientRequest",
103
90
  value: function handleClientRequest(meeting, mute) {
104
91
  var _this = this;
105
-
106
92
  _loggerProxy.default.logger.info("Meeting:muteState#handleClientRequest --> ".concat(this.type, ": user requesting new mute state: ").concat(mute));
107
-
108
93
  if (!mute && !this.state.server.unmuteAllowed) {
109
94
  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
-
95
+ }
113
96
 
97
+ // 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,
98
+ // because the client may have changed the audio/vidoe tracks
114
99
  this.state.client.localMute = mute;
115
100
  this.applyClientStateLocally(meeting);
116
101
  return new _promise.default(function (resolve, reject) {
@@ -118,13 +103,12 @@ var MuteState = /*#__PURE__*/function () {
118
103
  // resolve the last promise we returned to the client as the client has issued a new request that has superseded the previous one
119
104
  _this.pendingPromiseResolve();
120
105
  }
121
-
122
106
  _this.pendingPromiseResolve = resolve;
123
107
  _this.pendingPromiseReject = reject;
124
-
125
108
  _this.applyClientStateToServer(meeting);
126
109
  });
127
110
  }
111
+
128
112
  /**
129
113
  * Applies the current mute state to the local track (by enabling or disabling it accordingly)
130
114
  *
@@ -133,12 +117,18 @@ var MuteState = /*#__PURE__*/function () {
133
117
  * @memberof MuteState
134
118
  * @returns {void}
135
119
  */
136
-
137
120
  }, {
138
121
  key: "applyClientStateLocally",
139
122
  value: function applyClientStateLocally(meeting) {
140
- _media.default.setLocalTrack(!this.state.client.localMute, this.type === _constants.AUDIO ? meeting.mediaProperties.audioTrack : meeting.mediaProperties.videoTrack);
123
+ if (this.type === _constants.AUDIO) {
124
+ var _meeting$mediaPropert;
125
+ (_meeting$mediaPropert = meeting.mediaProperties.audioTrack) === null || _meeting$mediaPropert === void 0 ? void 0 : _meeting$mediaPropert.setMuted(this.state.client.localMute);
126
+ } else {
127
+ var _meeting$mediaPropert2;
128
+ (_meeting$mediaPropert2 = meeting.mediaProperties.videoTrack) === null || _meeting$mediaPropert2 === void 0 ? void 0 : _meeting$mediaPropert2.setMuted(this.state.client.localMute);
129
+ }
141
130
  }
131
+
142
132
  /**
143
133
  * Updates the server local and remote mute values so that they match the current client desired state.
144
134
  *
@@ -147,62 +137,52 @@ var MuteState = /*#__PURE__*/function () {
147
137
  * @memberof MuteState
148
138
  * @returns {void}
149
139
  */
150
-
151
140
  }, {
152
141
  key: "applyClientStateToServer",
153
142
  value: function applyClientStateToServer(meeting) {
154
143
  var _this2 = this;
155
-
156
144
  if (this.state.syncToServerInProgress) {
157
145
  _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
146
  return;
160
147
  }
161
-
162
148
  var localMuteRequiresSync = this.state.client.localMute !== this.state.server.localMute;
163
149
  var remoteMuteRequiresSync = !this.state.client.localMute && this.state.server.remoteMute;
164
-
165
150
  _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
151
  _loggerProxy.default.logger.info("Meeting:muteState#applyClientStateToServer --> ".concat(this.type, ": remoteMuteRequiresSync: ").concat(remoteMuteRequiresSync));
168
-
169
152
  if (!localMuteRequiresSync && !remoteMuteRequiresSync) {
170
153
  _loggerProxy.default.logger.info("Meeting:muteState#applyClientStateToServer --> ".concat(this.type, ": client state already matching server state, nothing to do"));
171
-
172
154
  if (this.pendingPromiseResolve) {
173
155
  this.pendingPromiseResolve();
174
156
  }
175
-
176
157
  this.pendingPromiseResolve = null;
177
158
  this.pendingPromiseReject = null;
178
159
  return;
179
160
  }
161
+ this.state.syncToServerInProgress = true;
180
162
 
181
- this.state.syncToServerInProgress = true; // first sync local mute with server
182
-
163
+ // first sync local mute with server
183
164
  var localMuteSyncPromise = localMuteRequiresSync ? this.sendLocalMuteRequestToServer(meeting) : _promise.default.resolve();
184
165
  localMuteSyncPromise.then(function () {
185
- return (// then follow it up with remote mute sync
166
+ return (
167
+ // then follow it up with remote mute sync
186
168
  remoteMuteRequiresSync ? _this2.sendRemoteMuteRequestToServer(meeting) : _promise.default.resolve()
187
169
  );
188
170
  }).then(function () {
189
171
  _this2.state.syncToServerInProgress = false;
172
+ _loggerProxy.default.logger.info("Meeting:muteState#applyClientStateToServer --> ".concat(_this2.type, ": sync with server completed"));
190
173
 
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
-
174
+ // need to check if a new sync is required, because this.state.client may have changed while we were doing the current sync
194
175
  _this2.applyClientStateToServer(meeting);
195
176
  }).catch(function (e) {
196
177
  _this2.state.syncToServerInProgress = false;
197
-
198
178
  if (_this2.pendingPromiseReject) {
199
179
  _this2.pendingPromiseReject(e);
200
180
  }
201
-
202
181
  _this2.pendingPromiseResolve = null;
203
182
  _this2.pendingPromiseReject = null;
204
183
  });
205
184
  }
185
+
206
186
  /**
207
187
  * Sets the local mute value in the server
208
188
  *
@@ -211,31 +191,26 @@ var MuteState = /*#__PURE__*/function () {
211
191
  * @memberof MuteState
212
192
  * @returns {Promise}
213
193
  */
214
-
215
194
  }, {
216
195
  key: "sendLocalMuteRequestToServer",
217
196
  value: function sendLocalMuteRequestToServer(meeting) {
218
197
  var _meeting$audio,
219
- _meeting$video,
220
- _this3 = this;
221
-
198
+ _meeting$video,
199
+ _this3 = this;
222
200
  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
201
  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
202
  _loggerProxy.default.logger.info("Meeting:muteState#sendLocalMuteRequestToServer --> ".concat(this.type, ": sending local mute (audio=").concat(audioMuted, ", video=").concat(videoMuted, ") to server"));
226
-
227
203
  return _util.default.remoteUpdateAudioVideo(audioMuted, videoMuted, meeting).then(function (locus) {
228
204
  _loggerProxy.default.logger.info("Meeting:muteState#sendLocalMuteRequestToServer --> ".concat(_this3.type, ": local mute (audio=").concat(audioMuted, ", video=").concat(videoMuted, ") applied to server"));
229
-
230
205
  _this3.state.server.localMute = _this3.type === _constants.AUDIO ? audioMuted : videoMuted;
231
206
  meeting.locusInfo.onFullLocus(locus);
232
207
  return locus;
233
208
  }).catch(function (remoteUpdateError) {
234
209
  _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
210
  return _promise.default.reject(remoteUpdateError);
237
211
  });
238
212
  }
213
+
239
214
  /**
240
215
  * Sets the remote mute value in the server
241
216
  *
@@ -244,32 +219,27 @@ var MuteState = /*#__PURE__*/function () {
244
219
  * @memberof MuteState
245
220
  * @returns {Promise}
246
221
  */
247
-
248
222
  }, {
249
223
  key: "sendRemoteMuteRequestToServer",
250
224
  value: function sendRemoteMuteRequestToServer(meeting) {
251
225
  var _this4 = this;
252
-
253
226
  if (this.type === _constants.AUDIO) {
254
227
  var remoteMute = this.state.client.localMute;
255
-
256
228
  _loggerProxy.default.logger.info("Meeting:muteState#sendRemoteMuteRequestToServer --> ".concat(this.type, ": sending remote mute:").concat(remoteMute, " to server"));
257
-
258
229
  return meeting.members.muteMember(meeting.members.selfId, remoteMute).then(function () {
259
230
  _loggerProxy.default.logger.info("Meeting:muteState#sendRemoteMuteRequestToServer --> ".concat(_this4.type, ": remote mute:").concat(remoteMute, " applied to server"));
260
-
261
231
  _this4.state.server.remoteMute = remoteMute;
262
232
  }).catch(function (remoteUpdateError) {
263
233
  _loggerProxy.default.logger.warn("Meeting:muteState#sendRemoteMuteRequestToServer --> ".concat(_this4.type, ": failed to apply remote mute ").concat(remoteMute, " to server: ").concat(remoteUpdateError));
264
-
265
234
  return _promise.default.reject(remoteUpdateError);
266
235
  });
267
- } // for now we don't need to support remote muting of video (REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION)
268
-
236
+ }
269
237
 
238
+ // for now we don't need to support remote muting of video (REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION)
270
239
  this.state.server.remoteMute = this.state.client.localMute;
271
240
  return _promise.default.resolve();
272
241
  }
242
+
273
243
  /**
274
244
  * This method should be called whenever the server remote mute state is changed
275
245
  *
@@ -279,15 +249,14 @@ var MuteState = /*#__PURE__*/function () {
279
249
  * @param {Boolean} [unmuteAllowed] indicates if user is allowed to unmute self (false when "hard mute" feature is used)
280
250
  * @returns {undefined}
281
251
  */
282
-
283
252
  }, {
284
253
  key: "handleServerRemoteMuteUpdate",
285
254
  value: function handleServerRemoteMuteUpdate(muted, unmuteAllowed) {
286
255
  _loggerProxy.default.logger.info("Meeting:muteState#handleServerRemoteMuteUpdate --> ".concat(this.type, ": updating server remoteMute to (").concat(muted, ")"));
287
-
288
256
  this.state.server.remoteMute = muted;
289
257
  this.state.server.unmuteAllowed = unmuteAllowed;
290
258
  }
259
+
291
260
  /**
292
261
  * This method should be called whenever we receive from the server a requirement to locally unmute
293
262
  *
@@ -296,24 +265,21 @@ var MuteState = /*#__PURE__*/function () {
296
265
  * @param {Object} [meeting] the meeting object
297
266
  * @returns {undefined}
298
267
  */
299
-
300
268
  }, {
301
269
  key: "handleServerLocalUnmuteRequired",
302
270
  value: function handleServerLocalUnmuteRequired(meeting) {
303
271
  _loggerProxy.default.logger.info("Meeting:muteState#handleServerLocalUnmuteRequired --> ".concat(this.type, ": localAudioUnmuteRequired received -> doing local unmute"));
304
-
305
272
  this.state.server.remoteMute = false;
306
273
  this.state.client.localMute = false;
307
-
308
274
  if (this.pendingPromiseReject) {
309
275
  this.pendingPromiseReject(new Error('Server requested local unmute - this overrides any client request in progress'));
310
276
  this.pendingPromiseResolve = null;
311
277
  this.pendingPromiseReject = null;
312
278
  }
313
-
314
279
  this.applyClientStateLocally(meeting);
315
280
  this.applyClientStateToServer(meeting);
316
281
  }
282
+
317
283
  /**
318
284
  * Returns true if the user is locally or remotely muted
319
285
  *
@@ -321,32 +287,46 @@ var MuteState = /*#__PURE__*/function () {
321
287
  * @memberof MuteState
322
288
  * @returns {Boolean}
323
289
  */
324
-
325
290
  }, {
326
291
  key: "isMuted",
327
292
  value: function isMuted() {
328
293
  return this.state.client.localMute || this.state.server.localMute || this.state.server.remoteMute;
329
294
  }
295
+
330
296
  /**
331
- * Returns true if the user is muted as a result of the client request (and not remotely muted)
297
+ * Returns true if the user is locally muted
332
298
  *
333
299
  * @public
334
300
  * @memberof MuteState
335
301
  * @returns {Boolean}
336
302
  */
303
+ }, {
304
+ key: "isLocallyMuted",
305
+ value: function isLocallyMuted() {
306
+ return this.state.client.localMute || this.state.server.localMute;
307
+ }
337
308
 
309
+ /**
310
+ * Returns true if the user is muted as a result of the client request (and not remotely muted)
311
+ *
312
+ * @public
313
+ * @memberof MuteState
314
+ * @returns {Boolean}
315
+ */
338
316
  }, {
339
317
  key: "isSelf",
340
318
  value: function isSelf() {
341
319
  return this.state.client.localMute && !this.state.server.remoteMute;
342
- } // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes
320
+ }
343
321
 
322
+ // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes
344
323
  }, {
345
324
  key: "muted",
346
325
  get: function get() {
347
326
  return this.isMuted();
348
- } // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes
327
+ }
349
328
 
329
+ // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes
350
330
  }, {
351
331
  key: "self",
352
332
  get: function get() {
@@ -355,7 +335,4 @@ var MuteState = /*#__PURE__*/function () {
355
335
  }]);
356
336
  return MuteState;
357
337
  }();
358
-
359
- var _default = createMuteState;
360
- exports.default = _default;
361
338
  //# 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":"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"}
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","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","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 // 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 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 if (this.type === AUDIO) {\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)\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 public handleServerRemoteMuteUpdate(muted?: boolean, unmuteAllowed?: boolean) {\n LoggerProxy.logger.info(\n `Meeting:muteState#handleServerRemoteMuteUpdate --> ${this.type}: updating server remoteMute to (${muted})`\n );\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 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 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":"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"}