@webex/plugin-meetings 3.0.0-beta.22 → 3.0.0-beta.221

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