@webex/plugin-meetings 3.0.0-beta.26 → 3.0.0-beta.261

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 (361) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +114 -14
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +28 -7
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +5 -10
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +196 -28
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/enums.js +14 -2
  31. package/dist/controls-options-manager/enums.js.map +1 -1
  32. package/dist/controls-options-manager/index.js +109 -15
  33. package/dist/controls-options-manager/index.js.map +1 -1
  34. package/dist/controls-options-manager/types.js +7 -0
  35. package/dist/controls-options-manager/types.js.map +1 -0
  36. package/dist/controls-options-manager/util.js +309 -18
  37. package/dist/controls-options-manager/util.js.map +1 -1
  38. package/dist/index.js +112 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/interpretation/collection.js +23 -0
  41. package/dist/interpretation/collection.js.map +1 -0
  42. package/dist/interpretation/index.js +366 -0
  43. package/dist/interpretation/index.js.map +1 -0
  44. package/dist/interpretation/siLanguage.js +25 -0
  45. package/dist/interpretation/siLanguage.js.map +1 -0
  46. package/dist/locus-info/controlsUtils.js +91 -2
  47. package/dist/locus-info/controlsUtils.js.map +1 -1
  48. package/dist/locus-info/index.js +381 -62
  49. package/dist/locus-info/index.js.map +1 -1
  50. package/dist/locus-info/infoUtils.js +7 -1
  51. package/dist/locus-info/infoUtils.js.map +1 -1
  52. package/dist/locus-info/mediaSharesUtils.js +43 -1
  53. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  54. package/dist/locus-info/parser.js +224 -63
  55. package/dist/locus-info/parser.js.map +1 -1
  56. package/dist/locus-info/selfUtils.js +89 -14
  57. package/dist/locus-info/selfUtils.js.map +1 -1
  58. package/dist/media/index.js +58 -116
  59. package/dist/media/index.js.map +1 -1
  60. package/dist/media/properties.js +60 -121
  61. package/dist/media/properties.js.map +1 -1
  62. package/dist/meeting/in-meeting-actions.js +82 -2
  63. package/dist/meeting/in-meeting-actions.js.map +1 -1
  64. package/dist/meeting/index.js +3022 -2795
  65. package/dist/meeting/index.js.map +1 -1
  66. package/dist/meeting/locusMediaRequest.js +292 -0
  67. package/dist/meeting/locusMediaRequest.js.map +1 -0
  68. package/dist/meeting/muteState.js +230 -124
  69. package/dist/meeting/muteState.js.map +1 -1
  70. package/dist/meeting/request.js +256 -196
  71. package/dist/meeting/request.js.map +1 -1
  72. package/dist/meeting/util.js +601 -417
  73. package/dist/meeting/util.js.map +1 -1
  74. package/dist/meeting-info/index.js +70 -7
  75. package/dist/meeting-info/index.js.map +1 -1
  76. package/dist/meeting-info/meeting-info-v2.js +189 -51
  77. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  78. package/dist/meeting-info/util.js +1 -1
  79. package/dist/meeting-info/util.js.map +1 -1
  80. package/dist/meeting-info/utilv2.js +36 -36
  81. package/dist/meeting-info/utilv2.js.map +1 -1
  82. package/dist/meetings/collection.js +22 -0
  83. package/dist/meetings/collection.js.map +1 -1
  84. package/dist/meetings/index.js +372 -90
  85. package/dist/meetings/index.js.map +1 -1
  86. package/dist/meetings/meetings.types.js +7 -0
  87. package/dist/meetings/meetings.types.js.map +1 -0
  88. package/dist/meetings/request.js +2 -0
  89. package/dist/meetings/request.js.map +1 -1
  90. package/dist/meetings/util.js +88 -1
  91. package/dist/meetings/util.js.map +1 -1
  92. package/dist/member/index.js +49 -0
  93. package/dist/member/index.js.map +1 -1
  94. package/dist/member/types.js +25 -0
  95. package/dist/member/types.js.map +1 -0
  96. package/dist/member/util.js +121 -25
  97. package/dist/member/util.js.map +1 -1
  98. package/dist/members/collection.js +10 -0
  99. package/dist/members/collection.js.map +1 -1
  100. package/dist/members/index.js +86 -5
  101. package/dist/members/index.js.map +1 -1
  102. package/dist/members/request.js +106 -38
  103. package/dist/members/request.js.map +1 -1
  104. package/dist/members/types.js +15 -0
  105. package/dist/members/types.js.map +1 -0
  106. package/dist/members/util.js +316 -233
  107. package/dist/members/util.js.map +1 -1
  108. package/dist/metrics/constants.js +10 -5
  109. package/dist/metrics/constants.js.map +1 -1
  110. package/dist/metrics/index.js +1 -468
  111. package/dist/metrics/index.js.map +1 -1
  112. package/dist/multistream/mediaRequestManager.js +238 -49
  113. package/dist/multistream/mediaRequestManager.js.map +1 -1
  114. package/dist/multistream/receiveSlot.js +49 -16
  115. package/dist/multistream/receiveSlot.js.map +1 -1
  116. package/dist/multistream/receiveSlotManager.js +52 -34
  117. package/dist/multistream/receiveSlotManager.js.map +1 -1
  118. package/dist/multistream/remoteMedia.js +44 -18
  119. package/dist/multistream/remoteMedia.js.map +1 -1
  120. package/dist/multistream/remoteMediaGroup.js +60 -3
  121. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  122. package/dist/multistream/remoteMediaManager.js +209 -59
  123. package/dist/multistream/remoteMediaManager.js.map +1 -1
  124. package/dist/multistream/sendSlotManager.js +233 -0
  125. package/dist/multistream/sendSlotManager.js.map +1 -0
  126. package/dist/reachability/index.js +161 -57
  127. package/dist/reachability/index.js.map +1 -1
  128. package/dist/reachability/request.js +17 -8
  129. package/dist/reachability/request.js.map +1 -1
  130. package/dist/reconnection-manager/index.js +199 -154
  131. package/dist/reconnection-manager/index.js.map +1 -1
  132. package/dist/recording-controller/index.js +21 -2
  133. package/dist/recording-controller/index.js.map +1 -1
  134. package/dist/recording-controller/util.js +9 -8
  135. package/dist/recording-controller/util.js.map +1 -1
  136. package/dist/roap/index.js +23 -29
  137. package/dist/roap/index.js.map +1 -1
  138. package/dist/roap/request.js +112 -97
  139. package/dist/roap/request.js.map +1 -1
  140. package/dist/roap/turnDiscovery.js +96 -36
  141. package/dist/roap/turnDiscovery.js.map +1 -1
  142. package/dist/rtcMetrics/constants.js +12 -0
  143. package/dist/rtcMetrics/constants.js.map +1 -0
  144. package/dist/rtcMetrics/index.js +117 -0
  145. package/dist/rtcMetrics/index.js.map +1 -0
  146. package/dist/statsAnalyzer/index.js +51 -34
  147. package/dist/statsAnalyzer/index.js.map +1 -1
  148. package/dist/statsAnalyzer/mqaUtil.js +6 -6
  149. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  150. package/dist/types/annotation/annotation.types.d.ts +42 -0
  151. package/dist/types/annotation/constants.d.ts +31 -0
  152. package/dist/types/annotation/index.d.ts +117 -0
  153. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  154. package/dist/types/breakouts/events.d.ts +8 -0
  155. package/dist/types/breakouts/request.d.ts +22 -0
  156. package/dist/types/breakouts/utils.d.ts +15 -0
  157. package/dist/types/common/errors/webex-errors.d.ts +13 -1
  158. package/dist/types/common/queue.d.ts +9 -7
  159. package/dist/types/config.d.ts +1 -6
  160. package/dist/types/constants.d.ts +155 -21
  161. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  162. package/dist/types/controls-options-manager/index.d.ts +17 -1
  163. package/dist/types/controls-options-manager/types.d.ts +43 -0
  164. package/dist/types/controls-options-manager/util.d.ts +1 -7
  165. package/dist/types/index.d.ts +6 -4
  166. package/dist/types/interpretation/collection.d.ts +5 -0
  167. package/dist/types/interpretation/index.d.ts +5 -0
  168. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  169. package/dist/types/locus-info/index.d.ts +57 -4
  170. package/dist/types/locus-info/parser.d.ts +65 -6
  171. package/dist/types/media/index.d.ts +2 -0
  172. package/dist/types/media/properties.d.ts +34 -48
  173. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  174. package/dist/types/meeting/index.d.ts +344 -506
  175. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  176. package/dist/types/meeting/muteState.d.ts +99 -23
  177. package/dist/types/meeting/request.d.ts +72 -43
  178. package/dist/types/meeting/util.d.ts +101 -1
  179. package/dist/types/meeting-info/index.d.ts +13 -1
  180. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  181. package/dist/types/meetings/collection.d.ts +8 -0
  182. package/dist/types/meetings/index.d.ts +86 -12
  183. package/dist/types/meetings/meetings.types.d.ts +4 -0
  184. package/dist/types/member/index.d.ts +13 -0
  185. package/dist/types/member/types.d.ts +32 -0
  186. package/dist/types/members/collection.d.ts +5 -0
  187. package/dist/types/members/index.d.ts +35 -2
  188. package/dist/types/members/request.d.ts +73 -9
  189. package/dist/types/members/types.d.ts +24 -0
  190. package/dist/types/members/util.d.ts +209 -1
  191. package/dist/types/metrics/constants.d.ts +9 -4
  192. package/dist/types/metrics/index.d.ts +4 -119
  193. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  194. package/dist/types/multistream/receiveSlot.d.ts +16 -12
  195. package/dist/types/multistream/receiveSlotManager.d.ts +19 -4
  196. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  197. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  198. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  199. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  200. package/dist/types/reachability/index.d.ts +44 -7
  201. package/dist/types/reachability/request.d.ts +7 -3
  202. package/dist/types/reconnection-manager/index.d.ts +9 -0
  203. package/dist/types/recording-controller/index.d.ts +15 -1
  204. package/dist/types/recording-controller/util.d.ts +5 -4
  205. package/dist/types/roap/request.d.ts +15 -11
  206. package/dist/types/roap/turnDiscovery.d.ts +18 -1
  207. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  208. package/dist/types/rtcMetrics/index.d.ts +47 -0
  209. package/dist/types/statsAnalyzer/index.d.ts +6 -1
  210. package/package.json +23 -20
  211. package/src/annotation/annotation.types.ts +50 -0
  212. package/src/annotation/constants.ts +36 -0
  213. package/src/annotation/index.ts +328 -0
  214. package/src/breakouts/README.md +44 -14
  215. package/src/breakouts/breakout.ts +87 -9
  216. package/src/breakouts/edit-lock-error.ts +25 -0
  217. package/src/breakouts/events.ts +56 -0
  218. package/src/breakouts/index.ts +710 -10
  219. package/src/breakouts/request.ts +55 -0
  220. package/src/breakouts/utils.ts +57 -0
  221. package/src/common/errors/webex-errors.ts +27 -2
  222. package/src/common/logs/logger-proxy.ts +1 -1
  223. package/src/common/queue.ts +22 -8
  224. package/src/config.ts +4 -9
  225. package/src/constants.ts +178 -18
  226. package/src/controls-options-manager/enums.ts +12 -0
  227. package/src/controls-options-manager/index.ts +116 -21
  228. package/src/controls-options-manager/types.ts +59 -0
  229. package/src/controls-options-manager/util.ts +294 -14
  230. package/src/index.ts +40 -0
  231. package/src/interpretation/README.md +60 -0
  232. package/src/interpretation/collection.ts +19 -0
  233. package/src/interpretation/index.ts +332 -0
  234. package/src/interpretation/siLanguage.ts +18 -0
  235. package/src/locus-info/controlsUtils.ts +108 -0
  236. package/src/locus-info/index.ts +412 -59
  237. package/src/locus-info/infoUtils.ts +10 -2
  238. package/src/locus-info/mediaSharesUtils.ts +48 -0
  239. package/src/locus-info/parser.ts +231 -39
  240. package/src/locus-info/selfUtils.ts +81 -5
  241. package/src/media/index.ts +100 -122
  242. package/src/media/properties.ts +70 -108
  243. package/src/meeting/in-meeting-actions.ts +163 -3
  244. package/src/meeting/index.ts +2471 -2306
  245. package/src/meeting/locusMediaRequest.ts +313 -0
  246. package/src/meeting/muteState.ts +229 -131
  247. package/src/meeting/request.ts +172 -121
  248. package/src/meeting/util.ts +588 -394
  249. package/src/meeting-info/index.ts +79 -8
  250. package/src/meeting-info/meeting-info-v2.ts +168 -14
  251. package/src/meeting-info/util.ts +1 -1
  252. package/src/meeting-info/utilv2.ts +23 -23
  253. package/src/meetings/collection.ts +20 -0
  254. package/src/meetings/index.ts +414 -108
  255. package/src/meetings/meetings.types.ts +12 -0
  256. package/src/meetings/request.ts +2 -0
  257. package/src/meetings/util.ts +103 -4
  258. package/src/member/index.ts +49 -0
  259. package/src/member/types.ts +38 -0
  260. package/src/member/util.ts +127 -25
  261. package/src/members/collection.ts +8 -0
  262. package/src/members/index.ts +107 -6
  263. package/src/members/request.ts +97 -17
  264. package/src/members/types.ts +28 -0
  265. package/src/members/util.ts +319 -240
  266. package/src/metrics/constants.ts +9 -4
  267. package/src/metrics/index.ts +1 -490
  268. package/src/multistream/mediaRequestManager.ts +289 -79
  269. package/src/multistream/receiveSlot.ts +55 -18
  270. package/src/multistream/receiveSlotManager.ts +46 -24
  271. package/src/multistream/remoteMedia.ts +27 -2
  272. package/src/multistream/remoteMediaGroup.ts +59 -0
  273. package/src/multistream/remoteMediaManager.ts +148 -30
  274. package/src/multistream/sendSlotManager.ts +170 -0
  275. package/src/reachability/index.ts +165 -37
  276. package/src/reachability/request.ts +17 -8
  277. package/src/reconnection-manager/index.ts +81 -54
  278. package/src/recording-controller/index.ts +20 -3
  279. package/src/recording-controller/util.ts +26 -9
  280. package/src/roap/index.ts +23 -30
  281. package/src/roap/request.ts +100 -104
  282. package/src/roap/turnDiscovery.ts +51 -25
  283. package/src/rtcMetrics/constants.ts +3 -0
  284. package/src/rtcMetrics/index.ts +100 -0
  285. package/src/statsAnalyzer/index.ts +73 -35
  286. package/src/statsAnalyzer/mqaUtil.ts +8 -10
  287. package/test/integration/spec/converged-space-meetings.js +233 -0
  288. package/test/integration/spec/journey.js +320 -261
  289. package/test/integration/spec/space-meeting.js +76 -3
  290. package/test/unit/spec/annotation/index.ts +418 -0
  291. package/test/unit/spec/breakouts/breakout.ts +142 -24
  292. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  293. package/test/unit/spec/breakouts/events.ts +89 -0
  294. package/test/unit/spec/breakouts/index.ts +1545 -48
  295. package/test/unit/spec/breakouts/request.ts +104 -0
  296. package/test/unit/spec/breakouts/utils.js +72 -0
  297. package/test/unit/spec/common/queue.js +31 -2
  298. package/test/unit/spec/controls-options-manager/index.js +163 -0
  299. package/test/unit/spec/controls-options-manager/util.js +576 -60
  300. package/test/unit/spec/fixture/locus.js +1 -0
  301. package/test/unit/spec/interpretation/collection.ts +15 -0
  302. package/test/unit/spec/interpretation/index.ts +589 -0
  303. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  304. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  305. package/test/unit/spec/locus-info/index.js +1283 -33
  306. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  307. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  308. package/test/unit/spec/locus-info/parser.js +62 -22
  309. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  310. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  311. package/test/unit/spec/media/index.ts +104 -37
  312. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  313. package/test/unit/spec/meeting/index.js +4095 -1913
  314. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  315. package/test/unit/spec/meeting/muteState.js +408 -208
  316. package/test/unit/spec/meeting/request.js +440 -45
  317. package/test/unit/spec/meeting/utils.js +679 -64
  318. package/test/unit/spec/meeting-info/index.js +293 -0
  319. package/test/unit/spec/meeting-info/meetinginfov2.js +517 -5
  320. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  321. package/test/unit/spec/meetings/collection.js +14 -0
  322. package/test/unit/spec/meetings/index.js +941 -151
  323. package/test/unit/spec/meetings/utils.js +206 -2
  324. package/test/unit/spec/member/index.js +58 -4
  325. package/test/unit/spec/member/util.js +479 -35
  326. package/test/unit/spec/members/index.js +319 -1
  327. package/test/unit/spec/members/request.js +206 -27
  328. package/test/unit/spec/members/utils.js +184 -0
  329. package/test/unit/spec/metrics/index.js +1 -50
  330. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  331. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  332. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  333. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  334. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  335. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  336. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  337. package/test/unit/spec/reachability/index.ts +343 -9
  338. package/test/unit/spec/reachability/request.js +68 -0
  339. package/test/unit/spec/reconnection-manager/index.js +84 -9
  340. package/test/unit/spec/recording-controller/index.js +294 -218
  341. package/test/unit/spec/recording-controller/util.js +223 -96
  342. package/test/unit/spec/roap/index.ts +31 -51
  343. package/test/unit/spec/roap/request.ts +203 -85
  344. package/test/unit/spec/roap/turnDiscovery.ts +48 -13
  345. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  346. package/test/unit/spec/stats-analyzer/index.js +29 -2
  347. package/test/utils/constants.js +9 -0
  348. package/test/utils/integrationTestUtils.js +46 -0
  349. package/test/utils/testUtils.js +0 -45
  350. package/test/utils/webex-config.js +4 -0
  351. package/test/utils/webex-test-users.js +6 -3
  352. package/dist/meeting/effectsState.js +0 -262
  353. package/dist/meeting/effectsState.js.map +0 -1
  354. package/dist/metrics/config.js +0 -299
  355. package/dist/metrics/config.js.map +0 -1
  356. package/dist/types/meeting/effectsState.d.ts +0 -42
  357. package/dist/types/metrics/config.d.ts +0 -178
  358. package/src/index.js +0 -16
  359. package/src/meeting/effectsState.ts +0 -211
  360. package/src/metrics/config.ts +0 -495
  361. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -0,0 +1,12 @@
