@webex/plugin-meetings 3.0.0-beta.17 → 3.0.0-beta.170

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 (427) hide show
  1. package/README.md +45 -1
  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 +359 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +216 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +23 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +52 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +45 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1048 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +78 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +67 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +3 -2
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/config.js +6 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +194 -28
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +300 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +95 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +214 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +92 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +350 -41
  51. package/dist/locus-info/index.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 +2 -1
  55. package/dist/locus-info/parser.js.map +1 -1
  56. package/dist/locus-info/selfUtils.js +97 -14
  57. package/dist/locus-info/selfUtils.js.map +1 -1
  58. package/dist/media/index.js +39 -134
  59. package/dist/media/index.js.map +1 -1
  60. package/dist/media/properties.js +19 -97
  61. package/dist/media/properties.js.map +1 -1
  62. package/dist/mediaQualityMetrics/config.js +505 -493
  63. package/dist/mediaQualityMetrics/config.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +76 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +2640 -2436
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +291 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +229 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +191 -167
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/request.type.js.map +1 -1
  75. package/dist/meeting/util.js +477 -466
  76. package/dist/meeting/util.js.map +1 -1
  77. package/dist/meeting-info/index.js +48 -7
  78. package/dist/meeting-info/index.js.map +1 -1
  79. package/dist/meeting-info/meeting-info-v2.js +172 -50
  80. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  81. package/dist/meeting-info/utilv2.js +20 -5
  82. package/dist/meeting-info/utilv2.js.map +1 -1
  83. package/dist/meetings/collection.js +22 -0
  84. package/dist/meetings/collection.js.map +1 -1
  85. package/dist/meetings/index.js +377 -82
  86. package/dist/meetings/index.js.map +1 -1
  87. package/dist/meetings/meetings.types.js +7 -0
  88. package/dist/meetings/meetings.types.js.map +1 -0
  89. package/dist/meetings/request.js +16 -12
  90. package/dist/meetings/request.js.map +1 -1
  91. package/dist/meetings/util.js +88 -1
  92. package/dist/meetings/util.js.map +1 -1
  93. package/dist/member/index.js +43 -0
  94. package/dist/member/index.js.map +1 -1
  95. package/dist/member/types.js +15 -0
  96. package/dist/member/types.js.map +1 -0
  97. package/dist/member/util.js +97 -3
  98. package/dist/member/util.js.map +1 -1
  99. package/dist/members/collection.js +10 -0
  100. package/dist/members/collection.js.map +1 -1
  101. package/dist/members/index.js +94 -11
  102. package/dist/members/index.js.map +1 -1
  103. package/dist/members/request.js +109 -39
  104. package/dist/members/request.js.map +1 -1
  105. package/dist/members/types.js +15 -0
  106. package/dist/members/types.js.map +1 -0
  107. package/dist/members/util.js +316 -233
  108. package/dist/members/util.js.map +1 -1
  109. package/dist/metrics/constants.js +3 -5
  110. package/dist/metrics/constants.js.map +1 -1
  111. package/dist/metrics/index.js +1 -468
  112. package/dist/metrics/index.js.map +1 -1
  113. package/dist/multistream/mediaRequestManager.js +265 -36
  114. package/dist/multistream/mediaRequestManager.js.map +1 -1
  115. package/dist/multistream/receiveSlot.js +52 -19
  116. package/dist/multistream/receiveSlot.js.map +1 -1
  117. package/dist/multistream/receiveSlotManager.js +53 -33
  118. package/dist/multistream/receiveSlotManager.js.map +1 -1
  119. package/dist/multistream/remoteMedia.js +44 -18
  120. package/dist/multistream/remoteMedia.js.map +1 -1
  121. package/dist/multistream/remoteMediaGroup.js +60 -3
  122. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  123. package/dist/multistream/remoteMediaManager.js +322 -103
  124. package/dist/multistream/remoteMediaManager.js.map +1 -1
  125. package/dist/networkQualityMonitor/index.js +4 -2
  126. package/dist/networkQualityMonitor/index.js.map +1 -1
  127. package/dist/reachability/index.js +117 -60
  128. package/dist/reachability/index.js.map +1 -1
  129. package/dist/reachability/request.js +12 -5
  130. package/dist/reachability/request.js.map +1 -1
  131. package/dist/reactions/constants.js +13 -0
  132. package/dist/reactions/constants.js.map +1 -0
  133. package/dist/reactions/reactions.js +2 -2
  134. package/dist/reactions/reactions.js.map +1 -1
  135. package/dist/reactions/reactions.type.js +18 -18
  136. package/dist/reactions/reactions.type.js.map +1 -1
  137. package/dist/reconnection-manager/index.js +217 -162
  138. package/dist/reconnection-manager/index.js.map +1 -1
  139. package/dist/recording-controller/enums.js +17 -0
  140. package/dist/recording-controller/enums.js.map +1 -0
  141. package/dist/recording-controller/index.js +363 -0
  142. package/dist/recording-controller/index.js.map +1 -0
  143. package/dist/recording-controller/util.js +64 -0
  144. package/dist/recording-controller/util.js.map +1 -0
  145. package/dist/roap/index.js +21 -29
  146. package/dist/roap/index.js.map +1 -1
  147. package/dist/roap/request.js +135 -94
  148. package/dist/roap/request.js.map +1 -1
  149. package/dist/roap/turnDiscovery.js +135 -53
  150. package/dist/roap/turnDiscovery.js.map +1 -1
  151. package/dist/statsAnalyzer/global.js +1 -93
  152. package/dist/statsAnalyzer/global.js.map +1 -1
  153. package/dist/statsAnalyzer/index.js +329 -314
  154. package/dist/statsAnalyzer/index.js.map +1 -1
  155. package/dist/statsAnalyzer/mqaUtil.js +103 -54
  156. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  157. package/dist/types/annotation/annotation.types.d.ts +43 -0
  158. package/dist/types/annotation/constants.d.ts +31 -0
  159. package/dist/types/annotation/index.d.ts +124 -0
  160. package/dist/types/breakouts/breakout.d.ts +8 -0
  161. package/dist/types/breakouts/collection.d.ts +5 -0
  162. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  163. package/dist/types/breakouts/events.d.ts +8 -0
  164. package/dist/types/breakouts/index.d.ts +5 -0
  165. package/dist/types/breakouts/request.d.ts +22 -0
  166. package/dist/types/breakouts/utils.d.ts +15 -0
  167. package/dist/types/common/browser-detection.d.ts +9 -0
  168. package/dist/types/common/collection.d.ts +48 -0
  169. package/dist/types/common/config.d.ts +2 -0
  170. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  171. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  172. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  173. package/dist/types/common/errors/media.d.ts +15 -0
  174. package/dist/types/common/errors/parameter.d.ts +15 -0
  175. package/dist/types/common/errors/password-error.d.ts +15 -0
  176. package/dist/types/common/errors/permission.d.ts +14 -0
  177. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  178. package/dist/types/common/errors/reconnection.d.ts +15 -0
  179. package/dist/types/common/errors/stats.d.ts +15 -0
  180. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  181. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  182. package/dist/types/common/events/events-scope.d.ts +17 -0
  183. package/dist/types/common/events/events.d.ts +12 -0
  184. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  185. package/dist/types/common/events/util.d.ts +2 -0
  186. package/dist/types/common/logs/logger-config.d.ts +2 -0
  187. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  188. package/dist/types/common/logs/request.d.ts +34 -0
  189. package/dist/types/common/queue.d.ts +32 -0
  190. package/dist/types/config.d.ts +72 -0
  191. package/dist/types/constants.d.ts +1007 -0
  192. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  193. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  194. package/dist/types/controls-options-manager/index.d.ts +136 -0
  195. package/dist/types/controls-options-manager/types.d.ts +43 -0
  196. package/dist/types/controls-options-manager/util.d.ts +1 -0
  197. package/dist/types/index.d.ts +7 -0
  198. package/dist/types/interpretation/collection.d.ts +5 -0
  199. package/dist/types/interpretation/index.d.ts +5 -0
  200. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  201. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  202. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  203. package/dist/types/locus-info/fullState.d.ts +2 -0
  204. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  205. package/dist/types/locus-info/index.d.ts +315 -0
  206. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  207. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  208. package/dist/types/locus-info/parser.d.ts +212 -0
  209. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  210. package/dist/types/media/index.d.ts +34 -0
  211. package/dist/types/media/properties.d.ts +86 -0
  212. package/dist/types/media/util.d.ts +2 -0
  213. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  214. package/dist/types/meeting/in-meeting-actions.d.ts +149 -0
  215. package/dist/types/meeting/index.d.ts +1430 -0
  216. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  217. package/dist/types/meeting/muteState.d.ts +184 -0
  218. package/dist/types/meeting/request.d.ts +270 -0
  219. package/dist/types/meeting/request.type.d.ts +11 -0
  220. package/dist/types/meeting/state.d.ts +9 -0
  221. package/dist/types/meeting/util.d.ts +77 -0
  222. package/dist/types/meeting-info/collection.d.ts +20 -0
  223. package/dist/types/meeting-info/index.d.ts +62 -0
  224. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  225. package/dist/types/meeting-info/request.d.ts +22 -0
  226. package/dist/types/meeting-info/util.d.ts +2 -0
  227. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  228. package/dist/types/meetings/collection.d.ts +31 -0
  229. package/dist/types/meetings/index.d.ts +365 -0
  230. package/dist/types/meetings/meetings.types.d.ts +4 -0
  231. package/dist/types/meetings/request.d.ts +27 -0
  232. package/dist/types/meetings/util.d.ts +18 -0
  233. package/dist/types/member/index.d.ts +158 -0
  234. package/dist/types/member/types.d.ts +21 -0
  235. package/dist/types/member/util.d.ts +2 -0
  236. package/dist/types/members/collection.d.ts +29 -0
  237. package/dist/types/members/index.d.ts +353 -0
  238. package/dist/types/members/request.d.ts +114 -0
  239. package/dist/types/members/types.d.ts +24 -0
  240. package/dist/types/members/util.d.ts +210 -0
  241. package/dist/types/metrics/constants.d.ts +55 -0
  242. package/dist/types/metrics/index.d.ts +45 -0
  243. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  244. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  245. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  246. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  247. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  248. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  249. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  250. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  251. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  252. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  253. package/dist/types/reachability/index.d.ts +152 -0
  254. package/dist/types/reachability/request.d.ts +37 -0
  255. package/dist/types/reactions/constants.d.ts +3 -0
  256. package/dist/types/reactions/reactions.d.ts +4 -0
  257. package/dist/types/reactions/reactions.type.d.ts +52 -0
  258. package/dist/types/reconnection-manager/index.d.ts +126 -0
  259. package/dist/types/recording-controller/enums.d.ts +7 -0
  260. package/dist/types/recording-controller/index.d.ts +208 -0
  261. package/dist/types/recording-controller/util.d.ts +14 -0
  262. package/dist/types/roap/index.d.ts +77 -0
  263. package/dist/types/roap/request.d.ts +36 -0
  264. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  265. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  266. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  267. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  268. package/dist/types/transcription/index.d.ts +64 -0
  269. package/package.json +29 -21
  270. package/src/annotation/annotation.types.ts +52 -0
  271. package/src/annotation/constants.ts +36 -0
  272. package/src/annotation/index.ts +343 -0
  273. package/src/breakouts/README.md +220 -0
  274. package/src/breakouts/breakout.ts +188 -0
  275. package/src/breakouts/collection.ts +19 -0
  276. package/src/breakouts/edit-lock-error.ts +25 -0
  277. package/src/breakouts/events.ts +56 -0
  278. package/src/breakouts/index.ts +925 -0
  279. package/src/breakouts/request.ts +55 -0
  280. package/src/breakouts/utils.ts +57 -0
  281. package/src/common/errors/webex-errors.ts +6 -2
  282. package/src/common/logs/logger-proxy.ts +1 -1
  283. package/src/config.ts +5 -7
  284. package/src/constants.ts +183 -22
  285. package/src/controls-options-manager/constants.ts +5 -0
  286. package/src/controls-options-manager/enums.ts +18 -0
  287. package/src/controls-options-manager/index.ts +278 -0
  288. package/src/controls-options-manager/types.ts +59 -0
  289. package/src/controls-options-manager/util.ts +286 -0
  290. package/src/index.ts +37 -0
  291. package/src/interpretation/README.md +51 -0
  292. package/src/interpretation/collection.ts +19 -0
  293. package/src/interpretation/index.ts +182 -0
  294. package/src/interpretation/siLanguage.ts +18 -0
  295. package/src/locus-info/controlsUtils.ts +110 -0
  296. package/src/locus-info/index.ts +374 -38
  297. package/src/locus-info/mediaSharesUtils.ts +48 -0
  298. package/src/locus-info/parser.ts +2 -1
  299. package/src/locus-info/selfUtils.ts +86 -2
  300. package/src/media/index.ts +70 -142
  301. package/src/media/properties.ts +41 -104
  302. package/src/mediaQualityMetrics/config.ts +379 -377
  303. package/src/meeting/in-meeting-actions.ts +151 -3
  304. package/src/meeting/index.ts +2029 -2033
  305. package/src/meeting/locusMediaRequest.ts +309 -0
  306. package/src/meeting/muteState.ts +228 -132
  307. package/src/meeting/request.ts +100 -91
  308. package/src/meeting/request.type.ts +2 -0
  309. package/src/meeting/util.ts +450 -439
  310. package/src/meeting-info/index.ts +54 -8
  311. package/src/meeting-info/meeting-info-v2.ts +150 -14
  312. package/src/meeting-info/utilv2.ts +13 -3
  313. package/src/meetings/collection.ts +20 -0
  314. package/src/meetings/index.ts +396 -89
  315. package/src/meetings/meetings.types.ts +12 -0
  316. package/src/meetings/request.ts +3 -1
  317. package/src/meetings/util.ts +103 -4
  318. package/src/member/index.ts +42 -0
  319. package/src/member/types.ts +24 -0
  320. package/src/member/util.ts +95 -1
  321. package/src/members/collection.ts +8 -0
  322. package/src/members/index.ts +108 -6
  323. package/src/members/request.ts +98 -17
  324. package/src/members/types.ts +28 -0
  325. package/src/members/util.ts +319 -240
  326. package/src/metrics/constants.ts +2 -4
  327. package/src/metrics/index.ts +1 -490
  328. package/src/multistream/mediaRequestManager.ts +337 -63
  329. package/src/multistream/receiveSlot.ts +68 -26
  330. package/src/multistream/receiveSlotManager.ts +61 -38
  331. package/src/multistream/remoteMedia.ts +29 -3
  332. package/src/multistream/remoteMediaGroup.ts +61 -2
  333. package/src/multistream/remoteMediaManager.ts +260 -66
  334. package/src/networkQualityMonitor/index.ts +6 -6
  335. package/src/reachability/index.ts +75 -25
  336. package/src/reachability/request.ts +10 -5
  337. package/src/reactions/constants.ts +4 -0
  338. package/src/reactions/reactions.ts +4 -4
  339. package/src/reactions/reactions.type.ts +28 -3
  340. package/src/reconnection-manager/index.ts +80 -49
  341. package/src/recording-controller/enums.ts +8 -0
  342. package/src/recording-controller/index.ts +333 -0
  343. package/src/recording-controller/util.ts +75 -0
  344. package/src/roap/index.ts +21 -30
  345. package/src/roap/request.ts +72 -61
  346. package/src/roap/turnDiscovery.ts +51 -27
  347. package/src/statsAnalyzer/global.ts +1 -94
  348. package/src/statsAnalyzer/index.ts +380 -390
  349. package/src/statsAnalyzer/mqaUtil.ts +106 -99
  350. package/test/integration/spec/converged-space-meetings.js +233 -0
  351. package/test/integration/spec/journey.js +331 -254
  352. package/test/integration/spec/space-meeting.js +77 -4
  353. package/test/unit/spec/annotation/index.ts +436 -0
  354. package/test/unit/spec/breakouts/breakout.ts +237 -0
  355. package/test/unit/spec/breakouts/collection.ts +15 -0
  356. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  357. package/test/unit/spec/breakouts/events.ts +89 -0
  358. package/test/unit/spec/breakouts/index.ts +1790 -0
  359. package/test/unit/spec/breakouts/request.ts +104 -0
  360. package/test/unit/spec/breakouts/utils.js +72 -0
  361. package/test/unit/spec/controls-options-manager/index.js +287 -0
  362. package/test/unit/spec/controls-options-manager/util.js +518 -0
  363. package/test/unit/spec/fixture/locus.js +1 -0
  364. package/test/unit/spec/interpretation/collection.ts +15 -0
  365. package/test/unit/spec/interpretation/index.ts +329 -0
  366. package/test/unit/spec/interpretation/siLanguage.ts +26 -0
  367. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  368. package/test/unit/spec/locus-info/index.js +792 -4
  369. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  370. package/test/unit/spec/locus-info/selfConstant.js +48 -0
  371. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  372. package/test/unit/spec/media/index.ts +118 -22
  373. package/test/unit/spec/media/properties.ts +9 -9
  374. package/test/unit/spec/meeting/in-meeting-actions.ts +75 -3
  375. package/test/unit/spec/meeting/index.js +2742 -1441
  376. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  377. package/test/unit/spec/meeting/muteState.js +370 -208
  378. package/test/unit/spec/meeting/request.js +354 -42
  379. package/test/unit/spec/meeting/utils.js +384 -170
  380. package/test/unit/spec/meeting-info/index.js +181 -0
  381. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  382. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  383. package/test/unit/spec/meetings/collection.js +14 -0
  384. package/test/unit/spec/meetings/index.js +847 -121
  385. package/test/unit/spec/meetings/utils.js +206 -2
  386. package/test/unit/spec/member/index.js +31 -0
  387. package/test/unit/spec/member/util.js +408 -32
  388. package/test/unit/spec/members/index.js +320 -1
  389. package/test/unit/spec/members/request.js +206 -27
  390. package/test/unit/spec/members/utils.js +184 -0
  391. package/test/unit/spec/metrics/index.js +1 -50
  392. package/test/unit/spec/multistream/mediaRequestManager.ts +1012 -109
  393. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  394. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  395. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  396. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  397. package/test/unit/spec/multistream/remoteMediaManager.ts +672 -65
  398. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  399. package/test/unit/spec/reachability/index.ts +176 -25
  400. package/test/unit/spec/reachability/request.js +66 -0
  401. package/test/unit/spec/reconnection-manager/index.js +95 -13
  402. package/test/unit/spec/recording-controller/index.js +307 -0
  403. package/test/unit/spec/recording-controller/util.js +229 -0
  404. package/test/unit/spec/roap/index.ts +28 -52
  405. package/test/unit/spec/roap/request.ts +225 -0
  406. package/test/unit/spec/roap/turnDiscovery.ts +73 -34
  407. package/test/unit/spec/stats-analyzer/index.js +94 -43
  408. package/test/utils/constants.js +9 -0
  409. package/test/utils/integrationTestUtils.js +46 -0
  410. package/test/utils/testUtils.js +0 -45
  411. package/test/utils/webex-config.js +4 -0
  412. package/test/utils/webex-test-users.js +7 -3
  413. package/tsconfig.json +6 -0
  414. package/dist/media/internal-media-core-wrapper.js +0 -18
  415. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  416. package/dist/meeting/effectsState.js +0 -262
  417. package/dist/meeting/effectsState.js.map +0 -1
  418. package/dist/metrics/config.js +0 -299
  419. package/dist/metrics/config.js.map +0 -1
  420. package/dist/multistream/multistreamMedia.js +0 -106
  421. package/dist/multistream/multistreamMedia.js.map +0 -1
  422. package/src/index.js +0 -15
  423. package/src/media/internal-media-core-wrapper.ts +0 -9
  424. package/src/meeting/effectsState.ts +0 -211
  425. package/src/metrics/config.ts +0 -495
  426. package/src/multistream/multistreamMedia.ts +0 -93
  427. package/test/unit/spec/meeting/effectsState.js +0 -281
