@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.131

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