1
+ import type {
2
+ NoiseReductionEffectOptions,
3
+ VirtualBackgroundEffectOptions,
4
+ } from '@webex/media-helpers';
5
+
6
+ type INoiseReductionEffect = Omit<
7
+ NoiseReductionEffectOptions,
8
+ 'authToken' | 'workletProcessorUrl' | 'legacyProcessorUrl'
9
+ >;
10
+ type IVirtualBackgroundEffect = Omit<VirtualBackgroundEffectOptions, 'authToken'>;
11
+
12
+ export type {INoiseReductionEffect, IVirtualBackgroundEffect};
@@ -23,6 +23,7 @@ export default class MeetingRequest extends StatelessWebexPlugin {
23
23
  LoggerProxy.logger.error(
24
24
  `Meetings:request#getActiveMeetings --> failed to get locus details, ${error}`
25
25
  );
26
+ throw new Error(error);
26
27
  });
27
28
  }
28
29
 
@@ -71,6 +72,7 @@ export default class MeetingRequest extends StatelessWebexPlugin {
71
72
  LoggerProxy.logger.error(
72
73
  `Meetings:request#determineRedirections --> failed to get locus details from url: ${url}, reason: ${error}`
73
74
  );
75
+ throw new Error(error);
74
76
  })
75
77
  )