@@ -14,11 +14,13 @@ import ReachabilityRequest from './request';
14
14
  const DEFAULT_TIMEOUT = 3000;
15
15
  const VIDEO_MESH_TIMEOUT = 1000;
16
16
 
17
+ export type ICECandidateResult = {clusterId: string; elapsed?: string | null; publicIPs?: string[]};
17
18
  /**
18
19
  * @class Reachability
19
20
  * @export
20
21
  */
21
22
  export default class Reachability {
23
+ namespace = REACHABILITY.namespace;
22
24
  webex: object;
23
25
  reachabilityRequest: any;
24
26
  clusterLatencyResults: any;
@@ -61,24 +63,30 @@ export default class Reachability {
61
63
  this.setup();
62
64
 
63
65
  // Remove stored reachability results to ensure no stale data
64
- if (window?.localStorage?.removeItem) {
65
- window.localStorage.removeItem(REACHABILITY.localStorage);
66
- } else {
67
- LoggerProxy.logger.error(
68
- 'Reachability:index#gatherReachability --> Error in accessing LocalStorage.'
69
- );
70
-
71
- return {};
72
- }
66
+ // @ts-ignore
67
+ await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageResult);
68
+ // @ts-ignore
69
+ await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageJoinCookie);
73
70
 
74
71
  // Fetch clusters and measure latency
