@webex/plugin-meetings 3.0.0-beta.20 → 3.0.0-beta.201

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 (424) hide show
  1. package/README.md +45 -7
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +114 -14
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +3 -2
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +3 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +172 -30
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +319 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +107 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +355 -57
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/mediaSharesUtils.js +43 -1
  53. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  54. package/dist/locus-info/parser.js +219 -63
  55. package/dist/locus-info/parser.js.map +1 -1
  56. package/dist/locus-info/selfUtils.js +89 -14
  57. package/dist/locus-info/selfUtils.js.map +1 -1
  58. package/dist/media/index.js +48 -135
  59. package/dist/media/index.js.map +1 -1
  60. package/dist/media/properties.js +29 -90
  61. package/dist/media/properties.js.map +1 -1
  62. package/dist/mediaQualityMetrics/config.js +505 -493
  63. package/dist/mediaQualityMetrics/config.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +80 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +2692 -2544
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +291 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +229 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +196 -190
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/util.js +529 -414
  75. package/dist/meeting/util.js.map +1 -1
  76. package/dist/meeting-info/index.js +48 -7
  77. package/dist/meeting-info/index.js.map +1 -1
  78. package/dist/meeting-info/meeting-info-v2.js +171 -51
  79. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  80. package/dist/meeting-info/utilv2.js +20 -5
  81. package/dist/meeting-info/utilv2.js.map +1 -1
  82. package/dist/meetings/collection.js +22 -0
  83. package/dist/meetings/collection.js.map +1 -1
  84. package/dist/meetings/index.js +357 -66
  85. package/dist/meetings/index.js.map +1 -1
  86. package/dist/meetings/meetings.types.js +7 -0
  87. package/dist/meetings/meetings.types.js.map +1 -0
  88. package/dist/meetings/request.js +2 -0
  89. package/dist/meetings/request.js.map +1 -1
  90. package/dist/meetings/util.js +88 -1
  91. package/dist/meetings/util.js.map +1 -1
  92. package/dist/member/index.js +49 -0
  93. package/dist/member/index.js.map +1 -1
  94. package/dist/member/types.js +25 -0
  95. package/dist/member/types.js.map +1 -0
  96. package/dist/member/util.js +121 -25
  97. package/dist/member/util.js.map +1 -1
  98. package/dist/members/collection.js +10 -0
  99. package/dist/members/collection.js.map +1 -1
  100. package/dist/members/index.js +86 -5
  101. package/dist/members/index.js.map +1 -1
  102. package/dist/members/request.js +106 -38
  103. package/dist/members/request.js.map +1 -1
  104. package/dist/members/types.js +15 -0
  105. package/dist/members/types.js.map +1 -0
  106. package/dist/members/util.js +316 -233
  107. package/dist/members/util.js.map +1 -1
  108. package/dist/metrics/constants.js +3 -5
  109. package/dist/metrics/constants.js.map +1 -1
  110. package/dist/metrics/index.js +1 -468
  111. package/dist/metrics/index.js.map +1 -1
  112. package/dist/multistream/mediaRequestManager.js +238 -49
  113. package/dist/multistream/mediaRequestManager.js.map +1 -1
  114. package/dist/multistream/receiveSlot.js +49 -16
  115. package/dist/multistream/receiveSlot.js.map +1 -1
  116. package/dist/multistream/receiveSlotManager.js +52 -34
  117. package/dist/multistream/receiveSlotManager.js.map +1 -1
  118. package/dist/multistream/remoteMedia.js +44 -18
  119. package/dist/multistream/remoteMedia.js.map +1 -1
  120. package/dist/multistream/remoteMediaGroup.js +60 -3
  121. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  122. package/dist/multistream/remoteMediaManager.js +173 -59
  123. package/dist/multistream/remoteMediaManager.js.map +1 -1
  124. package/dist/networkQualityMonitor/index.js +4 -2
  125. package/dist/networkQualityMonitor/index.js.map +1 -1
  126. package/dist/reachability/index.js +72 -27
  127. package/dist/reachability/index.js.map +1 -1
  128. package/dist/reachability/request.js +12 -5
  129. package/dist/reachability/request.js.map +1 -1
  130. package/dist/reactions/reactions.js +2 -2
  131. package/dist/reactions/reactions.js.map +1 -1
  132. package/dist/reactions/reactions.type.js +18 -18
  133. package/dist/reactions/reactions.type.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +196 -155
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -1
  137. package/dist/recording-controller/index.js.map +1 -1
  138. package/dist/recording-controller/util.js +9 -8
  139. package/dist/recording-controller/util.js.map +1 -1
  140. package/dist/roap/index.js +21 -29
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +110 -89
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +93 -36
  145. package/dist/roap/turnDiscovery.js.map +1 -1
  146. package/dist/rtcMetrics/constants.js +12 -0
  147. package/dist/rtcMetrics/constants.js.map +1 -0
  148. package/dist/rtcMetrics/index.js +115 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/global.js +1 -93
  151. package/dist/statsAnalyzer/global.js.map +1 -1
  152. package/dist/statsAnalyzer/index.js +326 -311
  153. package/dist/statsAnalyzer/index.js.map +1 -1
  154. package/dist/statsAnalyzer/mqaUtil.js +90 -53
  155. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  156. package/dist/types/annotation/annotation.types.d.ts +42 -0
  157. package/dist/types/annotation/constants.d.ts +31 -0
  158. package/dist/types/annotation/index.d.ts +117 -0
  159. package/dist/types/breakouts/breakout.d.ts +8 -0
  160. package/dist/types/breakouts/collection.d.ts +5 -0
  161. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  162. package/dist/types/breakouts/events.d.ts +8 -0
  163. package/dist/types/breakouts/index.d.ts +5 -0
  164. package/dist/types/breakouts/request.d.ts +22 -0
  165. package/dist/types/breakouts/utils.d.ts +15 -0
  166. package/dist/types/common/browser-detection.d.ts +9 -0
  167. package/dist/types/common/collection.d.ts +48 -0
  168. package/dist/types/common/config.d.ts +2 -0
  169. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  170. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  171. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  172. package/dist/types/common/errors/media.d.ts +15 -0
  173. package/dist/types/common/errors/parameter.d.ts +15 -0
  174. package/dist/types/common/errors/password-error.d.ts +15 -0
  175. package/dist/types/common/errors/permission.d.ts +14 -0
  176. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  177. package/dist/types/common/errors/reconnection.d.ts +15 -0
  178. package/dist/types/common/errors/stats.d.ts +15 -0
  179. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  180. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  181. package/dist/types/common/events/events-scope.d.ts +17 -0
  182. package/dist/types/common/events/events.d.ts +12 -0
  183. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  184. package/dist/types/common/events/util.d.ts +2 -0
  185. package/dist/types/common/logs/logger-config.d.ts +2 -0
  186. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  187. package/dist/types/common/logs/request.d.ts +34 -0
  188. package/dist/types/common/queue.d.ts +34 -0
  189. package/dist/types/config.d.ts +72 -0
  190. package/dist/types/constants.d.ts +1016 -0
  191. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  192. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  193. package/dist/types/controls-options-manager/index.d.ts +136 -0
  194. package/dist/types/controls-options-manager/types.d.ts +43 -0
  195. package/dist/types/controls-options-manager/util.d.ts +1 -0
  196. package/dist/types/index.d.ts +7 -0
  197. package/dist/types/interpretation/collection.d.ts +5 -0
  198. package/dist/types/interpretation/index.d.ts +5 -0
  199. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  200. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  201. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  202. package/dist/types/locus-info/fullState.d.ts +2 -0
  203. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  204. package/dist/types/locus-info/index.d.ts +322 -0
  205. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  206. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  207. package/dist/types/locus-info/parser.d.ts +271 -0
  208. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  209. package/dist/types/media/index.d.ts +34 -0
  210. package/dist/types/media/properties.d.ts +93 -0
  211. package/dist/types/media/util.d.ts +2 -0
  212. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  213. package/dist/types/meeting/in-meeting-actions.d.ts +153 -0
  214. package/dist/types/meeting/index.d.ts +1471 -0
  215. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  216. package/dist/types/meeting/muteState.d.ts +184 -0
  217. package/dist/types/meeting/request.d.ts +257 -0
  218. package/dist/types/meeting/request.type.d.ts +11 -0
  219. package/dist/types/meeting/state.d.ts +9 -0
  220. package/dist/types/meeting/util.d.ts +78 -0
  221. package/dist/types/meeting-info/collection.d.ts +20 -0
  222. package/dist/types/meeting-info/index.d.ts +62 -0
  223. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  224. package/dist/types/meeting-info/request.d.ts +22 -0
  225. package/dist/types/meeting-info/util.d.ts +2 -0
  226. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  227. package/dist/types/meetings/collection.d.ts +31 -0
  228. package/dist/types/meetings/index.d.ts +367 -0
  229. package/dist/types/meetings/meetings.types.d.ts +4 -0
  230. package/dist/types/meetings/request.d.ts +27 -0
  231. package/dist/types/meetings/util.d.ts +18 -0
  232. package/dist/types/member/index.d.ts +159 -0
  233. package/dist/types/member/types.d.ts +32 -0
  234. package/dist/types/member/util.d.ts +2 -0
  235. package/dist/types/members/collection.d.ts +29 -0
  236. package/dist/types/members/index.d.ts +353 -0
  237. package/dist/types/members/request.d.ts +114 -0
  238. package/dist/types/members/types.d.ts +24 -0
  239. package/dist/types/members/util.d.ts +210 -0
  240. package/dist/types/metrics/constants.d.ts +55 -0
  241. package/dist/types/metrics/index.d.ts +45 -0
  242. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  243. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  244. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  245. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  246. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  247. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  248. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  249. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  250. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  251. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  252. package/dist/types/reachability/index.d.ts +152 -0
  253. package/dist/types/reachability/request.d.ts +37 -0
  254. package/dist/types/reactions/constants.d.ts +3 -0
  255. package/dist/types/reactions/reactions.d.ts +4 -0
  256. package/dist/types/reactions/reactions.type.d.ts +52 -0
  257. package/dist/types/reconnection-manager/index.d.ts +126 -0
  258. package/dist/types/recording-controller/enums.d.ts +7 -0
  259. package/dist/types/recording-controller/index.d.ts +208 -0
  260. package/dist/types/recording-controller/util.d.ts +14 -0
  261. package/dist/types/roap/index.d.ts +77 -0
  262. package/dist/types/roap/request.d.ts +36 -0
  263. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  264. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  265. package/dist/types/rtcMetrics/index.d.ts +46 -0
  266. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  267. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  268. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  269. package/dist/types/transcription/index.d.ts +64 -0
  270. package/package.json +25 -22
  271. package/src/annotation/annotation.types.ts +50 -0
  272. package/src/annotation/constants.ts +36 -0
  273. package/src/annotation/index.ts +328 -0
  274. package/src/breakouts/README.md +44 -14
  275. package/src/breakouts/breakout.ts +87 -9
  276. package/src/breakouts/edit-lock-error.ts +25 -0
  277. package/src/breakouts/events.ts +56 -0
  278. package/src/breakouts/index.ts +710 -10
  279. package/src/breakouts/request.ts +55 -0
  280. package/src/breakouts/utils.ts +57 -0
  281. package/src/common/errors/webex-errors.ts +6 -2
  282. package/src/common/logs/logger-proxy.ts +1 -1
  283. package/src/common/queue.ts +22 -8
  284. package/src/config.ts +2 -7
  285. package/src/constants.ts +157 -21
  286. package/src/controls-options-manager/constants.ts +5 -0
  287. package/src/controls-options-manager/enums.ts +18 -0
  288. package/src/controls-options-manager/index.ts +278 -0
  289. package/src/controls-options-manager/types.ts +59 -0
  290. package/src/controls-options-manager/util.ts +300 -0
  291. package/src/index.ts +39 -0
  292. package/src/interpretation/README.md +60 -0
  293. package/src/interpretation/collection.ts +19 -0
  294. package/src/interpretation/index.ts +332 -0
  295. package/src/interpretation/siLanguage.ts +18 -0
  296. package/src/locus-info/controlsUtils.ts +108 -0
  297. package/src/locus-info/index.ts +375 -52
  298. package/src/locus-info/mediaSharesUtils.ts +48 -0
  299. package/src/locus-info/parser.ts +224 -39
  300. package/src/locus-info/selfUtils.ts +81 -5
  301. package/src/media/index.ts +87 -140
  302. package/src/media/properties.ts +49 -90
  303. package/src/mediaQualityMetrics/config.ts +379 -377
  304. package/src/meeting/in-meeting-actions.ts +159 -3
  305. package/src/meeting/index.ts +1980 -2030
  306. package/src/meeting/locusMediaRequest.ts +309 -0
  307. package/src/meeting/muteState.ts +228 -132
  308. package/src/meeting/request.ts +102 -112
  309. package/src/meeting/util.ts +509 -397
  310. package/src/meeting-info/index.ts +54 -8
  311. package/src/meeting-info/meeting-info-v2.ts +148 -14
  312. package/src/meeting-info/utilv2.ts +13 -3
  313. package/src/meetings/collection.ts +20 -0
  314. package/src/meetings/index.ts +392 -84
  315. package/src/meetings/meetings.types.ts +12 -0
  316. package/src/meetings/request.ts +2 -0
  317. package/src/meetings/util.ts +103 -4
  318. package/src/member/index.ts +49 -0
  319. package/src/member/types.ts +38 -0
  320. package/src/member/util.ts +127 -25
  321. package/src/members/collection.ts +8 -0
  322. package/src/members/index.ts +107 -6
  323. package/src/members/request.ts +97 -17
  324. package/src/members/types.ts +28 -0
  325. package/src/members/util.ts +319 -240
  326. package/src/metrics/constants.ts +2 -4
  327. package/src/metrics/index.ts +1 -490
  328. package/src/multistream/mediaRequestManager.ts +289 -79
  329. package/src/multistream/receiveSlot.ts +55 -18
  330. package/src/multistream/receiveSlotManager.ts +46 -24
  331. package/src/multistream/remoteMedia.ts +27 -2
  332. package/src/multistream/remoteMediaGroup.ts +59 -0
  333. package/src/multistream/remoteMediaManager.ts +113 -32
  334. package/src/networkQualityMonitor/index.ts +6 -6
  335. package/src/reachability/index.ts +62 -15
  336. package/src/reachability/request.ts +10 -5
  337. package/src/reactions/reactions.ts +4 -4
  338. package/src/reactions/reactions.type.ts +3 -3
  339. package/src/reconnection-manager/index.ts +68 -43
  340. package/src/recording-controller/index.ts +20 -2
  341. package/src/recording-controller/util.ts +26 -9
  342. package/src/roap/index.ts +21 -30
  343. package/src/roap/request.ts +101 -95
  344. package/src/roap/turnDiscovery.ts +47 -25
  345. package/src/rtcMetrics/constants.ts +3 -0
  346. package/src/rtcMetrics/index.ts +96 -0
  347. package/src/statsAnalyzer/global.ts +1 -94
  348. package/src/statsAnalyzer/index.ts +376 -386
  349. package/src/statsAnalyzer/mqaUtil.ts +100 -99
  350. package/test/integration/spec/converged-space-meetings.js +233 -0
  351. package/test/integration/spec/journey.js +336 -259
  352. package/test/integration/spec/space-meeting.js +77 -4
  353. package/test/unit/spec/annotation/index.ts +418 -0
  354. package/test/unit/spec/breakouts/breakout.ts +142 -24
  355. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  356. package/test/unit/spec/breakouts/events.ts +89 -0
  357. package/test/unit/spec/breakouts/index.ts +1545 -48
  358. package/test/unit/spec/breakouts/request.ts +104 -0
  359. package/test/unit/spec/breakouts/utils.js +72 -0
  360. package/test/unit/spec/common/queue.js +31 -2
  361. package/test/unit/spec/controls-options-manager/index.js +287 -0
  362. package/test/unit/spec/controls-options-manager/util.js +582 -0
  363. package/test/unit/spec/fixture/locus.js +1 -0
  364. package/test/unit/spec/interpretation/collection.ts +15 -0
  365. package/test/unit/spec/interpretation/index.ts +589 -0
  366. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  367. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  368. package/test/unit/spec/locus-info/index.js +1094 -38
  369. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  370. package/test/unit/spec/locus-info/parser.js +62 -22
  371. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  372. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  373. package/test/unit/spec/media/index.ts +138 -28
  374. package/test/unit/spec/meeting/in-meeting-actions.ts +79 -3
  375. package/test/unit/spec/meeting/index.js +3092 -1571
  376. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  377. package/test/unit/spec/meeting/muteState.js +370 -208
  378. package/test/unit/spec/meeting/request.js +338 -43
  379. package/test/unit/spec/meeting/utils.js +449 -53
  380. package/test/unit/spec/meeting-info/index.js +181 -0
  381. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  382. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  383. package/test/unit/spec/meetings/collection.js +14 -0
  384. package/test/unit/spec/meetings/index.js +866 -124
  385. package/test/unit/spec/meetings/utils.js +206 -2
  386. package/test/unit/spec/member/index.js +58 -4
  387. package/test/unit/spec/member/util.js +479 -35
  388. package/test/unit/spec/members/index.js +319 -1
  389. package/test/unit/spec/members/request.js +206 -27
  390. package/test/unit/spec/members/utils.js +184 -0
  391. package/test/unit/spec/metrics/index.js +1 -50
  392. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  393. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  394. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  395. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  396. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  397. package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
  398. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  399. package/test/unit/spec/reachability/index.ts +125 -8
  400. package/test/unit/spec/reachability/request.js +66 -0
  401. package/test/unit/spec/reconnection-manager/index.js +59 -6
  402. package/test/unit/spec/recording-controller/index.js +294 -218
  403. package/test/unit/spec/recording-controller/util.js +223 -96
  404. package/test/unit/spec/roap/index.ts +26 -51
  405. package/test/unit/spec/roap/request.ts +196 -85
  406. package/test/unit/spec/roap/turnDiscovery.ts +30 -7
  407. package/test/unit/spec/rtcMetrics/index.ts +60 -0
  408. package/test/unit/spec/stats-analyzer/index.js +92 -41
  409. package/test/utils/constants.js +9 -0
  410. package/test/utils/integrationTestUtils.js +46 -0
  411. package/test/utils/testUtils.js +0 -45
  412. package/test/utils/webex-config.js +4 -0
  413. package/test/utils/webex-test-users.js +6 -3
  414. package/dist/meeting/effectsState.js +0 -262
  415. package/dist/meeting/effectsState.js.map +0 -1
  416. package/dist/metrics/config.js +0 -299
  417. package/dist/metrics/config.js.map +0 -1
  418. package/dist/multistream/multistreamMedia.js +0 -110
  419. package/dist/multistream/multistreamMedia.js.map +0 -1
  420. package/src/index.js +0 -15
  421. package/src/meeting/effectsState.ts +0 -211
  422. package/src/metrics/config.ts +0 -495
  423. package/src/multistream/multistreamMedia.ts +0 -97
  424. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -1,107 +1,166 @@
