@webex/plugin-meetings 2.60.0 → 2.60.1-next.10

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