75
72
  try {
76
- const clusters = await this.reachabilityRequest.getClusters();
73
+ const {clusters, joinCookie} = await this.reachabilityRequest.getClusters();
77
74
 
78
75
  // Perform Reachability Check
79
76
  const results = await this.performReachabilityCheck(clusters);
80
77
 
81
- window.localStorage.setItem(REACHABILITY.localStorage, JSON.stringify(results));
78
+ // @ts-ignore
79
+ await this.webex.boundedStorage.put(
80
+ this.namespace,
81
+ REACHABILITY.localStorageResult,
82
+ JSON.stringify(results)
83
+ );
84
+ // @ts-ignore
85
+ await this.webex.boundedStorage.put(
86
+ this.namespace,
87
+ REACHABILITY.localStorageJoinCookie,
88
+ JSON.stringify(joinCookie)
89
+ );
82
90
 
83
91
  LoggerProxy.logger.log(
84
92
  'Reachability:index#gatherReachability --> Reachability checks completed'
@@ -100,9 +108,12 @@ export default class Reachability {
100
108
  * @public
101
109
  * @memberof Reachability
102
110
  */
103
- isAnyClusterReachable() {
111
+ async isAnyClusterReachable() {
104
112
  let reachable = false;
105
- const reachabilityData = window.localStorage.getItem(REACHABILITY.localStorage);
113
+ // @ts-ignore
114
+ const reachabilityData = await this.webex.boundedStorage
115
+ .get(this.namespace, REACHABILITY.localStorageResult)
116
+ .catch(() => {});
106
117
 
107
118
  if (reachabilityData) {
108
119
  try {
@@ -261,6 +272,7 @@ export default class Reachability {
261
272
 
262
273
  // @ts-ignore
263
274
  LoggerProxy.logger.log(
275
+ // @ts-ignore
264
276
  `Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`,
265
277
  elapsed
266
278
  );
@@ -284,11 +296,13 @@ export default class Reachability {
284
296
  if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {
285
297
  const elapsed = this.getElapsedTime(peerConnection);
286
298
 
287
- // @ts-ignore
288
299
  LoggerProxy.logger.log(
300
+ // @ts-ignore
289
301
  `Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`,
290
302
  elapsed
291
303
  );
304
+ // order is important
305
+ this.addPublicIP(peerConnection, e.candidate.address);
292
306
  this.setLatencyAndClose(peerConnection, elapsed);
293
307
  }
294
308
  };
@@ -306,8 +320,9 @@ export default class Reachability {
306
320
  private iceGatheringState(peerConnection: RTCPeerConnection, timeout: number) {
307
321
  const ELAPSED = 'elapsed';
308
322
 
309
- return new Promise((resolve) => {
323
+ return new Promise<ICECandidateResult>((resolve) => {
310
324
  const peerConnectionProxy = new window.Proxy(peerConnection, {
325
+ // eslint-disable-next-line require-jsdoc
311
326
  get(target, property) {
312
327
  const targetMember = target[property];
313
328
 
@@ -321,7 +336,7 @@ export default class Reachability {
321
336
  // only intercept elapsed property
322
337
  if (property === ELAPSED) {
323
338
  // @ts-ignore
324
- resolve({clusterId: peerConnection.key, elapsed: value});
339
+ resolve({clusterId: peerConnection.key, publicIPs: target.publicIPs, elapsed: value});
325
340
 
326
341
  return true;
327
342
  }
@@ -342,6 +357,8 @@ export default class Reachability {
342
357
 
343
358
  // Close any open peerConnections
344
359
  if (peerConnectionProxy.connectionState !== CLOSED) {
360
+ // order is important
361
+ this.addPublicIP(peerConnectionProxy, null);
345
362
  this.setLatencyAndClose(peerConnectionProxy, null);
346
363
  }
347
364
  }, timeout);
@@ -366,24 +383,30 @@ export default class Reachability {
366
383
 
367
384
  /**
368
385
  * Calculates time to establish connection
369
- * @param {array} iceResults iceResults
386
+ * @param {Array<ICECandidateResult>} iceResults iceResults
370
387
  * @returns {object} reachabilityMap
371
- * @private
388
+ * @protected
372
389
  * @memberof Reachability
373
390
  */
374
- private parseIceResultsToReachabilityResults(iceResults: Array<any>) {
391
+ protected parseIceResultsToReachabilityResults(iceResults: Array<ICECandidateResult>) {
375
392
  const reachabilityMap = {};
376
393
 
377
- iceResults.forEach(({clusterId, elapsed}) => {
378
- let latencyResult;
394
+ iceResults.forEach(({clusterId, elapsed, publicIPs}) => {
395
+ const latencyResult = {};
379
396
 
380
- if (elapsed === null) {
381
- latencyResult = {reachable: 'false'};
397
+ if (!elapsed) {
398
+ Object.assign(latencyResult, {reachable: 'false'});
382
399
  } else {
383
- latencyResult = {
400
+ Object.assign(latencyResult, {
384
401
  reachable: 'true',
385
402
  latencyInMilliseconds: elapsed.toString(),
386
- };
403
+ });
404
+ }
405
+
406
+ if (publicIPs) {
407
+ Object.assign(latencyResult, {
408
+ clientMediaIPs: publicIPs,
409
+ });
387
410
  }
388
411
 
389
412
  reachabilityMap[clusterId] = {
@@ -429,6 +452,33 @@ export default class Reachability {
429
452
  });
430
453
  }
431
454
 
455
+ /**
456
+ * Adds public IP (client media IPs)
457
+ * @param {RTCPeerConnection} peerConnection
458
+ * @param {string} publicIP
459
+ * @returns {void}
460
+ */
461
+ protected addPublicIP(peerConnection: RTCPeerConnection, publicIP?: string | null) {
462
+ const modifiedPeerConnection: RTCPeerConnection & {publicIPs?: string[]} = peerConnection;
463
+ const {CLOSED} = CONNECTION_STATE;
464
+
465
+ if (modifiedPeerConnection.connectionState === CLOSED) {
466
+ LoggerProxy.logger.log(
467
+ `Reachability:index#addPublicIP --> Attempting to set publicIP of ${publicIP} on closed peerConnection.`
468
+ );
469
+ }
470
+
471
+ if (publicIP) {
472
+ if (modifiedPeerConnection.publicIPs) {
473
+ modifiedPeerConnection.publicIPs.push(publicIP);
474
+ } else {
475
+ modifiedPeerConnection.publicIPs = [publicIP];
476
+ }
477
+ } else {
478
+ modifiedPeerConnection.publicIPs = null;
479
+ }
480
+ }
481
+
432
482
  /**
433
483
  * Records latency and closes the peerConnection
434
484
  * @param {RTCPeerConnection} peerConnection
@@ -28,21 +28,23 @@ class ReachabilityRequest {
28
28
  }
29
29
 
30
30
  /**
31
- * gets the cluster information
31
+ * Gets the cluster information
32
32
  *
33
- * @param {boolean} includeVideoMesh whether to include the video mesh clusters in the result or not
34
33
  * @returns {Promise}
35
34
  */
36
- getClusters = (): Promise<ClusterList> =>
35
+ getClusters = (): Promise<{clusters: ClusterList; joinCookie: any}> =>
37
36
  this.webex
38
37
  .request({
39
38
  method: HTTP_VERBS.GET,
40
39
  shouldRefreshAccessToken: false,
41
40
  api: API.CALLIOPEDISCOVERY,
42
41
  resource: RESOURCE.CLUSTERS,
42
+ qs: {
43
+ JCSupport: 1,
44
+ },
43
45
  })
44
46
  .then((res) => {
45
- const {clusters} = res.body;
47
+ const {clusters, joinCookie} = res.body;
46
48
 
47
49
  Object.keys(clusters).forEach((key) => {
48
50
  clusters[key].isVideoMesh = res.body.clusterClasses?.hybridMedia?.includes(key);
@@ -52,7 +54,10 @@ class ReachabilityRequest {
52
54
  `Reachability:request#getClusters --> get clusters successful:${JSON.stringify(clusters)}`
53
55
  );
54
56
 
55
- return clusters;
57
+ return {
58
+ clusters,
59
+ joinCookie,
60
+ };
56
61
  });
57
62
 
58
63
  /**
@@ -0,0 +1,4 @@
1
+ // eslint-disable-next-line import/prefer-default-export
2
+ export const REACTION_RELAY_TYPES = {
3
+ REACTION: 'react',
4
+ } as const;
@@ -1,6 +1,6 @@
1
- import {Reaction, ReactionType, SkinTone, SkinToneType} from './reactions.type';
1
+ import {Reaction, ReactionServerType, SkinTone, SkinToneType} from './reactions.type';
2
2
 
3
- const Reactions: Record<ReactionType, Reaction> = {
3
+ const Reactions: Record<ReactionServerType, Reaction> = {
4
4
  smile: {
5
5
  type: 'smile',
6
6
  codepoints: '1F642',
@@ -31,12 +31,12 @@ const Reactions: Record<ReactionType, Reaction> = {
31
31
  codepoints: '1F44F',
32
32
  shortcodes: ':clap:',
33
33
  },
34
- thumbs_up: {
34
+ thumb_up: {
35
35
  type: 'thumb_up',
36
36
  codepoints: '1F44D',
37
37
  shortcodes: ':thumbsup:',
38
38
  },
39
- thumbs_down: {
39
+ thumb_down: {
40
40
  type: 'thumb_down',
41
41
  codepoints: '1F44E',
42
42
  shortcodes: ':thumbsdown:',
@@ -1,3 +1,5 @@
1
+ import {REACTION_RELAY_TYPES} from './constants';
2
+
1
3
  export type EmoticonData = {
2
4
  type: string;
3
5
  codepoints?: string;
@@ -5,20 +7,21 @@ export type EmoticonData = {
5
7
  };
6
8
 
7
9
  export type SkinTone = EmoticonData;
10
+
8
11
  export type Reaction = EmoticonData & {
9
12
  tone?: SkinTone;
10
13
  };
11
14
 
12
15
  // eslint-disable-next-line no-shadow
13
- export enum ReactionType {
16
+ export enum ReactionServerType {
14
17
  smile = 'smile',
15
18
  sad = 'sad',
16
19
  wow = 'wow',
17
20
  haha = 'haha',
18
21
  celebrate = 'celebrate',
19
22
  clap = 'clap',
20
- thumbs_up = 'thumbs_up',
21
- thumbs_down = 'thumbs_down',
23
+ thumb_up = 'thumb_up',
24
+ thumb_down = 'thumb_down',
22
25
  heart = 'heart',
23
26
  fire = 'fire',
24
27
  prayer = 'prayer',
@@ -35,3 +38,25 @@ export enum SkinToneType {
35
38
  medium_dark = 'medium_dark',
36
39
  dark = 'dark',
37
40
  }
41
+
42
+ export type Sender = {
43
+ participantId: string;
44
+ };
45
+
46
+ export type ProcessedReaction = {
47
+ reaction: Reaction;
48
+ sender: {
49
+ id: Sender['participantId'];
50
+ name: string;
51
+ };
52
+ };
53
+
54
+ type RelayEventData = {
55
+ relayType: (typeof REACTION_RELAY_TYPES)['REACTION'];
56
+ reaction: Reaction;
57
+ sender: Sender;
58
+ };
59
+
60
+ export type RelayEvent = {
61
+ data: RelayEventData;
62
+ };
@@ -18,10 +18,9 @@ import {
18
18
  import BEHAVIORAL_METRICS from '../metrics/constants';
19
19
  import ReconnectionError from '../common/errors/reconnection';
20
20
  import ReconnectInProgress from '../common/errors/reconnection-in-progress';
21
- import {eventType, reconnection, errorObjects} from '../metrics/config';
22
- import Media from '../media';
23
21
  import Metrics from '../metrics';
24
22
  import Meeting from '../meeting';
23
+ import {MediaRequestManager} from '../multistream/mediaRequestManager';
25
24
 
26
25
  /**
27
26
  * Used to indicate that the reconnect logic needs to be retried.
@@ -231,6 +230,29 @@ export default class ReconnectionManager {
231
230
  this.meeting = null;
232
231
  }
233
232
 
233
+ /**
234
+ * Stop the local share track.
235
+ *
236
+ * @param {string} reason a {@link SHARE_STOPPED_REASON}
237
+ * @returns {undefined}
238
+ * @private
239
+ * @memberof ReconnectionManager
240
+ */
241
+ private async stopLocalShareTrack(reason: string) {
242
+ await this.meeting.unpublishTracks([this.meeting.mediaProperties.shareTrack]); // todo screen share audio SPARK-399690
243
+ Trigger.trigger(
244
+ this.meeting,
245
+ {
246
+ file: 'reconnection-manager/index',
247
+ function: 'stopLocalShareTrack',
248
+ },
249
+ EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,
250
+ {
251
+ reason,
252
+ }
253
+ );
254
+ }
255
+
234
256
  /**
235
257
  * @public
236
258
  * @memberof ReconnectionManager
@@ -302,9 +324,13 @@ export default class ReconnectionManager {
302
324
  LoggerProxy.logger.info(
303
325
  'ReconnectionManager:index#reconnect --> Sending reconnect start metric.'
304
326
  );
305
- Metrics.postEvent({
306
- event: eventType.MEDIA_RECONNECTING,
307
- meeting: this.meeting,
327
+
328
+ // @ts-ignore
329
+ this.webex.internal.newMetrics.submitClientEvent({
330
+ name: 'client.media.reconnecting',
331
+ options: {
332
+ meetingId: this.meeting.id,
333
+ },
308
334
  });
309
335
  }
310
336
 
@@ -314,10 +340,16 @@ export default class ReconnectionManager {
314
340
  LoggerProxy.logger.info(
315
341
  'ReconnectionManager:index#reconnect --> Sending reconnect success metric.'
316
342
  );
317
- Metrics.postEvent({
318
- event: eventType.MEDIA_RECOVERED,
319
- meeting: this.meeting,
320
- data: {recoveredBy: reconnection.RECOVERED_BY_NEW},
343
+
344
+ // @ts-ignore
345
+ this.webex.internal.newMetrics.submitClientEvent({
346
+ name: 'client.media.recovered',
347
+ payload: {
348
+ recoveredBy: 'new',
349
+ },
350
+ options: {
351
+ meetingId: this.meeting.id,
352
+ },
321
353
  });
322
354
  })
323
355
  .catch((reconnectError) => {
@@ -341,23 +373,24 @@ export default class ReconnectionManager {
341
373
  'ReconnectionManager:index#reconnect --> Sending reconnect abort metric.'
342
374
  );
343
375
 
344
- const reconnectMetric = {
345
- event: eventType.CALL_ABORTED,
346
- meeting: this.meeting,
347
- data: {
376
+ // @ts-ignore
377
+ this.webex.internal.newMetrics.submitClientEvent({
378
+ name: 'client.call.aborted',
379
+ payload: {
348
380
  errors: [
349
381
  {
350
- category: errorObjects.category.expected,
382
+ category: 'expected',
351
383
  errorCode: 2008,
352
384
  fatal: true,
353
- name: errorObjects.name.mediaEngine,
385
+ name: 'media-engine',
354
386
  shownToUser: false,
355
387
  },
356
388
  ],
357
389
  },
358
- };
359
-
360
- Metrics.postEvent(reconnectMetric);
390
+ options: {
391
+ meetingId: this.meeting.id,
392
+ },
393
+ });
361
394
  if (reconnectError instanceof NeedsRejoinError) {
362
395
  // send call aborded event with catogery as expected as we are trying to rejoin
363
396
 
@@ -385,6 +418,12 @@ export default class ReconnectionManager {
385
418
  'ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.'
386
419
  );
387
420
 
421
+ const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;
422
+
423
+ if (wasSharing) {
424
+ await this.stopLocalShareTrack(SHARE_STOPPED_REASON.MEDIA_RECONNECTION);
425
+ }
426
+
388
427
  if (networkDisconnect) {
389
428
  try {
390
429
  await this.reconnectMercuryWebSocket();
@@ -401,8 +440,6 @@ export default class ReconnectionManager {
401
440
  }
402
441
  }
403
442
 
404
- const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;
405
-
406
443
  try {
407
444
  LoggerProxy.logger.info(
408
445
  'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'
@@ -420,10 +457,10 @@ export default class ReconnectionManager {
420
457
  // So that on rejoin it known what parametrs it was using
421
458
  if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {
422
459
  LoggerProxy.logger.info(
423
- 'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely '
460
+ 'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely.'
424
461
  );
425
462
 
426
- throw new Error('Unable to rejoin a meeting already ended or inactive .');
463
+ throw new Error('Unable to rejoin a meeting already ended or inactive.');
427
464
  }
428
465
 
429
466
  LoggerProxy.logger.info(
@@ -475,24 +512,7 @@ export default class ReconnectionManager {
475
512
  LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');
476
513
 
477
514
  if (wasSharing) {
478
- // Stop the share streams if user tried to rejoin
479
- Media.stopTracks(this.meeting.mediaProperties.shareTrack);
480
- this.meeting.isSharing = false;
481
- if (this.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE) {
482
- this.meeting.shareStatus = SHARE_STATUS.NO_SHARE;
483
- }
484
- this.meeting.mediaProperties.mediaDirection.sendShare = false;
485
- Trigger.trigger(
486
- this.meeting,
487
- {
488
- file: 'reconnection-manager/index',
489
- function: 'rejoinMeeting',
490
- },
491
- EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,
492
- {
493
- reason: SHARE_STOPPED_REASON.MEETING_REJOIN,
494
- }
495
- );
515
+ await this.stopLocalShareTrack(SHARE_STOPPED_REASON.MEETING_REJOIN);
496
516
  }
497
517
  } catch (joinError) {
498
518
  this.rejoinAttempts += 1;
@@ -538,19 +558,30 @@ export default class ReconnectionManager {
538
558
  'ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media'
539
559
  );
540
560
 
541
- // we are not simply calling this.meeting.mediaProperties.webrtcMediaConnection.reconnect(),
542
- // but instead manually closing and creating new media connection, because we need to do the TURN discovery again
543
-
544
- await this.meeting.closePeerConnections();
545
- this.meeting.mediaProperties.unsetPeerConnection();
546
-
561
+ // do the TURN server discovery again since the TURN server might change
547
562
  const turnServerResult = await this.meeting.roap.doTurnDiscovery(this.meeting, true);
548
563
 
549
- const mc = this.meeting.createMediaConnection(turnServerResult.turnServerInfo);
564
+ const iceServers = [];
550
565
 
551
- this.meeting.statsAnalyzer.updateMediaConnection(mc);
566
+ if (turnServerResult.turnServerInfo) {
567
+ iceServers.push({
568
+ urls: turnServerResult.turnServerInfo.url,
569
+ username: turnServerResult.turnServerInfo.username || '',
570
+ credential: turnServerResult.turnServerInfo.password || '',
571
+ });
572
+ }
552
573
 
553
- return mc.initiateOffer();
574
+ await this.meeting.mediaProperties.webrtcMediaConnection.reconnect(iceServers);
575
+
576
+ // resend media requests
577
+ if (this.meeting.isMultistream) {
578
+ Object.values(this.meeting.mediaRequestManagers).forEach(
579
+ (mediaRequestManager: MediaRequestManager) => {
580
+ mediaRequestManager.clearPreviousRequests();
581
+ mediaRequestManager.commit();
582
+ }
583
+ );
584
+ }
554
585
  }
555
586
 
556
587
  /**
@@ -0,0 +1,8 @@
1
+ enum RecordingAction {
2
+ Start = 'Start',
3
+ Stop = 'Stop',
4
+ Pause = 'Pause',
5
+ Resume = 'Resume',
6
+ }
7
+
8
+ export default RecordingAction;