76
78
  ).then(() => Promise.resolve(responseBody));
@@ -1,16 +1,23 @@
1
1
  /* globals window */
2
2
 
3
3
  import {
4
- _LOCUS_ID_,
5
- _INCOMING_,
6
4
  _CREATED_,
7
- LOCUSEVENT,
5
+ _INCOMING_,
6
+ _JOINED_,
7
+ _LEFT_,
8
+ _LOCUS_ID_,
9
+ _MOVED_,
10
+ BREAKOUTS,
8
11
  CORRELATION_ID,
9
12
  EVENT_TRIGGERS,
13
+ LOCUS,
14
+ LOCUSEVENT,
10
15
  ROAP,
11
16
  } from '../constants';
12
17
  import LoggerProxy from '../common/logs/logger-proxy';
13
18
  import Trigger from '../common/events/trigger-proxy';
19
+ import BEHAVIORAL_METRICS from '../metrics/constants';
20
+ import Metrics from '../metrics';
14
21
 
15
22
  /**
16
23
  * Meetings Media Codec Missing Event
@@ -44,6 +51,14 @@ MeetingsUtil.handleRoapMercury = (envelope, meetingCollection) => {
44
51
  if (meeting) {
45
52
  const {seq, messageType, tieBreaker, errorType, errorCause} = data.message;
46
53
 
54
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_MERCURY_EVENT_RECEIVED, {
55
+ correlation_id: data.correlationId,
56
+ seq,
57
+ message_type: messageType,
58
+ error_type: errorType,
59
+ error_cause: errorCause,
60
+ });
61
+
47
62
  if (messageType === ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {
48
63
  // turn discovery is not part of normal roap protocol and so we are not handling it
49
64
  // through the usual roap state machine
@@ -58,12 +73,36 @@ MeetingsUtil.handleRoapMercury = (envelope, meetingCollection) => {
58
73
  errorCause,
59
74
  };
60
75
 
76
+ const mediaServer = MeetingsUtil.getMediaServer(roapMessage.sdp);
77
+
61
78
  meeting.mediaProperties.webrtcMediaConnection.roapMessageReceived(roapMessage);
79
+
80
+ if (mediaServer) {
81
+ meeting.mediaProperties.webrtcMediaConnection.mediaServer = mediaServer;
82
+ }
62
83
  }
63
84
  }
64
85
  }
65
86
  };
66
87
 
88
+ MeetingsUtil.getMediaServer = (sdp) => {
89
+ let mediaServer;
90
+
91
+ // Attempt to collect the media server from the roap message.
92
+ try {
93
+ mediaServer = sdp
94
+ .split('\r\n')
95
+ .find((line) => line.startsWith('o='))
96
+ .split(' ')
97
+ .shift()
98
+ .replace('o=', '');
99
+ } catch {
100
+ mediaServer = undefined;
101
+ }
102
+
103
+ return mediaServer;
104
+ };
105
+
67
106
  MeetingsUtil.checkForCorrelationId = (deviceUrl, locus) => {
68
107
  let devices = [];
69
108
 
@@ -85,11 +124,13 @@ MeetingsUtil.checkForCorrelationId = (deviceUrl, locus) => {
85
124
  MeetingsUtil.parseDefaultSiteFromMeetingPreferences = (userPreferences) => {
86
125
  let result = '';
87
126
 
88
- if (userPreferences && userPreferences.sites) {
127
+ if (userPreferences?.sites?.length) {
89
128
  const defaultSite = userPreferences.sites.find((site) => site.default);
90
129
 
91
130
  if (defaultSite) {
92
131
  result = defaultSite.siteUrl;
132
+ } else {
133
+ result = userPreferences.sites[0].siteUrl;
93
134
  }
94
135
  }
95
136
 
@@ -196,4 +237,62 @@ MeetingsUtil.checkH264Support = async function checkH264Support(options: {
196
237
  }, delay);
197
238
  };
198
239
 
240
+ /**
241
+ * get device from locus data
242
+ * @param {Object} newLocus new locus data
243
+ * @param {String} deviceUrl current device url
244
+ * @returns {Object}
245
+ */
246
+ MeetingsUtil.getThisDevice = (newLocus: any, deviceUrl: string) => {
247
+ if (newLocus?.self?.devices?.length > 0) {
248
+ return newLocus.self.devices.find((device) => device.url === deviceUrl);
249
+ }
250
+
251
+ return null;
252
+ };
253
+
254
+ /**
255
+ * get self device joined status from locus data
256
+ * @param {Object} meeting current meeting data
257
+ * @param {Object} newLocus new locus data
258
+ * @param {String} deviceUrl current device url
259
+ * @returns {Object}
260
+ */
261
+ MeetingsUtil.joinedOnThisDevice = (meeting: any, newLocus: any, deviceUrl: string) => {
262
+ const thisDevice = MeetingsUtil.getThisDevice(newLocus, deviceUrl);
263
+ if (thisDevice) {
264
+ if (!thisDevice.correlationId || meeting?.correlationId === thisDevice.correlationId) {
265
+ return (
266
+ thisDevice.state === _JOINED_ ||
267
+ (thisDevice.state === _LEFT_ && thisDevice.reason === _MOVED_)
268
+ );
269
+ }
270
+ }
271
+
272
+ return false;
273
+ };
274
+
275
+ /**
276
+ * check the new locus is breakout session's one or not
277
+ * @param {Object} newLocus new locus data
278
+ * @returns {boolean}
279
+ * @private
280
+ */
281
+ MeetingsUtil.isBreakoutLocusDTO = (newLocus: any) => {
282
+ return newLocus?.controls?.breakout?.sessionType === BREAKOUTS.SESSION_TYPES.BREAKOUT;
283
+ };
284
+
285
+ /**
286
+ * check the locus is valid breakout locus or not
287
+ * @param {Object} locus
288
+ * @returns {boolean}
289
+ * @private
290
+ */
291
+ MeetingsUtil.isValidBreakoutLocus = (locus: any) => {
292
+ const inActiveStatus = locus?.fullState?.state === LOCUS.STATE.INACTIVE;
293
+ const isLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(locus);
294
+ const selfJoined = locus.self?.state === _JOINED_;
295
+
296
+ return isLocusAsBreakout && !inActiveStatus && selfJoined;
297
+ };
199
298
  export default MeetingsUtil;
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
3
  */