1
+ import {ServerMuteReason} from '@webex/media-helpers';
1
2
  import LoggerProxy from '../common/logs/logger-proxy';
2
3
  import ParameterError from '../common/errors/parameter';
3
- import PermissionError from '../common/errors/permission';
4
- import Media from '../media';
5
4
  import MeetingUtil from './util';
6
5
  import {AUDIO, VIDEO} from '../constants';
7
6
 
8
- /* Certain aspects of server interaction for video muting are not implemented as we currently don't support remote muting of video.
9
- If we ever need to support it, search for REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION string to find the places that need updating
10
- */
11
-
12
- const createMuteState = (type, meeting, mediaDirection) => {
13
- if (type === AUDIO && !mediaDirection.sendAudio) {
14
- return null;
15
- }
16
- if (type === VIDEO && !mediaDirection.sendVideo) {
17
- return null;
18
- }
7
+ // eslint-disable-next-line import/prefer-default-export
8
+ export const createMuteState = (type, meeting, enabled: boolean) => {
9
+ // todo: remove the meeting argument (SPARK-399695)
19
10
 
20
11
  LoggerProxy.logger.info(
21
12
  `Meeting:muteState#createMuteState --> ${type}: creating MuteState for meeting id ${meeting?.id}`
22
13
  );
23
14
 
24
- return new MuteState(type, meeting);
15
+ const muteState = new MuteState(type, meeting, enabled);
16
+
17
+ return muteState;
25
18
  };
26
19
 
27
20
  /** The purpose of this class is to manage the local and remote mute state and make sure that the server state always matches
28
21
  the last requested state by the client.
29
22
 
30
23
  More info about Locus muting API: https://sqbu-github.cisco.com/pages/WebExSquared/locus/guides/mute.html#
24
+
25
+ This class is exported only for unit tests. It should never be instantiated directly with new MuteState(), instead createMuteState() should be called
31
26
  */
32
- class MuteState {
33
- pendingPromiseReject: any;
34
- pendingPromiseResolve: any;
35
- state: any;
27
+ export class MuteState {
28
+ state: {
29
+ client: {
30
+ enabled: boolean; // indicates if audio/video is enabled at all or not
31
+ localMute: boolean;
32
+ };
33
+ server: {localMute: boolean; remoteMute: boolean; unmuteAllowed: boolean};
34
+ syncToServerInProgress: boolean;
35
+ };
36
+
36
37
  type: any;
38
+ ignoreMuteStateChange: boolean;
37
39
 
38
40
  /**
39
41
  * Constructor
40
42
  *
41
43
  * @param {String} type - audio or video
42
44
  * @param {Object} meeting - the meeting object (used for reading current remote mute status)
45
+ * @param {boolean} enabled - whether the client audio/video is enabled at all
43
46
  */
44
- constructor(type: string, meeting: any) {
47
+ constructor(type: string, meeting: any, enabled: boolean) {
45
48
  if (type !== AUDIO && type !== VIDEO) {
46
49
  throw new ParameterError('Mute state is designed for handling audio or video only');
47
50
  }
48
51
  this.type = type;
52
+ this.ignoreMuteStateChange = false;
49
53
  this.state = {
50
54
  client: {
51
- localMute: false,
55
+ enabled,
56
+ localMute: true,
52
57
  },
53
58
  server: {
54
- localMute: false,
55
- // initial values available only for audio (REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION)
56
- remoteMute: type === AUDIO ? meeting.remoteMuted : false,
57
- unmuteAllowed: type === AUDIO ? meeting.unmuteAllowed : true,
59
+ localMute: true,
60
+ // because remoteVideoMuted and unmuteVideoAllowed are updated seperately, they might be undefined
61
+ remoteMute: type === AUDIO ? meeting.remoteMuted : meeting.remoteVideoMuted ?? false,
62
+ unmuteAllowed: type === AUDIO ? meeting.unmuteAllowed : meeting.unmuteVideoAllowed ?? true,
58
63
  },
59
64
  syncToServerInProgress: false,
60
65
  };
61
- // these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call
62
- this.pendingPromiseResolve = null;
63
- this.pendingPromiseReject = null;
64
66
  }
65
67
 
66
68
  /**
67
- * Handles mute/unmute request from the client/user. Returns a promise that's resolved once the server update is completed or
68
- * at the point that this request becomese superseded by another client request.
69
+ * Starts the mute state machine. Needs to be called after a new MuteState instance is created.
69
70
  *
70
- * The client doesn't have to wait for the returned promise to resolve before calling handleClientRequest() again. If
71
- * handleClientRequest() is called again before the previous one resolved, the MuteState class will make sure that eventually
72
- * the server state will match the last requested state from the client.
71
+ * @param {Object} meeting - the meeting object
72
+ * @returns {void}
73
+ */
74
+ public init(meeting: any) {
75
+ this.applyUnmuteAllowedToTrack(meeting);
76
+
77
+ // if we are remotely muted, we need to apply that to the local track now (mute on-entry)
78
+ if (this.state.server.remoteMute) {
79
+ this.muteLocalTrack(meeting, this.state.server.remoteMute, 'remotelyMuted');
80
+ }
81
+
82
+ const initialMute =
83
+ this.type === AUDIO
84
+ ? meeting.mediaProperties.audioTrack?.muted
85
+ : meeting.mediaProperties.videoTrack?.muted;
86
+
87
+ LoggerProxy.logger.info(
88
+ `Meeting:muteState#init --> ${this.type}: local track initial mute state: ${initialMute}`
89
+ );
90
+
91
+ if (initialMute !== undefined) {
92
+ this.state.client.localMute = initialMute;
93
+ } else {
94
+ // there is no track, so it's like we are locally muted
95
+ // (this is important especially for transcoded meetings, in which the SDP m-line direction always stays "sendrecv")
96
+ this.state.client.localMute = true;
97
+ }
98
+ this.applyClientStateToServer(meeting);
99
+ }
100
+
101
+ /**
102
+ * This method needs to be called whenever the local audio/video track has changed.
103
+ * It reapplies the remote mute state onto the new track and also reads the current
104
+ * local mute state from the track and updates the internal state machine and sends
105
+ * any required requests to the server.
73
106
  *
107
+ * @param {Object} meeting - the meeting object
108
+ * @returns {void}
109
+ */
110
+ public handleLocalTrackChange(meeting: any) {
111
+ return this.init(meeting);
112
+ }
113
+
114
+ /**
115
+ * Enables/disables audio/video
116
+ *
117
+ * @param {Object} meeting - the meeting object
118
+ * @param {boolean} enable
119
+ * @returns {void}
120
+ */
121
+ public enable(meeting: any, enable: boolean) {
122
+ this.state.client.enabled = enable;
123
+
124
+ this.applyClientStateToServer(meeting);
125
+ }
126
+
127
+ /**
128
+ * Mutes/unmutes local track
129
+ *
130
+ * @param {Object} meeting - the meeting object
131
+ * @param {Boolean} mute - true to mute the track, false to unmute it
132
+ * @param {ServerMuteReason} reason - reason for muting/unmuting
133
+ * @returns {void}
134
+ */
135
+ private muteLocalTrack(meeting: any, mute: boolean, reason: ServerMuteReason) {
136
+ this.ignoreMuteStateChange = true;
137
+ if (this.type === AUDIO) {
138
+ meeting.mediaProperties.audioTrack?.setServerMuted(mute, reason);
139
+ } else {
140
+ meeting.mediaProperties.videoTrack?.setServerMuted(mute, reason);
141
+ }
142
+ this.ignoreMuteStateChange = false;
143
+ }
144
+
145
+ /**
146
+ * This method should be called when the local track mute state is changed
74
147
  * @public
75
148
  * @memberof MuteState
76
149
  * @param {Object} [meeting] the meeting object
77
150
  * @param {Boolean} [mute] true for muting, false for unmuting request
78
- * @returns {Promise}
151
+ * @returns {void}
79
152
  */
80
- public handleClientRequest(meeting?: object, mute?: boolean) {
153
+ public handleLocalTrackMuteStateChange(meeting?: object, mute?: boolean) {
154
+ if (this.ignoreMuteStateChange) {
155
+ return;
156
+ }
81
157
  LoggerProxy.logger.info(
82
- `Meeting:muteState#handleClientRequest --> ${this.type}: user requesting new mute state: ${mute}`
158
+ `Meeting:muteState#handleLocalTrackMuteStateChange --> ${this.type}: local track new mute state: ${mute}`
83
159
  );
84
160
 
85
- if (!mute && !this.state.server.unmuteAllowed) {
86
- return Promise.reject(
87
- new PermissionError('User is not allowed to unmute self (hard mute feature is being used)')
88
- );
89
- }
90
-
91
- // 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,
92
- // because the client may have changed the audio/vidoe tracks
93
161
  this.state.client.localMute = mute;
94
- this.applyClientStateLocally(meeting);
95
-
96
- return new Promise((resolve, reject) => {
97
- if (this.pendingPromiseResolve) {
98
- // resolve the last promise we returned to the client as the client has issued a new request that has superseded the previous one
99
- this.pendingPromiseResolve();
100
- }
101
- this.pendingPromiseResolve = resolve;
102
- this.pendingPromiseReject = reject;
103
- this.applyClientStateToServer(meeting);
104
- });
162
+
163
+ this.applyClientStateToServer(meeting);
105
164
  }
106
165
 
107
166
  /**
@@ -109,14 +168,21 @@ class MuteState {
109
168
  *
110
169
  * @public
111
170
  * @param {Object} [meeting] the meeting object
171
+ * @param {ServerMuteReason} reason - reason why we're applying our client state to the local track
112
172
  * @memberof MuteState
113
173
  * @returns {void}
114
174
  */
115
- public applyClientStateLocally(meeting?: any) {
116
- Media.setLocalTrack(
117
- !this.state.client.localMute,
118
- this.type === AUDIO ? meeting.mediaProperties.audioTrack : meeting.mediaProperties.videoTrack
119
- );
175
+ public applyClientStateLocally(meeting?: any, reason?: ServerMuteReason) {
176
+ this.muteLocalTrack(meeting, this.state.client.localMute, reason);
177
+ }
178
+
179
+ /** Returns true if client is locally muted - it takes into account not just the client local mute state,
180
+ * but also whether audio/video is enabled at all
181
+ *
182
+ * @returns {boolean}
183
+ */
184
+ private getClientLocalMuteState() {
185
+ return this.state.client.enabled ? this.state.client.localMute : true;
120
186
  }
121
187
 
122
188
  /**
@@ -127,7 +193,7 @@ class MuteState {
127
193
  * @memberof MuteState
128
194
  * @returns {void}
129
195
  */
130
- private applyClientStateToServer(meeting?: object) {
196
+ private applyClientStateToServer(meeting?: any) {
131
197
  if (this.state.syncToServerInProgress) {
132
198
  LoggerProxy.logger.info(
133
199
  `Meeting:muteState#applyClientStateToServer --> ${this.type}: request to server in progress, we need to wait for it to complete`
@@ -136,11 +202,12 @@ class MuteState {
136
202
  return;
137
203
  }
138
204
 
139
- const localMuteRequiresSync = this.state.client.localMute !== this.state.server.localMute;
140
- const remoteMuteRequiresSync = !this.state.client.localMute && this.state.server.remoteMute;
205
+ const localMuteState = this.getClientLocalMuteState();
206
+ const localMuteRequiresSync = localMuteState !== this.state.server.localMute;
207
+ const remoteMuteRequiresSync = !localMuteState && this.state.server.remoteMute;
141
208
 
142
209
  LoggerProxy.logger.info(
143
- `Meeting:muteState#applyClientStateToServer --> ${this.type}: localMuteRequiresSync: ${localMuteRequiresSync} (${this.state.client.localMute} ?= ${this.state.server.localMute})`
210
+ `Meeting:muteState#applyClientStateToServer --> ${this.type}: localMuteRequiresSync: ${localMuteRequiresSync} (${localMuteState} ?= ${this.state.server.localMute})`
144
211
  );
145
212
  LoggerProxy.logger.info(
146
213
  `Meeting:muteState#applyClientStateToServer --> ${this.type}: remoteMuteRequiresSync: ${remoteMuteRequiresSync}`
@@ -151,12 +218,6 @@ class MuteState {
151
218
  `Meeting:muteState#applyClientStateToServer --> ${this.type}: client state already matching server state, nothing to do`
152
219
  );
153
220
 
154
- if (this.pendingPromiseResolve) {
155
- this.pendingPromiseResolve();
156
- }
157
- this.pendingPromiseResolve = null;
158
- this.pendingPromiseReject = null;
159
-
160
221
  return;
161
222
  }
162
223
 
@@ -184,11 +245,11 @@ class MuteState {
184
245
  .catch((e) => {
185
246
  this.state.syncToServerInProgress = false;
186
247
 
187
- if (this.pendingPromiseReject) {
188
- this.pendingPromiseReject(e);
189
- }
190
- this.pendingPromiseResolve = null;
191
- this.pendingPromiseReject = null;
248
+ LoggerProxy.logger.warn(
249
+ `Meeting:muteState#applyClientStateToServer --> ${this.type}: error: ${e}`
250
+ );
251
+
252
+ this.applyServerMuteToLocalTrack(meeting, 'clientRequestFailed');
192
253
  });
193
254
  }
194
255
 
@@ -201,16 +262,14 @@ class MuteState {
201
262
  * @returns {Promise}
202
263
  */
203
264
  private sendLocalMuteRequestToServer(meeting?: any) {
204
- const audioMuted =
205
- this.type === AUDIO ? this.state.client.localMute : meeting.audio?.state.client.localMute;
206
- const videoMuted =
207
- this.type === VIDEO ? this.state.client.localMute : meeting.video?.state.client.localMute;
265
+ const audioMuted = this.type === AUDIO ? this.getClientLocalMuteState() : undefined;
266
+ const videoMuted = this.type === VIDEO ? this.getClientLocalMuteState() : undefined;
208
267
 
209
268
  LoggerProxy.logger.info(
210
269
  `Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: sending local mute (audio=${audioMuted}, video=${videoMuted}) to server`
211
270
  );
212
271
 
213
- return MeetingUtil.remoteUpdateAudioVideo(audioMuted, videoMuted, meeting)
272
+ return MeetingUtil.remoteUpdateAudioVideo(meeting, audioMuted, videoMuted)
214
273
  .then((locus) => {
215
274
  LoggerProxy.logger.info(
216
275
  `Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: local mute (audio=${audioMuted}, video=${videoMuted}) applied to server`
@@ -218,7 +277,9 @@ class MuteState {
218
277
 
219
278
  this.state.server.localMute = this.type === AUDIO ? audioMuted : videoMuted;
220
279
 
221
- meeting.locusInfo.onFullLocus(locus);
280
+ if (locus) {
281
+ meeting.locusInfo.handleLocusDelta(locus, meeting);
282
+ }
222
283
 
223
284
  return locus;
224
285
  })
@@ -240,35 +301,53 @@ class MuteState {
240
301
  * @returns {Promise}
241
302
  */
242
303
  private sendRemoteMuteRequestToServer(meeting?: any) {
243
- if (this.type === AUDIO) {
244
- const remoteMute = this.state.client.localMute;
304
+ const remoteMute = this.getClientLocalMuteState();
245
305
 
246
- LoggerProxy.logger.info(
247
- `Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: sending remote mute:${remoteMute} to server`
248
- );
306
+ LoggerProxy.logger.info(
307
+ `Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: sending remote mute:${remoteMute} to server`
308
+ );
249
309
 
250
- return meeting.members
251
- .muteMember(meeting.members.selfId, remoteMute)
252
- .then(() => {
253
- LoggerProxy.logger.info(
254
- `Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: remote mute:${remoteMute} applied to server`
255
- );
256
-
257
- this.state.server.remoteMute = remoteMute;
258
- })
259
- .catch((remoteUpdateError) => {
260
- LoggerProxy.logger.warn(
261
- `Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: failed to apply remote mute ${remoteMute} to server: ${remoteUpdateError}`
262
- );
263
-
264
- return Promise.reject(remoteUpdateError);
265
- });
266
- }
310
+ return meeting.members
311
+ .muteMember(meeting.members.selfId, remoteMute, this.type === AUDIO)
312
+ .then(() => {
313
+ LoggerProxy.logger.info(
314
+ `Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: remote mute:${remoteMute} applied to server`
315
+ );
267
316
 
268
- // for now we don't need to support remote muting of video (REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION)
269
- this.state.server.remoteMute = this.state.client.localMute;
317
+ this.state.server.remoteMute = remoteMute;
318
+ })
319
+ .catch((remoteUpdateError) => {
320
+ LoggerProxy.logger.warn(
321
+ `Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: failed to apply remote mute ${remoteMute} to server: ${remoteUpdateError}`
322
+ );
323
+
324
+ return Promise.reject(remoteUpdateError);
325
+ });
326
+ }
327
+
328
+ /** Sets the mute state of the local track according to what server thinks is our state
329
+ * @param {Object} meeting - the meeting object
330
+ * @param {ServerMuteReason} serverMuteReason - reason why we're applying server mute to the local track
331
+ * @returns {void}
332
+ */
333
+ private applyServerMuteToLocalTrack(meeting: any, serverMuteReason: ServerMuteReason) {
334
+ const muted = this.state.server.localMute || this.state.server.remoteMute;
270
335
 
271
- return Promise.resolve();
336
+ // update the local track mute state, but not this.state.client.localMute
337
+ this.muteLocalTrack(meeting, muted, serverMuteReason);
338
+ }
339
+
340
+ /** Applies the current value for unmute allowed to the underlying track
341
+ *
342
+ * @param {Meeting} meeting
343
+ * @returns {void}
344
+ */
345
+ private applyUnmuteAllowedToTrack(meeting: any) {
346
+ if (this.type === AUDIO) {
347
+ meeting.mediaProperties.audioTrack?.setUnmuteAllowed(this.state.server.unmuteAllowed);
348
+ } else {
349
+ meeting.mediaProperties.videoTrack?.setUnmuteAllowed(this.state.server.unmuteAllowed);
350
+ }
272
351
  }
273
352
 
274
353
  /**
@@ -276,16 +355,23 @@ class MuteState {
276
355
  *
277
356
  * @public
278
357
  * @memberof MuteState
358
+ * @param {Meeting} meeting
279
359
  * @param {Boolean} [muted] true if user is remotely muted, false otherwise
280
360
  * @param {Boolean} [unmuteAllowed] indicates if user is allowed to unmute self (false when "hard mute" feature is used)
281
361
  * @returns {undefined}
282
362
  */
283
- public handleServerRemoteMuteUpdate(muted?: boolean, unmuteAllowed?: boolean) {
363
+ public handleServerRemoteMuteUpdate(meeting: any, muted?: boolean, unmuteAllowed?: boolean) {
284
364
  LoggerProxy.logger.info(
285
365
  `Meeting:muteState#handleServerRemoteMuteUpdate --> ${this.type}: updating server remoteMute to (${muted})`
286
366
  );
287
- this.state.server.remoteMute = muted;
288
- this.state.server.unmuteAllowed = unmuteAllowed;
367
+ if (unmuteAllowed !== undefined) {
368
+ this.state.server.unmuteAllowed = unmuteAllowed;
369
+ this.applyUnmuteAllowedToTrack(meeting);
370
+ }
371
+ if (muted !== undefined) {
372
+ this.state.server.remoteMute = muted;
373
+ this.applyServerMuteToLocalTrack(meeting, 'remotelyMuted');
374
+ }
289
375
  }
290
376
 
291
377
  /**
@@ -297,27 +383,27 @@ class MuteState {
297
383
  * @returns {undefined}
298
384
  */
299
385
  public handleServerLocalUnmuteRequired(meeting?: object) {
300
- LoggerProxy.logger.info(
301
- `Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received -> doing local unmute`
302
- );
386
+ if (!this.state.client.enabled) {
387
+ LoggerProxy.logger.warn(
388
+ `Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received while ${this.type} is disabled -> local unmute will not result in ${this.type} being sent`
389
+ );
390
+ } else {
391
+ LoggerProxy.logger.info(
392
+ `Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received -> doing local unmute`
393
+ );
394
+ }
303
395
 
396
+ // todo: I'm seeing "you can now unmute yourself " popup when this happens - but same thing happens on web.w.c so we can ignore for now
304
397
  this.state.server.remoteMute = false;
305
398
  this.state.client.localMute = false;
306
399
 
307
- if (this.pendingPromiseReject) {
308
- this.pendingPromiseReject(
309
- new Error('Server requested local unmute - this overrides any client request in progress')
310
- );
311
- this.pendingPromiseResolve = null;
312
- this.pendingPromiseReject = null;
313
- }
314
-
315
- this.applyClientStateLocally(meeting);
400
+ this.applyClientStateLocally(meeting, 'localUnmuteRequired');
316
401
  this.applyClientStateToServer(meeting);
317
402
  }
318
403
 
319
404
  /**
320
- * Returns true if the user is locally or remotely muted
405
+ * Returns true if the user is locally or remotely muted.
406
+ * It only checks the mute status, ignoring the fact whether audio/video is enabled.
321
407
  *
322
408
  * @public
323
409
  * @memberof MuteState
@@ -330,25 +416,35 @@ class MuteState {
330
416
  }
331
417
 
332
418
  /**
333
- * Returns true if the user is muted as a result of the client request (and not remotely muted)
419
+ * Returns true if the user is remotely muted
334
420
  *
335
421
  * @public
336
422
  * @memberof MuteState
337
423
  * @returns {Boolean}
338
424
  */
339
- public isSelf() {
340
- return this.state.client.localMute && !this.state.server.remoteMute;
425
+ public isRemotelyMuted() {
426
+ return this.state.server.remoteMute;
341
427
  }
342
428
 
343
- // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes
344
- get muted() {
345
- return this.isMuted();
429
+ /**
430
+ * Returns true if unmute is allowed
431
+ *
432
+ * @public
433
+ * @memberof MuteState
434
+ * @returns {Boolean}
435
+ */
436
+ public isUnmuteAllowed() {
437
+ return this.state.server.unmuteAllowed;
346
438
  }
347
439
 
348
- // defined for backwards compatibility with the old AudioStateMachine/VideoStateMachine classes
349
- get self() {
350
- return this.isSelf();
440
+ /**
441
+ * Returns true if the user is locally muted or audio/video is disabled
442
+ *
443
+ * @public
444
+ * @memberof MuteState
445
+ * @returns {Boolean}
446
+ */
447
+ public isLocallyMuted() {
448
+ return this.getClientLocalMuteState();
351
449
  }
352
450
  }
353
-
354
- export default createMuteState;