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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (517) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.d.ts +42 -0
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.d.ts +31 -0
  6. package/dist/annotation/constants.js +41 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.d.ts +117 -0
  9. package/dist/annotation/index.js +357 -0
  10. package/dist/annotation/index.js.map +1 -0
  11. package/dist/breakouts/breakout.d.ts +8 -0
  12. package/dist/breakouts/breakout.js +215 -0
  13. package/dist/breakouts/breakout.js.map +1 -0
  14. package/dist/breakouts/collection.d.ts +5 -0
  15. package/dist/breakouts/collection.js +22 -0
  16. package/dist/breakouts/collection.js.map +1 -0
  17. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  18. package/dist/breakouts/edit-lock-error.js +51 -0
  19. package/dist/breakouts/edit-lock-error.js.map +1 -0
  20. package/dist/breakouts/events.d.ts +8 -0
  21. package/dist/breakouts/events.js +44 -0
  22. package/dist/breakouts/events.js.map +1 -0
  23. package/dist/breakouts/index.d.ts +5 -0
  24. package/dist/breakouts/index.js +1047 -0
  25. package/dist/breakouts/index.js.map +1 -0
  26. package/dist/breakouts/request.d.ts +22 -0
  27. package/dist/breakouts/request.js +77 -0
  28. package/dist/breakouts/request.js.map +1 -0
  29. package/dist/breakouts/utils.d.ts +15 -0
  30. package/dist/breakouts/utils.js +64 -0
  31. package/dist/breakouts/utils.js.map +1 -0
  32. package/dist/common/browser-detection.js +2 -3
  33. package/dist/common/browser-detection.js.map +1 -1
  34. package/dist/common/collection.js +3 -4
  35. package/dist/common/collection.js.map +1 -1
  36. package/dist/common/config.js +1 -2
  37. package/dist/common/config.js.map +1 -1
  38. package/dist/common/errors/captcha-error.js +1 -2
  39. package/dist/common/errors/captcha-error.js.map +1 -1
  40. package/dist/common/errors/intent-to-join.js +1 -2
  41. package/dist/common/errors/intent-to-join.js.map +1 -1
  42. package/dist/common/errors/join-meeting.js +1 -2
  43. package/dist/common/errors/join-meeting.js.map +1 -1
  44. package/dist/common/errors/media.js +1 -2
  45. package/dist/common/errors/media.js.map +1 -1
  46. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  47. package/dist/common/errors/no-meeting-info.js +50 -0
  48. package/dist/common/errors/no-meeting-info.js.map +1 -0
  49. package/dist/common/errors/parameter.js +3 -4
  50. package/dist/common/errors/parameter.js.map +1 -1
  51. package/dist/common/errors/password-error.js +1 -2
  52. package/dist/common/errors/password-error.js.map +1 -1
  53. package/dist/common/errors/permission.js +1 -2
  54. package/dist/common/errors/permission.js.map +1 -1
  55. package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
  56. package/dist/common/errors/reclaim-host-role-errors.js +154 -0
  57. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  58. package/dist/common/errors/reconnection-in-progress.js +1 -2
  59. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  60. package/dist/common/errors/reconnection.js +1 -2
  61. package/dist/common/errors/reconnection.js.map +1 -1
  62. package/dist/common/errors/stats.js +1 -2
  63. package/dist/common/errors/stats.js.map +1 -1
  64. package/dist/common/errors/webex-errors.d.ts +20 -8
  65. package/dist/common/errors/webex-errors.js +48 -28
  66. package/dist/common/errors/webex-errors.js.map +1 -1
  67. package/dist/common/errors/webex-meetings-error.js +1 -2
  68. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  69. package/dist/common/events/events-scope.js +1 -2
  70. package/dist/common/events/events-scope.js.map +1 -1
  71. package/dist/common/events/events.js +1 -2
  72. package/dist/common/events/events.js.map +1 -1
  73. package/dist/common/events/trigger-proxy.js +1 -2
  74. package/dist/common/events/trigger-proxy.js.map +1 -1
  75. package/dist/common/events/util.js +1 -2
  76. package/dist/common/events/util.js.map +1 -1
  77. package/dist/common/logs/logger-config.js +1 -2
  78. package/dist/common/logs/logger-config.js.map +1 -1
  79. package/dist/common/logs/logger-proxy.js +2 -3
  80. package/dist/common/logs/logger-proxy.js.map +1 -1
  81. package/dist/common/logs/request.d.ts +3 -1
  82. package/dist/common/logs/request.js +8 -5
  83. package/dist/common/logs/request.js.map +1 -1
  84. package/dist/common/queue.d.ts +9 -7
  85. package/dist/common/queue.js +22 -9
  86. package/dist/common/queue.js.map +1 -1
  87. package/dist/config.d.ts +5 -7
  88. package/dist/config.js +8 -11
  89. package/dist/config.js.map +1 -1
  90. package/dist/constants.d.ts +243 -97
  91. package/dist/constants.js +437 -435
  92. package/dist/constants.js.map +1 -1
  93. package/dist/controls-options-manager/constants.js +3 -6
  94. package/dist/controls-options-manager/constants.js.map +1 -1
  95. package/dist/controls-options-manager/enums.d.ts +11 -1
  96. package/dist/controls-options-manager/enums.js +15 -6
  97. package/dist/controls-options-manager/enums.js.map +1 -1
  98. package/dist/controls-options-manager/index.d.ts +17 -1
  99. package/dist/controls-options-manager/index.js +127 -38
  100. package/dist/controls-options-manager/index.js.map +1 -1
  101. package/dist/controls-options-manager/types.d.ts +43 -0
  102. package/dist/controls-options-manager/types.js +7 -0
  103. package/dist/controls-options-manager/types.js.map +1 -0
  104. package/dist/controls-options-manager/util.d.ts +1 -7
  105. package/dist/controls-options-manager/util.js +309 -19
  106. package/dist/controls-options-manager/util.js.map +1 -1
  107. package/dist/index.d.ts +6 -3
  108. package/dist/index.js +116 -4
  109. package/dist/index.js.map +1 -1
  110. package/dist/interpretation/collection.d.ts +5 -0
  111. package/dist/interpretation/collection.js +22 -0
  112. package/dist/interpretation/collection.js.map +1 -0
  113. package/dist/interpretation/index.d.ts +5 -0
  114. package/dist/interpretation/index.js +365 -0
  115. package/dist/interpretation/index.js.map +1 -0
  116. package/dist/interpretation/siLanguage.d.ts +5 -0
  117. package/dist/interpretation/siLanguage.js +24 -0
  118. package/dist/interpretation/siLanguage.js.map +1 -0
  119. package/dist/locus-info/controlsUtils.js +100 -11
  120. package/dist/locus-info/controlsUtils.js.map +1 -1
  121. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  122. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  123. package/dist/locus-info/fullState.js +1 -2
  124. package/dist/locus-info/fullState.js.map +1 -1
  125. package/dist/locus-info/hostUtils.js +1 -2
  126. package/dist/locus-info/hostUtils.js.map +1 -1
  127. package/dist/locus-info/index.d.ts +57 -4
  128. package/dist/locus-info/index.js +425 -84
  129. package/dist/locus-info/index.js.map +1 -1
  130. package/dist/locus-info/infoUtils.js +13 -5
  131. package/dist/locus-info/infoUtils.js.map +1 -1
  132. package/dist/locus-info/mediaSharesUtils.js +58 -3
  133. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  134. package/dist/locus-info/parser.d.ts +66 -6
  135. package/dist/locus-info/parser.js +253 -80
  136. package/dist/locus-info/parser.js.map +1 -1
  137. package/dist/locus-info/selfUtils.js +97 -13
  138. package/dist/locus-info/selfUtils.js.map +1 -1
  139. package/dist/media/index.d.ts +2 -0
  140. package/dist/media/index.js +107 -319
  141. package/dist/media/index.js.map +1 -1
  142. package/dist/media/properties.d.ts +38 -53
  143. package/dist/media/properties.js +96 -153
  144. package/dist/media/properties.js.map +1 -1
  145. package/dist/media/util.js +1 -22
  146. package/dist/media/util.js.map +1 -1
  147. package/dist/mediaQualityMetrics/config.d.ts +234 -230
  148. package/dist/mediaQualityMetrics/config.js +302 -498
  149. package/dist/mediaQualityMetrics/config.js.map +1 -1
  150. package/dist/meeting/in-meeting-actions.d.ts +88 -0
  151. package/dist/meeting/in-meeting-actions.js +94 -3
  152. package/dist/meeting/in-meeting-actions.js.map +1 -1
  153. package/dist/meeting/index.d.ts +591 -494
  154. package/dist/meeting/index.js +4728 -2990
  155. package/dist/meeting/index.js.map +1 -1
  156. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  157. package/dist/meeting/locusMediaRequest.js +291 -0
  158. package/dist/meeting/locusMediaRequest.js.map +1 -0
  159. package/dist/meeting/muteState.d.ts +93 -25
  160. package/dist/meeting/muteState.js +224 -133
  161. package/dist/meeting/muteState.js.map +1 -1
  162. package/dist/meeting/request.d.ts +82 -47
  163. package/dist/meeting/request.js +297 -199
  164. package/dist/meeting/request.js.map +1 -1
  165. package/dist/meeting/request.type.d.ts +11 -0
  166. package/dist/meeting/request.type.js +7 -0
  167. package/dist/meeting/request.type.js.map +1 -0
  168. package/dist/meeting/state.js +1 -2
  169. package/dist/meeting/state.js.map +1 -1
  170. package/dist/meeting/util.d.ts +102 -1
  171. package/dist/meeting/util.js +605 -435
  172. package/dist/meeting/util.js.map +1 -1
  173. package/dist/meeting-info/collection.js +3 -4
  174. package/dist/meeting-info/collection.js.map +1 -1
  175. package/dist/meeting-info/index.d.ts +13 -1
  176. package/dist/meeting-info/index.js +74 -7
  177. package/dist/meeting-info/index.js.map +1 -1
  178. package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
  179. package/dist/meeting-info/meeting-info-v2.js +200 -63
  180. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  181. package/dist/meeting-info/request.js +1 -2
  182. package/dist/meeting-info/request.js.map +1 -1
  183. package/dist/meeting-info/util.js +2 -3
  184. package/dist/meeting-info/util.js.map +1 -1
  185. package/dist/meeting-info/utilv2.js +39 -41
  186. package/dist/meeting-info/utilv2.js.map +1 -1
  187. package/dist/meetings/collection.d.ts +17 -0
  188. package/dist/meetings/collection.js +42 -4
  189. package/dist/meetings/collection.js.map +1 -1
  190. package/dist/meetings/index.d.ts +103 -21
  191. package/dist/meetings/index.js +486 -124
  192. package/dist/meetings/index.js.map +1 -1
  193. package/dist/meetings/meetings.types.d.ts +4 -0
  194. package/dist/meetings/meetings.types.js +7 -0
  195. package/dist/meetings/meetings.types.js.map +1 -0
  196. package/dist/meetings/request.js +4 -3
  197. package/dist/meetings/request.js.map +1 -1
  198. package/dist/meetings/util.js +107 -6
  199. package/dist/meetings/util.js.map +1 -1
  200. package/dist/member/index.d.ts +14 -1
  201. package/dist/member/index.js +54 -2
  202. package/dist/member/index.js.map +1 -1
  203. package/dist/member/member.types.js +3 -4
  204. package/dist/member/member.types.js.map +1 -1
  205. package/dist/member/types.d.ts +32 -0
  206. package/dist/member/types.js +23 -0
  207. package/dist/member/types.js.map +1 -0
  208. package/dist/member/util.js +131 -29
  209. package/dist/member/util.js.map +1 -1
  210. package/dist/members/collection.d.ts +5 -0
  211. package/dist/members/collection.js +11 -2
  212. package/dist/members/collection.js.map +1 -1
  213. package/dist/members/index.d.ts +57 -2
  214. package/dist/members/index.js +174 -10
  215. package/dist/members/index.js.map +1 -1
  216. package/dist/members/request.d.ts +73 -9
  217. package/dist/members/request.js +108 -41
  218. package/dist/members/request.js.map +1 -1
  219. package/dist/members/types.d.ts +25 -0
  220. package/dist/members/types.js +14 -0
  221. package/dist/members/types.js.map +1 -0
  222. package/dist/members/util.d.ts +214 -1
  223. package/dist/members/util.js +327 -234
  224. package/dist/members/util.js.map +1 -1
  225. package/dist/metrics/constants.d.ts +15 -6
  226. package/dist/metrics/constants.js +17 -9
  227. package/dist/metrics/constants.js.map +1 -1
  228. package/dist/metrics/index.d.ts +4 -111
  229. package/dist/metrics/index.js +4 -452
  230. package/dist/metrics/index.js.map +1 -1
  231. package/dist/multistream/mediaRequestManager.d.ts +118 -0
  232. package/dist/multistream/mediaRequestManager.js +344 -0
  233. package/dist/multistream/mediaRequestManager.js.map +1 -0
  234. package/dist/multistream/receiveSlot.d.ts +68 -0
  235. package/dist/multistream/receiveSlot.js +200 -0
  236. package/dist/multistream/receiveSlot.js.map +1 -0
  237. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  238. package/dist/multistream/receiveSlotManager.js +174 -0
  239. package/dist/multistream/receiveSlotManager.js.map +1 -0
  240. package/dist/multistream/remoteMedia.d.ts +72 -0
  241. package/dist/multistream/remoteMedia.js +268 -0
  242. package/dist/multistream/remoteMedia.js.map +1 -0
  243. package/dist/multistream/remoteMediaGroup.d.ts +47 -0
  244. package/dist/multistream/remoteMediaGroup.js +267 -0
  245. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  246. package/dist/multistream/remoteMediaManager.d.ts +285 -0
  247. package/dist/multistream/remoteMediaManager.js +1211 -0
  248. package/dist/multistream/remoteMediaManager.js.map +1 -0
  249. package/dist/multistream/sendSlotManager.d.ts +61 -0
  250. package/dist/multistream/sendSlotManager.js +236 -0
  251. package/dist/multistream/sendSlotManager.js.map +1 -0
  252. package/dist/networkQualityMonitor/index.js +5 -4
  253. package/dist/networkQualityMonitor/index.js.map +1 -1
  254. package/dist/personal-meeting-room/index.js +2 -3
  255. package/dist/personal-meeting-room/index.js.map +1 -1
  256. package/dist/personal-meeting-room/request.js +2 -3
  257. package/dist/personal-meeting-room/request.js.map +1 -1
  258. package/dist/personal-meeting-room/util.js +1 -2
  259. package/dist/personal-meeting-room/util.js.map +1 -1
  260. package/dist/reachability/index.d.ts +62 -7
  261. package/dist/reachability/index.js +265 -72
  262. package/dist/reachability/index.js.map +1 -1
  263. package/dist/reachability/request.d.ts +7 -3
  264. package/dist/reachability/request.js +18 -10
  265. package/dist/reachability/request.js.map +1 -1
  266. package/dist/reactions/constants.d.ts +3 -0
  267. package/dist/reactions/constants.js +12 -0
  268. package/dist/reactions/constants.js.map +1 -0
  269. package/dist/reactions/reactions.d.ts +2 -2
  270. package/dist/reactions/reactions.js +4 -6
  271. package/dist/reactions/reactions.js.map +1 -1
  272. package/dist/reactions/reactions.type.d.ts +23 -3
  273. package/dist/reactions/reactions.type.js +21 -23
  274. package/dist/reactions/reactions.type.js.map +1 -1
  275. package/dist/reconnection-manager/index.d.ts +32 -8
  276. package/dist/reconnection-manager/index.js +282 -231
  277. package/dist/reconnection-manager/index.js.map +1 -1
  278. package/dist/recording-controller/enums.js +4 -5
  279. package/dist/recording-controller/enums.js.map +1 -1
  280. package/dist/recording-controller/index.d.ts +15 -1
  281. package/dist/recording-controller/index.js +57 -46
  282. package/dist/recording-controller/index.js.map +1 -1
  283. package/dist/recording-controller/util.d.ts +5 -4
  284. package/dist/recording-controller/util.js +10 -10
  285. package/dist/recording-controller/util.js.map +1 -1
  286. package/dist/roap/index.d.ts +9 -47
  287. package/dist/roap/index.js +101 -235
  288. package/dist/roap/index.js.map +1 -1
  289. package/dist/roap/request.d.ts +18 -12
  290. package/dist/roap/request.js +126 -180
  291. package/dist/roap/request.js.map +1 -1
  292. package/dist/roap/turnDiscovery.d.ts +27 -16
  293. package/dist/roap/turnDiscovery.js +115 -105
  294. package/dist/roap/turnDiscovery.js.map +1 -1
  295. package/dist/rtcMetrics/constants.d.ts +4 -0
  296. package/dist/rtcMetrics/constants.js +11 -0
  297. package/dist/rtcMetrics/constants.js.map +1 -0
  298. package/dist/rtcMetrics/index.d.ts +54 -0
  299. package/dist/rtcMetrics/index.js +140 -0
  300. package/dist/rtcMetrics/index.js.map +1 -0
  301. package/dist/statsAnalyzer/global.d.ts +1 -83
  302. package/dist/statsAnalyzer/global.js +2 -85
  303. package/dist/statsAnalyzer/global.js.map +1 -1
  304. package/dist/statsAnalyzer/index.d.ts +28 -30
  305. package/dist/statsAnalyzer/index.js +374 -509
  306. package/dist/statsAnalyzer/index.js.map +1 -1
  307. package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
  308. package/dist/statsAnalyzer/mqaUtil.js +116 -83
  309. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  310. package/dist/transcription/index.js +1 -2
  311. package/dist/transcription/index.js.map +1 -1
  312. package/dist/webinar/collection.d.ts +16 -0
  313. package/dist/webinar/collection.js +43 -0
  314. package/dist/webinar/collection.js.map +1 -0
  315. package/dist/webinar/index.d.ts +5 -0
  316. package/dist/webinar/index.js +68 -0
  317. package/dist/webinar/index.js.map +1 -0
  318. package/package.json +35 -26
  319. package/src/annotation/annotation.types.ts +50 -0
  320. package/src/annotation/constants.ts +36 -0
  321. package/src/annotation/index.ts +328 -0
  322. package/src/breakouts/README.md +220 -0
  323. package/src/breakouts/breakout.ts +188 -0
  324. package/src/breakouts/collection.ts +19 -0
  325. package/src/breakouts/edit-lock-error.ts +25 -0
  326. package/src/breakouts/events.ts +56 -0
  327. package/src/breakouts/index.ts +925 -0
  328. package/src/breakouts/request.ts +55 -0
  329. package/src/breakouts/utils.ts +57 -0
  330. package/src/common/errors/no-meeting-info.ts +24 -0
  331. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  332. package/src/common/errors/webex-errors.ts +36 -12
  333. package/src/common/logs/logger-proxy.ts +1 -1
  334. package/src/common/logs/request.ts +5 -1
  335. package/src/common/queue.ts +22 -8
  336. package/src/config.ts +5 -7
  337. package/src/constants.ts +271 -93
  338. package/src/controls-options-manager/enums.ts +12 -0
  339. package/src/controls-options-manager/index.ts +116 -21
  340. package/src/controls-options-manager/types.ts +59 -0
  341. package/src/controls-options-manager/util.ts +294 -14
  342. package/src/index.ts +40 -0
  343. package/src/interpretation/README.md +60 -0
  344. package/src/interpretation/collection.ts +19 -0
  345. package/src/interpretation/index.ts +332 -0
  346. package/src/interpretation/siLanguage.ts +18 -0
  347. package/src/locus-info/controlsUtils.ts +110 -0
  348. package/src/locus-info/index.ts +449 -61
  349. package/src/locus-info/infoUtils.ts +14 -2
  350. package/src/locus-info/mediaSharesUtils.ts +64 -0
  351. package/src/locus-info/parser.ts +258 -47
  352. package/src/locus-info/selfUtils.ts +85 -2
  353. package/src/media/index.ts +153 -370
  354. package/src/media/properties.ts +106 -136
  355. package/src/media/util.ts +0 -21
  356. package/src/mediaQualityMetrics/config.ts +244 -377
  357. package/src/meeting/in-meeting-actions.ts +176 -0
  358. package/src/meeting/index.ts +3895 -2448
  359. package/src/meeting/locusMediaRequest.ts +313 -0
  360. package/src/meeting/muteState.ts +224 -138
  361. package/src/meeting/request.ts +207 -127
  362. package/src/meeting/request.type.ts +13 -0
  363. package/src/meeting/util.ts +590 -423
  364. package/src/meeting-info/index.ts +81 -8
  365. package/src/meeting-info/meeting-info-v2.ts +163 -13
  366. package/src/meeting-info/util.ts +1 -1
  367. package/src/meeting-info/utilv2.ts +28 -28
  368. package/src/meetings/collection.ts +33 -0
  369. package/src/meetings/index.ts +486 -126
  370. package/src/meetings/meetings.types.ts +12 -0
  371. package/src/meetings/request.ts +2 -0
  372. package/src/meetings/util.ts +116 -5
  373. package/src/member/index.ts +52 -1
  374. package/src/member/types.ts +38 -0
  375. package/src/member/util.ts +139 -28
  376. package/src/members/collection.ts +8 -0
  377. package/src/members/index.ts +196 -7
  378. package/src/members/request.ts +97 -17
  379. package/src/members/types.ts +29 -0
  380. package/src/members/util.ts +333 -240
  381. package/src/metrics/constants.ts +15 -6
  382. package/src/metrics/index.ts +1 -471
  383. package/src/multistream/mediaRequestManager.ts +440 -0
  384. package/src/multistream/receiveSlot.ts +184 -0
  385. package/src/multistream/receiveSlotManager.ts +166 -0
  386. package/src/multistream/remoteMedia.ts +254 -0
  387. package/src/multistream/remoteMediaGroup.ts +284 -0
  388. package/src/multistream/remoteMediaManager.ts +1145 -0
  389. package/src/multistream/sendSlotManager.ts +170 -0
  390. package/src/networkQualityMonitor/index.ts +6 -6
  391. package/src/reachability/index.ts +238 -45
  392. package/src/reachability/request.ts +17 -8
  393. package/src/reactions/constants.ts +4 -0
  394. package/src/reactions/reactions.ts +4 -4
  395. package/src/reactions/reactions.type.ts +30 -4
  396. package/src/reconnection-manager/index.ts +168 -156
  397. package/src/recording-controller/index.ts +20 -3
  398. package/src/recording-controller/util.ts +26 -9
  399. package/src/roap/index.ts +98 -241
  400. package/src/roap/request.ts +74 -148
  401. package/src/roap/turnDiscovery.ts +62 -56
  402. package/src/rtcMetrics/constants.ts +3 -0
  403. package/src/rtcMetrics/index.ts +124 -0
  404. package/src/statsAnalyzer/global.ts +1 -84
  405. package/src/statsAnalyzer/index.ts +413 -642
  406. package/src/statsAnalyzer/mqaUtil.ts +111 -114
  407. package/src/webinar/collection.ts +31 -0
  408. package/src/webinar/index.ts +62 -0
  409. package/test/integration/spec/converged-space-meetings.js +233 -0
  410. package/test/integration/spec/journey.js +320 -264
  411. package/test/integration/spec/space-meeting.js +77 -4
  412. package/test/unit/spec/annotation/index.ts +418 -0
  413. package/test/unit/spec/breakouts/breakout.ts +237 -0
  414. package/test/unit/spec/breakouts/collection.ts +15 -0
  415. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  416. package/test/unit/spec/breakouts/events.ts +89 -0
  417. package/test/unit/spec/breakouts/index.ts +1790 -0
  418. package/test/unit/spec/breakouts/request.ts +104 -0
  419. package/test/unit/spec/breakouts/utils.js +72 -0
  420. package/test/unit/spec/common/queue.js +31 -2
  421. package/test/unit/spec/controls-options-manager/index.js +163 -0
  422. package/test/unit/spec/controls-options-manager/util.js +576 -60
  423. package/test/unit/spec/fixture/locus.js +1 -0
  424. package/test/unit/spec/interpretation/collection.ts +15 -0
  425. package/test/unit/spec/interpretation/index.ts +589 -0
  426. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  427. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  428. package/test/unit/spec/locus-info/index.js +1390 -16
  429. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  430. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  431. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  432. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  433. package/test/unit/spec/locus-info/parser.js +116 -35
  434. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  435. package/test/unit/spec/media/index.ts +290 -0
  436. package/test/unit/spec/media/properties.ts +75 -84
  437. package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
  438. package/test/unit/spec/meeting/index.js +8181 -2770
  439. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  440. package/test/unit/spec/meeting/muteState.js +409 -213
  441. package/test/unit/spec/meeting/request.js +512 -42
  442. package/test/unit/spec/meeting/utils.js +741 -24
  443. package/test/unit/spec/meeting-info/index.js +300 -0
  444. package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
  445. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  446. package/test/unit/spec/meetings/collection.js +26 -0
  447. package/test/unit/spec/meetings/index.js +1284 -217
  448. package/test/unit/spec/meetings/utils.js +202 -2
  449. package/test/unit/spec/member/index.js +38 -8
  450. package/test/unit/spec/member/util.js +499 -29
  451. package/test/unit/spec/members/index.js +597 -3
  452. package/test/unit/spec/members/request.js +206 -27
  453. package/test/unit/spec/members/utils.js +210 -0
  454. package/test/unit/spec/metrics/index.js +1 -50
  455. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  456. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  457. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  458. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  459. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  460. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  461. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  462. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  463. package/test/unit/spec/reachability/index.ts +598 -24
  464. package/test/unit/spec/reachability/request.js +68 -0
  465. package/test/unit/spec/reconnection-manager/index.js +162 -24
  466. package/test/unit/spec/recording-controller/index.js +293 -218
  467. package/test/unit/spec/recording-controller/util.js +223 -96
  468. package/test/unit/spec/roap/index.ts +200 -76
  469. package/test/unit/spec/roap/request.ts +232 -0
  470. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  471. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  472. package/test/unit/spec/stats-analyzer/index.js +188 -174
  473. package/test/unit/spec/webinar/collection.ts +13 -0
  474. package/test/unit/spec/webinar/index.ts +60 -0
  475. package/test/utils/constants.js +9 -0
  476. package/test/utils/integrationTestUtils.js +46 -0
  477. package/test/utils/testUtils.js +0 -45
  478. package/test/utils/webex-config.js +4 -0
  479. package/test/utils/webex-test-users.js +7 -3
  480. package/dist/meeting/effectsState.d.ts +0 -42
  481. package/dist/meeting/effectsState.js +0 -260
  482. package/dist/meeting/effectsState.js.map +0 -1
  483. package/dist/metrics/config.d.ts +0 -169
  484. package/dist/metrics/config.js +0 -289
  485. package/dist/metrics/config.js.map +0 -1
  486. package/dist/peer-connection-manager/index.d.ts +0 -6
  487. package/dist/peer-connection-manager/index.js +0 -671
  488. package/dist/peer-connection-manager/index.js.map +0 -1
  489. package/dist/peer-connection-manager/util.d.ts +0 -6
  490. package/dist/peer-connection-manager/util.js +0 -110
  491. package/dist/peer-connection-manager/util.js.map +0 -1
  492. package/dist/roap/collection.d.ts +0 -10
  493. package/dist/roap/collection.js +0 -63
  494. package/dist/roap/collection.js.map +0 -1
  495. package/dist/roap/handler.d.ts +0 -47
  496. package/dist/roap/handler.js +0 -279
  497. package/dist/roap/handler.js.map +0 -1
  498. package/dist/roap/state.d.ts +0 -9
  499. package/dist/roap/state.js +0 -127
  500. package/dist/roap/state.js.map +0 -1
  501. package/dist/roap/util.d.ts +0 -2
  502. package/dist/roap/util.js +0 -76
  503. package/dist/roap/util.js.map +0 -1
  504. package/src/index.js +0 -15
  505. package/src/meeting/effectsState.ts +0 -209
  506. package/src/metrics/config.ts +0 -485
  507. package/src/peer-connection-manager/index.ts +0 -847
  508. package/src/peer-connection-manager/util.ts +0 -119
  509. package/src/roap/collection.ts +0 -62
  510. package/src/roap/handler.ts +0 -294
  511. package/src/roap/state.ts +0 -156
  512. package/src/roap/util.ts +0 -100
  513. package/test/unit/spec/meeting/effectsState.js +0 -281
  514. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  515. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  516. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  517. package/test/unit/spec/roap/util.js +0 -30
