@webex/plugin-meetings 3.0.0-beta.11 → 3.0.0-beta.111

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