4
4
  import {MEETINGS, _IN_LOBBY_, _NOT_IN_MEETING_, _IN_MEETING_} from '../constants';
5
+ import {IExternalRoles, IMediaStatus, ParticipantWithRoles} from './types';
5
6
 
6
7
  import MemberUtil from './util';
7
8
 
@@ -28,10 +29,14 @@ export default class Member {
28
29
  isSelf: any;
29
30
  isUser: any;
30
31
  isVideoMuted: any;
32
+ roles: IExternalRoles;
33
+ mediaStatus: IMediaStatus;
31
34
  name: any;
32
35
  participant: any;
33
36
  status: any;
34
37
  supportsBreakouts: boolean;
38
+ supportsInterpretation: boolean;
39
+ supportLiveAnnotation: boolean;
35
40
  type: any;
36
41
  namespace = MEETINGS;
37
42
 
@@ -108,6 +113,13 @@ export default class Member {
108
113
  * @memberof Member
109
114
  */
110
115
  this.supportsBreakouts = null;
116
+ /**
117
+ * @instance
118
+ * @type {Boolean}
119
+ * @public
120
+ * @memberof Member
121
+ */
122
+ this.supportLiveAnnotation = null;
111
123
  /**
112
124
  * @instance
113
125
  * @type {Boolean}
@@ -228,6 +240,27 @@ export default class Member {
228
240
  * @memberof Member
229
241
  */
230
242
  this.isModeratorAssignmentProhibited = null;
243
+
244
+ /**
245
+ * @instance
246
+ * @type {IExternalRoles}
247
+ * @public
248
+ * @memberof Member
249
+ */
250
+ this.roles = null;
251
+
252
+ /**
253
+ * @instance
254
+ * @type {IMediaStatus}
255
+ * @public
256
+ * @memberof Member
257
+ * @example {audio: MediaStatus.RECVONLY, video: MediaStatus.SENDRECV}
258
+ */
259
+ this.mediaStatus = {
260
+ audio: null,
261
+ video: null,
262
+ };
263
+
231
264
  // TODO: more participant types
232
265
  // such as native client, web client, is a device, what type of phone, etc
233
266
  this.processParticipant(participant);
@@ -251,6 +284,8 @@ export default class Member {
251
284
  this.isVideoMuted = MemberUtil.isVideoMuted(participant);
252
285
  this.isHandRaised = MemberUtil.isHandRaised(participant);
253
286
  this.supportsBreakouts = MemberUtil.isBreakoutsSupported(participant);
287
+ this.supportsInterpretation = MemberUtil.isInterpretationSupported(participant);
288
+ this.supportLiveAnnotation = MemberUtil.isLiveAnnotationSupported(participant);
254
289
  this.isGuest = MemberUtil.isGuest(participant);
255
290
  this.isUser = MemberUtil.isUser(participant);
256
291
  this.isDevice = MemberUtil.isDevice(participant);
@@ -258,6 +293,7 @@ export default class Member {
258
293
  this.isModeratorAssignmentProhibited =
259
294
  MemberUtil.isModeratorAssignmentProhibited(participant);
260
295
  this.processStatus(participant);
296
+ this.processRoles(participant as ParticipantWithRoles);
261
297
  // must be done last
262
298
  this.isNotAdmitted = MemberUtil.isNotAdmitted(participant, this.isGuest, this.status);
263
299
  }
@@ -303,6 +339,8 @@ export default class Member {
303
339
  this.isAudioMuted,
304
340
  this.type
305
341
  );
342
+
343
+ this.mediaStatus = MemberUtil.extractMediaStatus(this.participant);
306
344
  }
307
345
 
308
346
  /**
@@ -427,6 +465,17 @@ export default class Member {
427
465
  }
428
466
  }
429
467
 
468
+ /**
469
+ * process the roles that have been applied to this member
470
+ * @param {Object} participant
471
+ * @returns {undefined}
472
+ * @private
473
+ * @memberof Member
474
+ */
475
+ private processRoles(participant: ParticipantWithRoles) {
476
+ this.roles = MemberUtil.extractControlRoles(participant);
477
+ }
478
+
430
479
  /**
431
480
  * set the type for the member, could be MEETING or CALL
432
481
  * @param {String} type
@@ -0,0 +1,38 @@
1
+ export interface IExternalRoles {
2
+ cohost: boolean;
3
+ moderator: boolean;
4
+ presenter: boolean;
5
+ }
6
+
7
+ export enum ServerRoles {
8
+ Cohost = 'COHOST',
9
+ Moderator = 'MODERATOR',
10
+ Presenter = 'PRESENTER',
11
+ }
12
+
13
+ export type ServerRoleShape = {
14
+ type: ServerRoles;
15
+ hasRole: boolean;
16
+ };
17
+
18
+ export type ParticipantWithRoles = {
19
+ controls: {
20
+ role: {
21
+ roles: Array<ServerRoleShape>;
22
+ };
23
+ };
24
+ };
25
+
26
+ // values are inherited from locus so don't update these
27
+ export enum MediaStatus {
28
+ RECVONLY = 'RECVONLY', // participant only receiving and not sending
29
+ SENDONLY = 'SENDONLY', // participant only sending and not receiving
30
+ SENDRECV = 'SENDRECV', // participant both sending and receiving
31
+ INACTIVE = 'INACTIVE', // participant is not connected to media source
32
+ UNKNOWN = 'UNKNOWN', // participant has not added media in the meeting
33
+ }
34
+
35
+ export interface IMediaStatus {
36
+ audio: MediaStatus;
37
+ video: MediaStatus;
38
+ }
@@ -1,3 +1,10 @@
1
+ import {
2
+ IExternalRoles,
3
+ ParticipantWithRoles,
4
+ ServerRoles,
5
+ ServerRoleShape,
6
+ IMediaStatus,
7
+ } from './types';
1
8
  import {
2
9
  _USER_,
3
10
  _RESOURCE_ROOM_,
@@ -14,11 +21,65 @@ import {
14
21
  _SEND_RECEIVE_,
15
22
  _RECEIVE_ONLY_,
16
23
  _CALL_,
24
+ VIDEO,
25
+ AUDIO,
17
26
  } from '../constants';
18
27
  import ParameterError from '../common/errors/parameter';
19
28
 
20
29
  const MemberUtil: any = {};
21
30
 
31
+ /**
32
+ * @param {Object} participant the locus participant
33
+ * @returns {[ServerRoleShape]}
34
+ */
35
+ MemberUtil.getControlsRoles = (participant: ParticipantWithRoles): Array<ServerRoleShape> =>
36
+ participant?.controls?.role?.roles;
37
+
38
+ /**
39
+ * @param {Object} participant the locus participant
40
+ * @param {ServerRoles} controlRole the search role
41
+ * @returns {Boolean}
42
+ */
43
+ MemberUtil.hasRole = (participant: any, controlRole: ServerRoles): boolean =>
44
+ MemberUtil.getControlsRoles(participant)?.some(
45
+ (role) => role.type === controlRole && role.hasRole
46
+ );
47
+
48
+ /**
49
+ * @param {Object} participant the locus participant
50
+ * @returns {Boolean}
51
+ */
52
+ MemberUtil.hasCohost = (participant: ParticipantWithRoles): boolean =>
53
+ MemberUtil.hasRole(participant, ServerRoles.Cohost) || false;
54
+
55
+ /**
56
+ * @param {Object} participant the locus participant
57
+ * @returns {Boolean}
58
+ */
59
+ MemberUtil.hasModerator = (participant: ParticipantWithRoles): boolean =>
60
+ MemberUtil.hasRole(participant, ServerRoles.Moderator) || false;
61
+
62
+ /**
63
+ * @param {Object} participant the locus participant
64
+ * @returns {Boolean}
65
+ */
66
+ MemberUtil.hasPresenter = (participant: ParticipantWithRoles): boolean =>
67
+ MemberUtil.hasRole(participant, ServerRoles.Presenter) || false;
68
+
69
+ /**
70
+ * @param {Object} participant the locus participant
71
+ * @returns {IExternalRoles}
72
+ */
73
+ MemberUtil.extractControlRoles = (participant: ParticipantWithRoles): IExternalRoles => {
74
+ const roles = {
75
+ cohost: MemberUtil.hasCohost(participant),
76
+ moderator: MemberUtil.hasModerator(participant),
77
+ presenter: MemberUtil.hasPresenter(participant),
78
+ };
79
+
80
+ return roles;
81
+ };
82
+
22
83
  /**
23
84
  * @param {Object} participant the locus participant
24
85
  * @returns {Boolean}
@@ -93,30 +154,20 @@ MemberUtil.isAudioMuted = (participant: any) => {
93
154
  if (!participant) {
94
155
  throw new ParameterError('Audio could not be processed, participant is undefined.');
95
156
  }
96
- const mutedStatus = MemberUtil.isMuted(participant.status, AUDIO_STATUS);
97
157
 
98
- if (participant.controls && participant.controls.audio) {
99
- if (participant.controls.audio.muted) {
100
- return true;
101
- }
102
- if (mutedStatus) {
103
- return true;
104
- }
105
- }
106
-
107
- return false;
158
+ return MemberUtil.isMuted(participant, AUDIO_STATUS, AUDIO);
108
159
  };
109
160
 
110
161
  /**
111
162
  * @param {Object} participant the locus participant
112
163
  * @returns {Boolean}
113
164
  */
114
- MemberUtil.isVideoMuted = (participant: any) => {
165
+ MemberUtil.isVideoMuted = (participant: any): boolean => {
115
166
  if (!participant) {
116
167
  throw new ParameterError('Video could not be processed, participant is undefined.');
117
168
  }
118
169
 
119
- return MemberUtil.isMuted(participant.status, VIDEO_STATUS);
170
+ return MemberUtil.isMuted(participant, VIDEO_STATUS, VIDEO);
120
171
  };
121
172
 
122
173
  /**
@@ -144,22 +195,57 @@ MemberUtil.isBreakoutsSupported = (participant) => {
144
195
  };
145
196
 
146
197
  /**
147
- * utility method for audio/video muted status
148
- * @param {String} status
149
- * @param {String} accessor
198
+ * @param {Object} participant the locus participant
150
199
  * @returns {Boolean}
151
200
  */
152
- MemberUtil.isMuted = (status: string, accessor: string) => {
153
- if (status) {
154
- if (status[accessor] === _RECEIVE_ONLY_) {
155
- return true;
156
- }
157
- if (status[accessor] === _SEND_RECEIVE_) {
158
- return false;
159
- }
201
+ MemberUtil.isInterpretationSupported = (participant) => {
202
+ if (!participant) {
203
+ throw new ParameterError(
204
+ 'Interpretation support could not be processed, participant is undefined.'
205
+ );
160
206
  }
161
207
 
162
- return null;
208
+ return !participant.doesNotSupportSiInterpreter;
209
+ };
210
+
211
+ /**
212
+ * @param {Object} participant the locus participant
213
+ * @returns {Boolean}
214
+ */
215
+ MemberUtil.isLiveAnnotationSupported = (participant) => {
216
+ if (!participant) {
217
+ throw new ParameterError(
218
+ 'LiveAnnotation support could not be processed, participant is undefined.'
219
+ );
220
+ }
221
+
222
+ return !participant.annotatorAssignmentNotAllowed;
223
+ };
224
+
225
+ /**
226
+ * utility method for audio/video muted status
227
+ * @param {any} participant
228
+ * @param {String} statusAccessor
229
+ * @param {String} controlsAccessor
230
+ * @returns {Boolean | undefined}
231
+ */
232
+ MemberUtil.isMuted = (participant: any, statusAccessor: string, controlsAccessor: string) => {
233
+ // check remote mute
234
+ const remoteMute = participant?.controls?.[controlsAccessor]?.muted;
235
+ if (remoteMute === true) {
236
+ return true;
237
+ }
238
+
239
+ // check local mute
240
+ const localStatus = participant?.status?.[statusAccessor];
241
+ if (localStatus === _RECEIVE_ONLY_) {
242
+ return true;
243
+ }
244
+ if (localStatus === _SEND_RECEIVE_) {
245
+ return false;
246
+ }
247
+
248
+ return remoteMute;
163
249
  };
164
250
 
165
251
  /**
@@ -266,6 +352,22 @@ MemberUtil.extractId = (participant: any) => {
266
352
  return null;
267
353
  };
268
354
 
355
+ /**
356
+ * extracts the media status from nested participant object
357
+ * @param {Object} participant the locus participant
358
+ * @returns {Object}
359
+ */
360
+ MemberUtil.extractMediaStatus = (participant: any): IMediaStatus => {
361
+ if (!participant) {
362
+ throw new ParameterError('Media status could not be extracted, participant is undefined.');
363
+ }
364
+
365
+ return {
366
+ audio: participant.status?.audioStatus,
367
+ video: participant.status?.videoStatus,
368
+ };
369
+ };
370
+
269
371
  /**
270
372
  * @param {Object} participant the locus participant
271
373
  * @returns {String}
@@ -37,4 +37,12 @@ export default class MembersCollection {
37
37
  getAll() {
38
38
  return this.members;
39
39
  }
40
+
41
+ /**
42
+ * @returns {void}
43
+ * reset members
44
+ */
45
+ reset() {
46
+ this.members = {};
47
+ }
40
48
  }