@@ -1,102 +1,229 @@
1
1
  import RecordingUtil from '@webex/plugin-meetings/src/recording-controller/util';
2
2
  import RecordingAction from '@webex/plugin-meetings/src/recording-controller/enums';
3
- import { assert } from 'chai';
3
+ import {SELF_POLICY} from '@webex/plugin-meetings/src/constants';
4
+
5
+ import {assert} from 'chai';
4
6
 
5
7
  describe('plugin-meetings', () => {
6
- describe('recording-controller tests', () => {
7
- describe('recording util tests', () => {
8
-
9
- let locusInfo;
10
-
11
- beforeEach(() => {
12
- locusInfo = {
13
- parsedLocus: {
14
- info: {
15
- userDisplayHints: [],
16
- },
17
- },
18
- };
19
- });
20
-
21
- describe('canUserStart', () => {
22
- it('can start recording when the correct display hint is present', () => {
23
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_START');
24
-
25
- assert.equal(RecordingUtil.canUserStart(locusInfo.parsedLocus.info.userDisplayHints), true);
26
- });
27
-
28
- it('rejects when correct display hint is not present', () => {
29
- assert.equal(RecordingUtil.canUserStart(locusInfo.parsedLocus.info.userDisplayHints), false);
30
- });
31
- });
32
-
33
- describe('canUserPause', () => {
34
- it('can pause recording when the correct display hint is present', () => {
35
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_PAUSE');
36
-
37
- assert.equal(RecordingUtil.canUserPause(locusInfo.parsedLocus.info.userDisplayHints), true);
38
- });
39
-
40
- it('rejects when correct display hint is not present', () => {
41
- assert.equal(RecordingUtil.canUserPause(locusInfo.parsedLocus.info.userDisplayHints), false);
42
- });
43
- });
44
-
45
- describe('canUserStop', () => {
46
- it('can stop recording when the correct display hint is present', () => {
47
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_STOP');
48
-
49
- assert.equal(RecordingUtil.canUserStop(locusInfo.parsedLocus.info.userDisplayHints), true);
50
- });
51
-
52
- it('rejects when correct display hint is not present', () => {
53
- assert.equal(RecordingUtil.canUserStop(locusInfo.parsedLocus.info.userDisplayHints), false);
54
- });
55
- });
56
-
57
- describe('canUserResume', () => {
58
- it('can start recording when the correct display hint is present', () => {
59
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_RESUME');
60
-
61
- assert.equal(RecordingUtil.canUserResume(locusInfo.parsedLocus.info.userDisplayHints), true);
62
- });
63
-
64
- it('rejects when correct display hint is not present', () => {
65
- assert.equal(RecordingUtil.canUserResume(locusInfo.parsedLocus.info.userDisplayHints), false);
66
- });
67
- });
68
-
69
- describe('deriveRecordingStates', () => {
70
- it('gets the correct values for a start recording action', () => {
71
- assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Start), {recording: true, paused: false});
72
- });
73
-
74
- it('gets the correct values for a stop recording action', () => {
75
- assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Stop), {recording: false, paused: false});
76
- });
77
-
78
- it('gets the correct values for a resume recording action', () => {
79
- assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Resume), {recording: true, paused: false});
80
- });
81
-
82
- it('gets the correct values for a paused recording action', () => {
83
- assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Pause), {recording: true, paused: true});
84
- });
85
- });
86
-
87
- describe('extractLocusId', () => {
88
- it('gets the correct id from the url param', () => {
89
- assert.equal(RecordingUtil.extractLocusId('test/id'), 'id');
90
- });
91
-
92
- it('works with empty string parameters passed', () => {
93
- assert.equal(RecordingUtil.extractLocusId(''), '');
94
- });
95
-
96
- it('works with no parameters passed', () => {
97
- assert.isUndefined(RecordingUtil.extractLocusId(undefined));
98
- });
99
- });
8
+ describe('recording-controller tests', () => {
9
+ describe('recording util tests', () => {
10
+ let locusInfo;
11
+
12
+ beforeEach(() => {
13
+ locusInfo = {
14
+ parsedLocus: {
15
+ info: {
16
+ userDisplayHints: [],
17
+ },
18
+ },
19
+ };
20
+ });
21
+
22
+ describe('canUserStart', () => {
23
+ it('can start recording when the correct display hint is present', () => {
24
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_START');
25
+
26
+ assert.equal(
27
+ RecordingUtil.canUserStart(locusInfo.parsedLocus.info.userDisplayHints),
28
+ true
29
+ );
30
+ });
31
+
32
+ it('can start recording when the correct display hint is present and the policy is true', () => {
33
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_START');
34
+
35
+ assert.equal(
36
+ RecordingUtil.canUserStart(locusInfo.parsedLocus.info.userDisplayHints, {
37
+ [SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: true,
38
+ }),
39
+ true
40
+ );
41
+ });
42
+
43
+ it('rejects when correct display hint is not present', () => {
44
+ assert.equal(
45
+ RecordingUtil.canUserStart(locusInfo.parsedLocus.info.userDisplayHints),
46
+ false
47
+ );
48
+ });
49
+
50
+ it('rejects when correct display hint is present but policy is false', () => {
51
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_START');
52
+
53
+ assert.equal(
54
+ RecordingUtil.canUserStart(locusInfo.parsedLocus.info.userDisplayHints, {
55
+ [SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: false,
56
+ }),
57
+ false
58
+ );
59
+ });
60
+ });
61
+
62
+ describe('canUserPause', () => {
63
+ it('can pause recording when the correct display hint is present', () => {
64
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_PAUSE');
65
+
66
+ assert.equal(
67
+ RecordingUtil.canUserPause(locusInfo.parsedLocus.info.userDisplayHints),
68
+ true
69
+ );
70
+ });
71
+
72
+ it('can pause recording when the correct display hint is present and the policy is true', () => {
73
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_PAUSE');
74
+
75
+ assert.equal(
76
+ RecordingUtil.canUserPause(locusInfo.parsedLocus.info.userDisplayHints, {
77
+ [SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: true,
78
+ }),
79
+ true
80
+ );
81
+ });
82
+
83
+ it('rejects when correct display hint is not present', () => {
84
+ assert.equal(
85
+ RecordingUtil.canUserPause(locusInfo.parsedLocus.info.userDisplayHints),
86
+ false
87
+ );
88
+ });
89
+
90
+ it('rejects when correct display hint is present but the policy is false', () => {
91
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_PAUSE');
92
+
93
+ assert.equal(
94
+ RecordingUtil.canUserPause(locusInfo.parsedLocus.info.userDisplayHints, {
95
+ [SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: false,
96
+ }),
97
+ false
98
+ );
99
+ });
100
+ });
101
+
102
+ describe('canUserStop', () => {
103
+ it('can stop recording when the correct display hint is present', () => {
104
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_STOP');
105
+
106
+ assert.equal(
107
+ RecordingUtil.canUserStop(locusInfo.parsedLocus.info.userDisplayHints),
108
+ true
109
+ );
110
+ });
111
+
112
+ it('can stop recording when the correct display hint is present and the policy is true', () => {
113
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_STOP', {
114
+ [SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: true,
115
+ });
116
+
117
+ assert.equal(
118
+ RecordingUtil.canUserStop(locusInfo.parsedLocus.info.userDisplayHints),
119
+ true
120
+ );
121
+ });
122
+
123
+ it('rejects when correct display hint is not present', () => {
124
+ assert.equal(
125
+ RecordingUtil.canUserStop(locusInfo.parsedLocus.info.userDisplayHints),
126
+ false
127
+ );
128
+ });
129
+
130
+ it('rejects when correct display hint is present but the policy is false', () => {
131
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_STOP', {
132
+ [SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: true,
133
+ });
134
+
135
+ assert.equal(
136
+ RecordingUtil.canUserStop(locusInfo.parsedLocus.info.userDisplayHints, {
137
+ [SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: false,
138
+ }),
139
+ false
140
+ );
141
+ });
142
+ });
143
+
144
+ describe('canUserResume', () => {
145
+ it('can start recording when the correct display hint is present', () => {
146
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_RESUME');
147
+
148
+ assert.equal(
149
+ RecordingUtil.canUserResume(locusInfo.parsedLocus.info.userDisplayHints),
150
+ true
151
+ );
152
+ });
153
+
154
+ it('can start recording when the correct display hint is present and the policy is true', () => {
155
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_RESUME');
156
+
157
+ assert.equal(
158
+ RecordingUtil.canUserResume(locusInfo.parsedLocus.info.userDisplayHints, {
159
+ [SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: true,
160
+ }),
161
+ true
162
+ );
163
+ });
164
+
165
+ it('rejects when correct display hint is not present', () => {
166
+ assert.equal(
167
+ RecordingUtil.canUserResume(locusInfo.parsedLocus.info.userDisplayHints),
168
+ false
169
+ );
170
+ });
171
+
172
+ it('rejects when correct display hint is present but the policy is false', () => {
173
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_RESUME');
174
+
175
+ assert.equal(
176
+ RecordingUtil.canUserResume(locusInfo.parsedLocus.info.userDisplayHints, {
177
+ [SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: false,
178
+ }),
179
+ false
180
+ );
181
+ });
182
+ });
183
+
184
+ describe('deriveRecordingStates', () => {
185
+ it('gets the correct values for a start recording action', () => {
186
+ assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Start), {
187
+ recording: true,
188
+ paused: false,
189
+ });
190
+ });
191
+
192
+ it('gets the correct values for a stop recording action', () => {
193
+ assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Stop), {
194
+ recording: false,
195
+ paused: false,
196
+ });
197
+ });
198
+
199
+ it('gets the correct values for a resume recording action', () => {
200
+ assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Resume), {
201
+ recording: true,
202
+ paused: false,
203
+ });
204
+ });
205
+
206
+ it('gets the correct values for a paused recording action', () => {
207
+ assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Pause), {
208
+ recording: true,
209
+ paused: true,
210
+ });
211
+ });
212
+ });
213
+
214
+ describe('extractLocusId', () => {
215
+ it('gets the correct id from the url param', () => {
216
+ assert.equal(RecordingUtil.extractLocusId('test/id'), 'id');
217
+ });
218
+
219
+ it('works with empty string parameters passed', () => {
220
+ assert.equal(RecordingUtil.extractLocusId(''), '');
221
+ });
222
+
223
+ it('works with no parameters passed', () => {
224
+ assert.isUndefined(RecordingUtil.extractLocusId(undefined));
100
225
  });
226
+ });
101
227
  });
102
- });
228
+ });
229
+ });
@@ -1,49 +1,55 @@
1
1
  import {assert} from '@webex/test-helper-chai';
2
2
  import sinon from 'sinon';
3
3
  import TurnDiscovery from '@webex/plugin-meetings/src/roap/turnDiscovery';
4
- import {ROAP} from '@webex/plugin-meetings/src/constants';
4
+ import MockWebex from '@webex/test-helper-mock-webex';
5
5
 
6
6
  import RoapRequest from '@webex/plugin-meetings/src/roap/request';
7
- import RoapHandler from '@webex/plugin-meetings/src/roap/handler';
8
7
  import Roap from '@webex/plugin-meetings/src/roap/';
9
8
  import Meeting from '@webex/plugin-meetings/src/meeting';
9
+ import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
10
+ import Metrics from '@webex/plugin-meetings/src/metrics';
11
+ import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
12
+
13
+ import { IP_VERSION } from '../../../../src/constants';
10
14
 
11
15
  describe('Roap', () => {
12
16
  describe('doTurnDiscovery', () => {
13
- it('calls this.turnDiscovery.doTurnDiscovery() and forwards all the arguments', async () => {
14
- const RESULT = {something: 'some value'};
15
- const meeting = {id: 'some meeting id'} as Meeting;
16
-
17
- const doTurnDiscoveryStub = sinon
18
- .stub(TurnDiscovery.prototype, 'doTurnDiscovery')
19
- .resolves(RESULT);
17
+ [false, true].forEach(function (isReconnecting) {
18
+ [false, true, undefined].forEach(function (isForced) {
19
+ it(`calls this.turnDiscovery.doTurnDiscovery() and forwards all the arguments when isReconnecting = ${isReconnecting} and isForced = ${isForced}`, async () => {
20
+ const webex = new MockWebex({});
20
21
 
21
- const roap = new Roap({}, {parent: 'fake'});
22
+ const RESULT = {something: 'some value'};
23
+ const meeting = {id: 'some meeting id'} as Meeting;
22
24
 
23
- // call with isReconnecting: true
24
- const result = await roap.doTurnDiscovery(meeting, true);
25
+ const doTurnDiscoveryStub = sinon
26
+ .stub(TurnDiscovery.prototype, 'doTurnDiscovery')
27
+ .resolves(RESULT);
25
28
 
26
- assert.calledOnceWithExactly(doTurnDiscoveryStub, meeting, true);
27
- assert.deepEqual(result, RESULT);
29
+ const roap = new Roap({}, {parent: webex});
28
30
 
29
- doTurnDiscoveryStub.resetHistory();
31
+ const result = await roap.doTurnDiscovery(meeting, isReconnecting, isForced);
30
32
 
31
- // and with isReconnecting: false
32
- const result2 = await roap.doTurnDiscovery(meeting, false);
33
+ assert.calledOnceWithExactly(doTurnDiscoveryStub, meeting, isReconnecting, isForced);
34
+ assert.deepEqual(result, RESULT);
33
35
 
34
- assert.calledOnceWithExactly(doTurnDiscoveryStub, meeting, false);
35
- assert.deepEqual(result2, RESULT);
36
-
37
- sinon.restore();
36
+ sinon.restore();
37
+ });
38
+ });
38
39
  });
39
40
  });
40
41
 
41
42
  describe('sendRoapMediaRequest', () => {
42
43
  let sendRoapStub;
43
- let roapHandlerSubmitStub;
44
44
  let meeting;
45
45
 
46
+ let webex;
47
+ let roap;
48
+
49
+ const fakeLocus = {id: 'fake locus'};
50
+
46
51
  beforeEach(() => {
52
+ webex = new MockWebex({});
47
53
  meeting = {
48
54
  id: 'some meeting id',
49
55
  correlationId: 'correlation id',
@@ -55,76 +61,194 @@ describe('Roap', () => {
55
61
  video: {
56
62
  isLocallyMuted: () => false,
57
63
  },
64
+ isMultistream: true,
58
65
  setRoapSeq: sinon.stub(),
59
- config: {experimental: {enableTurnDiscovery: false}},
60
- webex: {meetings: {reachability: {isAnyClusterReachable: () => true}}},
66
+ locusMediaRequest: {fake: true},
67
+ webex: {meetings: {reachability: {isAnyPublicClusterReachable: () => true}}},
68
+ updateMediaConnections: sinon.stub(),
61
69
  };
62
70
 
63
- beforeEach(() => {
64
- sendRoapStub = sinon.stub(RoapRequest.prototype, 'sendRoap').resolves({});
65
- roapHandlerSubmitStub = sinon.stub(RoapHandler.prototype, 'submit');
66
- meeting.setRoapSeq.resetHistory();
67
- });
71
+ sinon.stub(MeetingUtil, 'getIpVersion').returns(IP_VERSION.unknown);
72
+ sinon.stub(Metrics, 'sendBehavioralMetric');
68
73
 
69
- afterEach(() => {
70
- sinon.restore();
71
- });
74
+ sendRoapStub = sinon.stub(RoapRequest.prototype, 'sendRoap').resolves({});
75
+ meeting.setRoapSeq.resetHistory();
72
76
 
73
- [
74
- {reconnect: true, turnDiscoverySkipped: false, expectEmptyMediaId: false},
75
- {reconnect: true, turnDiscoverySkipped: true, expectEmptyMediaId: true},
76
- {reconnect: false, turnDiscoverySkipped: false, expectEmptyMediaId: false},
77
- {reconnect: false, turnDiscoverySkipped: true, expectEmptyMediaId: false},
78
- ].forEach(({reconnect, turnDiscoverySkipped, expectEmptyMediaId}) =>
79
- it(`sends roap OFFER with ${expectEmptyMediaId ? 'empty ' : ''}mediaId when ${
80
- reconnect ? '' : 'not '
81
- }reconnecting and TURN discovery is ${
82
- turnDiscoverySkipped ? 'skipped' : 'not skipped'
83
- }`, async () => {
84
- const roap = new Roap({}, {parent: 'fake'});
85
-
86
- sinon.stub(roap.turnDiscovery, 'isSkipped').resolves(turnDiscoverySkipped);
87
-
88
- await roap.sendRoapMediaRequest({
89
- meeting,
90
- sdp: 'sdp',
91
- reconnect,
92
- roapSeq: 1,
93
- });
77
+ roap = new Roap({}, {parent: webex});
78
+ sinon.stub(roap.turnDiscovery, 'isSkipped').resolves(false);
79
+ });
94
80
 
95
- const expectedRoapMessage = {
96
- messageType: 'OFFER',
97
- sdps: ['sdp'],
98
- version: '2',
99
- seq: 2,
100
- tieBreaker: 4294967294,
101
- };
81
+ afterEach(() => {
82
+ sinon.restore();
83
+ });
102
84
 
103
- assert.calledOnce(sendRoapStub);
104
- assert.calledWith(sendRoapStub, {
85
+ [
86
+ {reconnect: true, turnDiscoverySkipped: false, expectEmptyMediaId: false},
87
+ {reconnect: true, turnDiscoverySkipped: true, expectEmptyMediaId: true},
88
+ {reconnect: false, turnDiscoverySkipped: false, expectEmptyMediaId: false},
89
+ {reconnect: false, turnDiscoverySkipped: true, expectEmptyMediaId: false},
90
+ ].forEach(({reconnect, turnDiscoverySkipped, expectEmptyMediaId}) =>
91
+ it(`sends roap OFFER with ${expectEmptyMediaId ? 'empty ' : ''}mediaId when ${
92
+ reconnect ? '' : 'not '
93
+ }reconnecting and TURN discovery is ${
94
+ turnDiscoverySkipped ? 'skipped' : 'not skipped'
95
+ }`, async () => {
96
+ roap.turnDiscovery.isSkipped.resolves(turnDiscoverySkipped);
97
+
98
+ await roap.sendRoapMediaRequest({
99
+ meeting,
100
+ sdp: 'sdp',
101
+ reconnect,
102
+ seq: 2,
103
+ tieBreaker: 4294967294,
104
+ });
105
+
106
+ const expectedRoapMessage = {
107
+ messageType: 'OFFER',
108
+ sdps: ['sdp'],
109
+ version: '2',
110
+ seq: 2,
111
+ tieBreaker: 4294967294,
112
+ headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],
113
+ };
114
+
115
+ assert.calledOnce(sendRoapStub);
116
+ assert.calledWith(
117
+ sendRoapStub,
118
+ sinon.match({
105
119
  roapMessage: expectedRoapMessage,
106
- correlationId: meeting.correlationId,
107
120
  locusSelfUrl: meeting.selfUrl,
108
121
  mediaId: expectEmptyMediaId ? '' : meeting.mediaId,
109
- audioMuted: meeting.audio?.isLocallyMuted(),
110
- videoMuted: meeting.video?.isLocallyMuted(),
111
122
  meetingId: meeting.id,
123
+ locusMediaRequest: meeting.locusMediaRequest,
124
+ })
125
+ );
126
+ })
127
+ );
128
+
129
+ it('reads SDP answer from the http response', async () => {
130
+ const roapAnswer = {
131
+ seq: 5,
132
+ messageType: 'ANSWER',
133
+ sdps: ['sdp answer'],
134
+ errorType: 'error type', // normally ANSWER would not have errorType or errorCause (only error messages have these)
135
+ errorCause: 'error cause', // but we're just testing here that all the fields are forwarded to the caller of sendRoapMediaRequest()
136
+ headers: ['header1', 'header2'],
137
+ };
138
+ const fakeMediaConnections = [
139
+ {
140
+ remoteSdp: JSON.stringify({
141
+ roapMessage: roapAnswer,
142
+ }),
143
+ },
144
+ ];
145
+
146
+ sendRoapStub.resolves({
147
+ mediaConnections: fakeMediaConnections,
148
+ locus: fakeLocus,
149
+ });
150
+
151
+ const result = await roap.sendRoapMediaRequest({
152
+ meeting,
153
+ sdp: 'sdp',
154
+ reconnect: false,
155
+ seq: 1,
156
+ tieBreaker: 4294967294,
157
+ });
158
+
159
+ assert.calledOnce(sendRoapStub);
160
+ assert.calledOnceWithExactly(meeting.updateMediaConnections, fakeMediaConnections);
161
+ assert.deepEqual(result, {
162
+ locus: fakeLocus,
163
+ roapAnswer: {
164
+ seq: 5,
165
+ messageType: 'ANSWER',
166
+ sdp: 'sdp answer',
167
+ errorType: 'error type',
168
+ errorCause: 'error cause',
169
+ headers: ['header1', 'header2'],
170
+ },
171
+ });
172
+ });
173
+
174
+ it('handles the case when there is no answer in the http response', async () => {
175
+ const fakeMediaConnections = [
176
+ {
177
+ // this is the actual value Locus returns to us when they don't send Roap ANSWER in the http response
178
+ remoteSdp:
179
+ '{"audioMuted":false,"videoMuted":false,"csis":[],"dtmfReceiveSupported":true,"type":"SDP"}',
180
+ },
181
+ ];
182
+
183
+ sendRoapStub.resolves({
184
+ mediaConnections: fakeMediaConnections,
185
+ locus: fakeLocus,
186
+ });
187
+
188
+ const result = await roap.sendRoapMediaRequest({
189
+ meeting,
190
+ sdp: 'sdp',
191
+ reconnect: false,
192
+ seq: 1,
193
+ tieBreaker: 4294967294,
194
+ });
195
+
196
+ assert.calledOnce(sendRoapStub);
197
+ assert.calledOnceWithExactly(meeting.updateMediaConnections, fakeMediaConnections);
198
+ assert.deepEqual(result, {
199
+ locus: fakeLocus,
200
+ roapAnswer: undefined,
201
+ });
202
+ assert.calledOnceWithExactly(
203
+ Metrics.sendBehavioralMetric,
204
+ BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING,
205
+ {
206
+ correlationId: meeting.correlationId,
207
+ messageType: 'ANSWER',
208
+ isMultistream: meeting.isMultistream,
209
+ }
210
+ );
211
+ });
212
+
213
+ describe('does not crash when http response is missing things', () => {
214
+ [
215
+ {mediaConnections: undefined, title: 'mediaConnections are undefined'},
216
+ {mediaConnections: [], title: 'mediaConnections are empty array'},
217
+ {mediaConnections: [{}], title: 'mediaConnections[0] has no remoteSdp'},
218
+ {
219
+ mediaConnections: [{remoteSdp: '{}'}],
220
+ title: 'mediaConnections[0].remoteSdp is an empty json',
221
+ },
222
+ ].forEach(({mediaConnections, title}) =>
223
+ it(title, async () => {
224
+ sendRoapStub.resolves({
225
+ mediaConnections,
226
+ locus: fakeLocus,
112
227
  });
113
228
 
114
- assert.calledTwice(roapHandlerSubmitStub);
115
- assert.calledWith(roapHandlerSubmitStub, {
116
- type: ROAP.SEND_ROAP_MSG,
117
- msg: expectedRoapMessage,
118
- correlationId: meeting.correlationId,
229
+ const result = await roap.sendRoapMediaRequest({
230
+ meeting,
231
+ sdp: 'sdp',
232
+ reconnect: false,
233
+ seq: 1,
234
+ tieBreaker: 4294967294,
119
235
  });
120
- assert.calledWith(roapHandlerSubmitStub, {
121
- type: ROAP.SEND_ROAP_MSG_SUCCESS,
122
- seq: 2,
123
- correlationId: meeting.correlationId,
236
+
237
+ assert.calledOnce(sendRoapStub);
238
+ assert.deepEqual(result, {
239
+ locus: fakeLocus,
240
+ roapAnswer: undefined,
124
241
  });
125
242
 
126
- assert.calledOnce(meeting.setRoapSeq);
127
- assert.calledWith(meeting.setRoapSeq, 2);
243
+ assert.calledOnceWithExactly(
244
+ Metrics.sendBehavioralMetric,
245
+ BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING,
246
+ {
247
+ correlationId: meeting.correlationId,
248
+ messageType: 'ANSWER',
249
+ isMultistream: meeting.isMultistream,
250
+ }
251
+ );
128
252
  })
129
253
  );
130
254
  });