@webex/plugin-meetings 2.59.8-next.2 → 2.60.0-next.1

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 (433) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +41 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +357 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +215 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +22 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +51 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +44 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1047 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +77 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +64 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/browser-detection.js +1 -2
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +1 -2
  25. package/dist/common/collection.js.map +1 -1
  26. package/dist/common/config.js +1 -2
  27. package/dist/common/config.js.map +1 -1
  28. package/dist/common/errors/captcha-error.js +1 -2
  29. package/dist/common/errors/captcha-error.js.map +1 -1
  30. package/dist/common/errors/intent-to-join.js +1 -2
  31. package/dist/common/errors/intent-to-join.js.map +1 -1
  32. package/dist/common/errors/join-meeting.js +1 -2
  33. package/dist/common/errors/join-meeting.js.map +1 -1
  34. package/dist/common/errors/media.js +1 -2
  35. package/dist/common/errors/media.js.map +1 -1
  36. package/dist/common/errors/no-meeting-info.js +50 -0
  37. package/dist/common/errors/no-meeting-info.js.map +1 -0
  38. package/dist/common/errors/parameter.js +3 -4
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +1 -2
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +1 -2
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reclaim-host-role-errors.js +154 -0
  45. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  46. package/dist/common/errors/reconnection-in-progress.js +1 -2
  47. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  48. package/dist/common/errors/reconnection.js +1 -2
  49. package/dist/common/errors/reconnection.js.map +1 -1
  50. package/dist/common/errors/stats.js +1 -2
  51. package/dist/common/errors/stats.js.map +1 -1
  52. package/dist/common/errors/webex-errors.js +48 -28
  53. package/dist/common/errors/webex-errors.js.map +1 -1
  54. package/dist/common/errors/webex-meetings-error.js +1 -2
  55. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  56. package/dist/common/events/events-scope.js +1 -2
  57. package/dist/common/events/events-scope.js.map +1 -1
  58. package/dist/common/events/events.js +1 -2
  59. package/dist/common/events/events.js.map +1 -1
  60. package/dist/common/events/trigger-proxy.js +1 -2
  61. package/dist/common/events/trigger-proxy.js.map +1 -1
  62. package/dist/common/events/util.js +1 -2
  63. package/dist/common/events/util.js.map +1 -1
  64. package/dist/common/logs/logger-config.js +1 -2
  65. package/dist/common/logs/logger-config.js.map +1 -1
  66. package/dist/common/logs/logger-proxy.js +2 -3
  67. package/dist/common/logs/logger-proxy.js.map +1 -1
  68. package/dist/common/logs/request.js +8 -5
  69. package/dist/common/logs/request.js.map +1 -1
  70. package/dist/common/queue.js +22 -9
  71. package/dist/common/queue.js.map +1 -1
  72. package/dist/config.js +9 -12
  73. package/dist/config.js.map +1 -1
  74. package/dist/constants.js +437 -433
  75. package/dist/constants.js.map +1 -1
  76. package/dist/controls-options-manager/constants.js +3 -6
  77. package/dist/controls-options-manager/constants.js.map +1 -1
  78. package/dist/controls-options-manager/enums.js +14 -6
  79. package/dist/controls-options-manager/enums.js.map +1 -1
  80. package/dist/controls-options-manager/index.js +126 -37
  81. package/dist/controls-options-manager/index.js.map +1 -1
  82. package/dist/controls-options-manager/types.js +7 -0
  83. package/dist/controls-options-manager/types.js.map +1 -0
  84. package/dist/controls-options-manager/util.js +309 -19
  85. package/dist/controls-options-manager/util.js.map +1 -1
  86. package/dist/index.js +116 -4
  87. package/dist/index.js.map +1 -1
  88. package/dist/interpretation/collection.js +22 -0
  89. package/dist/interpretation/collection.js.map +1 -0
  90. package/dist/interpretation/index.js +365 -0
  91. package/dist/interpretation/index.js.map +1 -0
  92. package/dist/interpretation/siLanguage.js +24 -0
  93. package/dist/interpretation/siLanguage.js.map +1 -0
  94. package/dist/locus-info/controlsUtils.js +95 -6
  95. package/dist/locus-info/controlsUtils.js.map +1 -1
  96. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  97. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  98. package/dist/locus-info/fullState.js +1 -2
  99. package/dist/locus-info/fullState.js.map +1 -1
  100. package/dist/locus-info/hostUtils.js +1 -2
  101. package/dist/locus-info/hostUtils.js.map +1 -1
  102. package/dist/locus-info/index.js +408 -67
  103. package/dist/locus-info/index.js.map +1 -1
  104. package/dist/locus-info/infoUtils.js +13 -5
  105. package/dist/locus-info/infoUtils.js.map +1 -1
  106. package/dist/locus-info/mediaSharesUtils.js +58 -3
  107. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  108. package/dist/locus-info/parser.js +251 -78
  109. package/dist/locus-info/parser.js.map +1 -1
  110. package/dist/locus-info/selfUtils.js +97 -13
  111. package/dist/locus-info/selfUtils.js.map +1 -1
  112. package/dist/media/index.js +106 -319
  113. package/dist/media/index.js.map +1 -1
  114. package/dist/media/properties.js +96 -153
  115. package/dist/media/properties.js.map +1 -1
  116. package/dist/media/util.js +1 -22
  117. package/dist/media/util.js.map +1 -1
  118. package/dist/mediaQualityMetrics/config.js +498 -493
  119. package/dist/mediaQualityMetrics/config.js.map +1 -1
  120. package/dist/meeting/in-meeting-actions.js +90 -3
  121. package/dist/meeting/in-meeting-actions.js.map +1 -1
  122. package/dist/meeting/index.js +4579 -2951
  123. package/dist/meeting/index.js.map +1 -1
  124. package/dist/meeting/locusMediaRequest.js +291 -0
  125. package/dist/meeting/locusMediaRequest.js.map +1 -0
  126. package/dist/meeting/muteState.js +224 -133
  127. package/dist/meeting/muteState.js.map +1 -1
  128. package/dist/meeting/request.js +295 -197
  129. package/dist/meeting/request.js.map +1 -1
  130. package/dist/meeting/request.type.js +7 -0
  131. package/dist/meeting/request.type.js.map +1 -0
  132. package/dist/meeting/state.js +1 -2
  133. package/dist/meeting/state.js.map +1 -1
  134. package/dist/meeting/util.js +602 -432
  135. package/dist/meeting/util.js.map +1 -1
  136. package/dist/meeting-info/collection.js +1 -2
  137. package/dist/meeting-info/collection.js.map +1 -1
  138. package/dist/meeting-info/index.js +74 -7
  139. package/dist/meeting-info/index.js.map +1 -1
  140. package/dist/meeting-info/meeting-info-v2.js +197 -63
  141. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  142. package/dist/meeting-info/request.js +1 -2
  143. package/dist/meeting-info/request.js.map +1 -1
  144. package/dist/meeting-info/util.js +2 -3
  145. package/dist/meeting-info/util.js.map +1 -1
  146. package/dist/meeting-info/utilv2.js +25 -12
  147. package/dist/meeting-info/utilv2.js.map +1 -1
  148. package/dist/meetings/collection.js +23 -2
  149. package/dist/meetings/collection.js.map +1 -1
  150. package/dist/meetings/index.js +464 -123
  151. package/dist/meetings/index.js.map +1 -1
  152. package/dist/meetings/meetings.types.js +7 -0
  153. package/dist/meetings/meetings.types.js.map +1 -0
  154. package/dist/meetings/request.js +4 -3
  155. package/dist/meetings/request.js.map +1 -1
  156. package/dist/meetings/util.js +107 -6
  157. package/dist/meetings/util.js.map +1 -1
  158. package/dist/member/index.js +54 -2
  159. package/dist/member/index.js.map +1 -1
  160. package/dist/member/member.types.js +3 -4
  161. package/dist/member/member.types.js.map +1 -1
  162. package/dist/member/types.js +23 -0
  163. package/dist/member/types.js.map +1 -0
  164. package/dist/member/util.js +131 -29
  165. package/dist/member/util.js.map +1 -1
  166. package/dist/members/collection.js +11 -2
  167. package/dist/members/collection.js.map +1 -1
  168. package/dist/members/index.js +172 -8
  169. package/dist/members/index.js.map +1 -1
  170. package/dist/members/request.js +108 -41
  171. package/dist/members/request.js.map +1 -1
  172. package/dist/members/types.js +14 -0
  173. package/dist/members/types.js.map +1 -0
  174. package/dist/members/util.js +327 -234
  175. package/dist/members/util.js.map +1 -1
  176. package/dist/metrics/constants.js +14 -7
  177. package/dist/metrics/constants.js.map +1 -1
  178. package/dist/metrics/index.js +4 -452
  179. package/dist/metrics/index.js.map +1 -1
  180. package/dist/multistream/mediaRequestManager.js +344 -0
  181. package/dist/multistream/mediaRequestManager.js.map +1 -0
  182. package/dist/multistream/receiveSlot.js +200 -0
  183. package/dist/multistream/receiveSlot.js.map +1 -0
  184. package/dist/multistream/receiveSlotManager.js +174 -0
  185. package/dist/multistream/receiveSlotManager.js.map +1 -0
  186. package/dist/multistream/remoteMedia.js +268 -0
  187. package/dist/multistream/remoteMedia.js.map +1 -0
  188. package/dist/multistream/remoteMediaGroup.js +267 -0
  189. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  190. package/dist/multistream/remoteMediaManager.js +1211 -0
  191. package/dist/multistream/remoteMediaManager.js.map +1 -0
  192. package/dist/multistream/sendSlotManager.js +236 -0
  193. package/dist/multistream/sendSlotManager.js.map +1 -0
  194. package/dist/networkQualityMonitor/index.js +5 -4
  195. package/dist/networkQualityMonitor/index.js.map +1 -1
  196. package/dist/personal-meeting-room/index.js +2 -3
  197. package/dist/personal-meeting-room/index.js.map +1 -1
  198. package/dist/personal-meeting-room/request.js +2 -3
  199. package/dist/personal-meeting-room/request.js.map +1 -1
  200. package/dist/personal-meeting-room/util.js +1 -2
  201. package/dist/personal-meeting-room/util.js.map +1 -1
  202. package/dist/reachability/index.js +258 -72
  203. package/dist/reachability/index.js.map +1 -1
  204. package/dist/reachability/request.js +18 -10
  205. package/dist/reachability/request.js.map +1 -1
  206. package/dist/reactions/constants.js +12 -0
  207. package/dist/reactions/constants.js.map +1 -0
  208. package/dist/reactions/reactions.js +4 -6
  209. package/dist/reactions/reactions.js.map +1 -1
  210. package/dist/reactions/reactions.type.js +21 -23
  211. package/dist/reactions/reactions.type.js.map +1 -1
  212. package/dist/reconnection-manager/index.js +272 -220
  213. package/dist/reconnection-manager/index.js.map +1 -1
  214. package/dist/recording-controller/enums.js +4 -5
  215. package/dist/recording-controller/enums.js.map +1 -1
  216. package/dist/recording-controller/index.js +57 -46
  217. package/dist/recording-controller/index.js.map +1 -1
  218. package/dist/recording-controller/util.js +10 -10
  219. package/dist/recording-controller/util.js.map +1 -1
  220. package/dist/roap/index.js +101 -235
  221. package/dist/roap/index.js.map +1 -1
  222. package/dist/roap/request.js +126 -180
  223. package/dist/roap/request.js.map +1 -1
  224. package/dist/roap/turnDiscovery.js +115 -105
  225. package/dist/roap/turnDiscovery.js.map +1 -1
  226. package/dist/rtcMetrics/constants.js +11 -0
  227. package/dist/rtcMetrics/constants.js.map +1 -0
  228. package/dist/rtcMetrics/index.js +115 -0
  229. package/dist/rtcMetrics/index.js.map +1 -0
  230. package/dist/statsAnalyzer/global.js +2 -93
  231. package/dist/statsAnalyzer/global.js.map +1 -1
  232. package/dist/statsAnalyzer/index.js +374 -374
  233. package/dist/statsAnalyzer/index.js.map +1 -1
  234. package/dist/statsAnalyzer/mqaUtil.js +100 -66
  235. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  236. package/dist/transcription/index.js +1 -2
  237. package/dist/transcription/index.js.map +1 -1
  238. package/dist/webinar/collection.js +43 -0
  239. package/dist/webinar/collection.js.map +1 -0
  240. package/dist/webinar/index.js +68 -0
  241. package/dist/webinar/index.js.map +1 -0
  242. package/package.json +27 -18
  243. package/src/annotation/annotation.types.ts +50 -0
  244. package/src/annotation/constants.ts +36 -0
  245. package/src/annotation/index.ts +328 -0
  246. package/src/breakouts/README.md +220 -0
  247. package/src/breakouts/breakout.ts +188 -0
  248. package/src/breakouts/collection.ts +19 -0
  249. package/src/breakouts/edit-lock-error.ts +25 -0
  250. package/src/breakouts/events.ts +56 -0
  251. package/src/breakouts/index.ts +925 -0
  252. package/src/breakouts/request.ts +55 -0
  253. package/src/breakouts/utils.ts +57 -0
  254. package/src/common/errors/no-meeting-info.ts +24 -0
  255. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  256. package/src/common/errors/webex-errors.ts +36 -12
  257. package/src/common/logs/logger-proxy.ts +1 -1
  258. package/src/common/logs/request.ts +5 -1
  259. package/src/common/queue.ts +22 -8
  260. package/src/config.ts +7 -9
  261. package/src/constants.ts +263 -89
  262. package/src/controls-options-manager/enums.ts +11 -1
  263. package/src/controls-options-manager/index.ts +116 -21
  264. package/src/controls-options-manager/types.ts +59 -0
  265. package/src/controls-options-manager/util.ts +294 -14
  266. package/src/index.ts +40 -0
  267. package/src/interpretation/README.md +60 -0
  268. package/src/interpretation/collection.ts +19 -0
  269. package/src/interpretation/index.ts +332 -0
  270. package/src/interpretation/siLanguage.ts +18 -0
  271. package/src/locus-info/controlsUtils.ts +110 -0
  272. package/src/locus-info/index.ts +449 -61
  273. package/src/locus-info/infoUtils.ts +14 -2
  274. package/src/locus-info/mediaSharesUtils.ts +64 -0
  275. package/src/locus-info/parser.ts +258 -47
  276. package/src/locus-info/selfUtils.ts +85 -2
  277. package/src/media/index.ts +153 -370
  278. package/src/media/properties.ts +106 -136
  279. package/src/media/util.ts +0 -21
  280. package/src/mediaQualityMetrics/config.ts +379 -377
  281. package/src/meeting/in-meeting-actions.ts +168 -0
  282. package/src/meeting/index.ts +3801 -2457
  283. package/src/meeting/locusMediaRequest.ts +313 -0
  284. package/src/meeting/muteState.ts +224 -138
  285. package/src/meeting/request.ts +207 -127
  286. package/src/meeting/request.type.ts +13 -0
  287. package/src/meeting/util.ts +590 -423
  288. package/src/meeting-info/index.ts +81 -8
  289. package/src/meeting-info/meeting-info-v2.ts +159 -13
  290. package/src/meeting-info/util.ts +1 -1
  291. package/src/meeting-info/utilv2.ts +22 -9
  292. package/src/meetings/collection.ts +20 -0
  293. package/src/meetings/index.ts +466 -124
  294. package/src/meetings/meetings.types.ts +12 -0
  295. package/src/meetings/request.ts +2 -0
  296. package/src/meetings/util.ts +116 -5
  297. package/src/member/index.ts +52 -1
  298. package/src/member/types.ts +38 -0
  299. package/src/member/util.ts +139 -28
  300. package/src/members/collection.ts +8 -0
  301. package/src/members/index.ts +196 -7
  302. package/src/members/request.ts +97 -17
  303. package/src/members/types.ts +29 -0
  304. package/src/members/util.ts +333 -240
  305. package/src/metrics/constants.ts +12 -4
  306. package/src/metrics/index.ts +1 -471
  307. package/src/multistream/mediaRequestManager.ts +440 -0
  308. package/src/multistream/receiveSlot.ts +184 -0
  309. package/src/multistream/receiveSlotManager.ts +166 -0
  310. package/src/multistream/remoteMedia.ts +254 -0
  311. package/src/multistream/remoteMediaGroup.ts +284 -0
  312. package/src/multistream/remoteMediaManager.ts +1145 -0
  313. package/src/multistream/sendSlotManager.ts +170 -0
  314. package/src/networkQualityMonitor/index.ts +6 -6
  315. package/src/reachability/index.ts +238 -45
  316. package/src/reachability/request.ts +17 -8
  317. package/src/reactions/constants.ts +4 -0
  318. package/src/reactions/reactions.ts +4 -4
  319. package/src/reactions/reactions.type.ts +30 -4
  320. package/src/reconnection-manager/index.ts +124 -107
  321. package/src/recording-controller/index.ts +20 -3
  322. package/src/recording-controller/util.ts +26 -9
  323. package/src/roap/index.ts +98 -240
  324. package/src/roap/request.ts +74 -148
  325. package/src/roap/turnDiscovery.ts +62 -56
  326. package/src/rtcMetrics/constants.ts +3 -0
  327. package/src/rtcMetrics/index.ts +100 -0
  328. package/src/statsAnalyzer/global.ts +1 -92
  329. package/src/statsAnalyzer/index.ts +429 -447
  330. package/src/statsAnalyzer/mqaUtil.ts +105 -103
  331. package/src/webinar/collection.ts +31 -0
  332. package/src/webinar/index.ts +62 -0
  333. package/test/integration/spec/converged-space-meetings.js +233 -0
  334. package/test/integration/spec/journey.js +320 -264
  335. package/test/integration/spec/space-meeting.js +77 -4
  336. package/test/unit/spec/annotation/index.ts +418 -0
  337. package/test/unit/spec/breakouts/breakout.ts +237 -0
  338. package/test/unit/spec/breakouts/collection.ts +15 -0
  339. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  340. package/test/unit/spec/breakouts/events.ts +89 -0
  341. package/test/unit/spec/breakouts/index.ts +1790 -0
  342. package/test/unit/spec/breakouts/request.ts +104 -0
  343. package/test/unit/spec/breakouts/utils.js +72 -0
  344. package/test/unit/spec/common/queue.js +31 -2
  345. package/test/unit/spec/controls-options-manager/index.js +163 -0
  346. package/test/unit/spec/controls-options-manager/util.js +576 -60
  347. package/test/unit/spec/fixture/locus.js +1 -0
  348. package/test/unit/spec/interpretation/collection.ts +15 -0
  349. package/test/unit/spec/interpretation/index.ts +589 -0
  350. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  351. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  352. package/test/unit/spec/locus-info/index.js +1390 -16
  353. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  354. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  355. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  356. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  357. package/test/unit/spec/locus-info/parser.js +116 -35
  358. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  359. package/test/unit/spec/media/index.ts +274 -0
  360. package/test/unit/spec/media/properties.ts +75 -84
  361. package/test/unit/spec/meeting/in-meeting-actions.ts +82 -0
  362. package/test/unit/spec/meeting/index.js +7420 -3125
  363. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  364. package/test/unit/spec/meeting/muteState.js +407 -212
  365. package/test/unit/spec/meeting/request.js +512 -42
  366. package/test/unit/spec/meeting/utils.js +741 -24
  367. package/test/unit/spec/meeting-info/index.js +300 -0
  368. package/test/unit/spec/meeting-info/meetinginfov2.js +500 -6
  369. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  370. package/test/unit/spec/meetings/collection.js +14 -0
  371. package/test/unit/spec/meetings/index.js +1012 -209
  372. package/test/unit/spec/meetings/utils.js +202 -2
  373. package/test/unit/spec/member/index.js +38 -8
  374. package/test/unit/spec/member/util.js +528 -27
  375. package/test/unit/spec/members/index.js +597 -3
  376. package/test/unit/spec/members/request.js +206 -27
  377. package/test/unit/spec/members/utils.js +210 -0
  378. package/test/unit/spec/metrics/index.js +1 -50
  379. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  380. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  381. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  382. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  383. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  384. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  385. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  386. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  387. package/test/unit/spec/reachability/index.ts +598 -24
  388. package/test/unit/spec/reachability/request.js +68 -0
  389. package/test/unit/spec/reconnection-manager/index.js +130 -22
  390. package/test/unit/spec/recording-controller/index.js +293 -218
  391. package/test/unit/spec/recording-controller/util.js +223 -96
  392. package/test/unit/spec/roap/index.ts +200 -77
  393. package/test/unit/spec/roap/request.ts +232 -0
  394. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  395. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  396. package/test/unit/spec/stats-analyzer/index.js +205 -50
  397. package/test/unit/spec/webinar/collection.ts +13 -0
  398. package/test/unit/spec/webinar/index.ts +60 -0
  399. package/test/utils/constants.js +9 -0
  400. package/test/utils/integrationTestUtils.js +46 -0
  401. package/test/utils/testUtils.js +0 -45
  402. package/test/utils/webex-config.js +4 -0
  403. package/test/utils/webex-test-users.js +7 -3
  404. package/dist/meeting/effectsState.js +0 -260
  405. package/dist/meeting/effectsState.js.map +0 -1
  406. package/dist/metrics/config.js +0 -289
  407. package/dist/metrics/config.js.map +0 -1
  408. package/dist/peer-connection-manager/index.js +0 -671
  409. package/dist/peer-connection-manager/index.js.map +0 -1
  410. package/dist/peer-connection-manager/util.js +0 -110
  411. package/dist/peer-connection-manager/util.js.map +0 -1
  412. package/dist/roap/collection.js +0 -63
  413. package/dist/roap/collection.js.map +0 -1
  414. package/dist/roap/handler.js +0 -279
  415. package/dist/roap/handler.js.map +0 -1
  416. package/dist/roap/state.js +0 -127
  417. package/dist/roap/state.js.map +0 -1
  418. package/dist/roap/util.js +0 -76
  419. package/dist/roap/util.js.map +0 -1
  420. package/src/index.js +0 -15
  421. package/src/meeting/effectsState.ts +0 -209
  422. package/src/metrics/config.ts +0 -485
  423. package/src/peer-connection-manager/index.ts +0 -847
  424. package/src/peer-connection-manager/util.ts +0 -119
  425. package/src/roap/collection.ts +0 -62
  426. package/src/roap/handler.ts +0 -294
  427. package/src/roap/state.ts +0 -156
  428. package/src/roap/util.ts +0 -100
  429. package/test/unit/spec/meeting/effectsState.js +0 -281
  430. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  431. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  432. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  433. package/test/unit/spec/roap/util.js +0 -30
package/src/roap/util.ts DELETED
@@ -1,100 +0,0 @@
1
- import PeerConnectionManager from '../peer-connection-manager';
2
- import {_ANSWER_, _ERROR_, _CONFLICT_, ROAP, SDP} from '../constants';
3
- import LoggerProxy from '../common/logs/logger-proxy';
4
- import ParameterError from '../common/errors/parameter';
5
-
6
- const RoapUtil: any = {};
7
- const ROAP_ANSWER = _ANSWER_.toLowerCase();
8
-
9
- RoapUtil.shouldHandleMedia = (meeting) => {
10
- const offer =
11
- meeting.mediaProperties.peerConnection &&
12
- meeting.mediaProperties.peerConnection.signalingState === SDP.HAVE_LOCAL_OFFER;
13
-
14
- if (offer) {
15
- return false;
16
- }
17
-
18
- return true;
19
- };
20
-
21
- RoapUtil.handleError = (pc) =>
22
- PeerConnectionManager.rollBackLocalDescription({peerConnection: pc})
23
- .then(() => Promise.resolve(true))
24
- .catch((err) => {
25
- LoggerProxy.logger.error(`Roap:util#handleError --> ${err}`);
26
-
27
- return Promise.reject(err);
28
- });
29
-
30
- RoapUtil.findError = (messageType, errorType, type) =>
31
- (type === ROAP.RECEIVE_ROAP_MSG || type === ROAP.SEND_ROAP_MSG) &&
32
- messageType === _ERROR_ &&
33
- errorType === _CONFLICT_;
34
-
35
- RoapUtil.ensureMeeting = (meeting, type) => {
36
- if (
37
- type === ROAP.RECEIVE_ROAP_MSG ||
38
- type === ROAP.SEND_ROAP_MSG ||
39
- type === ROAP.SEND_ROAP_MSG_SUCCESS
40
- ) {
41
- if (!meeting) {
42
- return false;
43
- }
44
- }
45
-
46
- return true;
47
- };
48
-
49
- RoapUtil.updatePeerConnection = (meeting, session) =>
50
- PeerConnectionManager.updatePeerConnection(
51
- {
52
- offerSdp: session.OFFER.sdps,
53
- peerConnection: meeting.mediaProperties.peerConnection,
54
- },
55
- {
56
- meetingId: meeting.id,
57
- remoteQualityLevel: meeting.mediaProperties.remoteQualityLevel,
58
- }
59
- ).then((res) => {
60
- meeting.roap.lastRoapOffer = session.OFFER.sdps;
61
-
62
- return res;
63
- });
64
-
65
- RoapUtil.setRemoteDescription = (meeting, session) => {
66
- LoggerProxy.logger.info(
67
- `Roap:util#setRemoteDescription --> Transmit WAIT_TX_OK, correlationId: ${meeting.correlationId}`
68
- );
69
- if (!(meeting && meeting.mediaProperties.peerConnection)) {
70
- LoggerProxy.logger.error(
71
- `Roap:util#setRemoteDescription --> DANGER no media or screen peer connection, correlationId: ${meeting.correlationId}`
72
- );
73
-
74
- return Promise.reject(new ParameterError('Must provide a media or screen peer connection'));
75
- }
76
-
77
- return PeerConnectionManager.setRemoteSessionDetails(
78
- meeting.mediaProperties.peerConnection,
79
- ROAP_ANSWER,
80
- session.ANSWER.sdps[0],
81
- meeting.id
82
- )
83
- .then(() => {
84
- LoggerProxy.logger.info(
85
- `Roap:util#setRemoteDescription --> Success for correlationId: ${meeting.correlationId}`
86
- );
87
-
88
- return {
89
- seq: session.ANSWER.seq,
90
- mediaId: meeting.mediaId,
91
- correlationId: meeting.correlationId,
92
- };
93
- })
94
- .catch((err) => {
95
- LoggerProxy.logger.error(`Roap:util#setRemoteDescription --> ${err}`);
96
- throw err;
97
- });
98
- };
99
-
100
- export default RoapUtil;
@@ -1,281 +0,0 @@
1
- /* eslint-disable camelcase */
2
- import {assert} from '@webex/test-helper-chai';
3
- import sinon from 'sinon';
4
- import MockWebex from '@webex/test-helper-mock-webex';
5
- import {BNR_STATUS} from '@webex/plugin-meetings/src/constants';
6
-
7
- import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
8
- import Meeting from '@webex/plugin-meetings/src/meeting';
9
- import Meetings from '@webex/plugin-meetings';
10
- import Metrics from '@webex/plugin-meetings/src/metrics';
11
- import MediaUtil from '@webex/plugin-meetings/src/media/util';
12
- import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
13
- import createEffectsState from '@webex/plugin-meetings/src/meeting/effectsState';
14
- import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
15
- import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
16
-
17
- describe('plugin-meetings', () => {
18
- const logger = {
19
- info: () => {},
20
- log: () => {},
21
- error: () => {},
22
- warn: () => {},
23
- trace: () => {},
24
- debug: () => {},
25
- };
26
-
27
- beforeEach(() => {
28
- sinon.stub(Metrics, 'sendBehavioralMetric');
29
- });
30
- afterEach(() => {
31
- sinon.restore();
32
- });
33
-
34
- Object.defineProperty(global.window.navigator, 'mediaDevices', {
35
- writable: true,
36
- value: {
37
- getSupportedConstraints: sinon.stub().returns({
38
- sampleRate: true,
39
- }),
40
- },
41
- });
42
- LoggerConfig.set({verboseEvents: true, enable: false});
43
- LoggerProxy.set(logger);
44
-
45
- let webex;
46
- let meeting;
47
- let uuid1;
48
-
49
- const fakeMediaTrack = () => ({
50
- id: Date.now().toString(),
51
- stop: () => {},
52
- readyState: 'live',
53
- enabled: true,
54
- getSettings: () => ({
55
- sampleRate: 48000,
56
- }),
57
- });
58
-
59
- class FakeMediaStream {
60
- constructor(tracks) {
61
- this.active = false;
62
- this.id = '5146425f-c240-48cc-b86b-27d422988fb7';
63
- this.tracks = tracks;
64
- }
65
-
66
- addTrack = () => undefined;
67
-
68
- getAudioTracks = () => this.tracks;
69
- }
70
-
71
- class FakeAudioContext {
72
- constructor() {
73
- this.state = 'running';
74
- this.baseLatency = 0.005333333333333333;
75
- this.currentTime = 2.7946666666666666;
76
- this.sampleRate = 48000;
77
- this.audioWorklet = {
78
- addModule: async () => undefined,
79
- };
80
- }
81
-
82
- onstatechange = null;
83
-
84
- createMediaStreamSource() {
85
- return {
86
- connect: () => undefined,
87
- mediaStream: {
88
- getAudioTracks() {
89
- // eslint-disable-next-line no-undef
90
- return [new MediaStreamTrack()];
91
- },
92
- },
93
- };
94
- }
95
-
96
- createMediaStreamDestination() {
97
- return {
98
- stream: {
99
- getAudioTracks() {
100
- // eslint-disable-next-line no-undef
101
- return [new MediaStreamTrack()];
102
- },
103
- },
104
- };
105
- }
106
- }
107
-
108
- class FakeAudioWorkletNode {
109
- constructor() {
110
- this.port = {
111
- postMessage: () => undefined,
112
- };
113
- }
114
-
115
- connect() {
116
- /* placeholder method */
117
- }
118
- }
119
-
120
- class FakeMediaStreamTrack {
121
- constructor() {
122
- this.kind = 'audio';
123
- this.enabled = true;
124
- this.label = 'Default - MacBook Pro Microphone (Built-in)';
125
- this.muted = false;
126
- this.readyState = 'live';
127
- this.contentHint = '';
128
- }
129
-
130
- getSettings() {
131
- return {
132
- sampleRate: 48000,
133
- };
134
- }
135
- }
136
- Object.defineProperty(global, 'MediaStream', {
137
- writable: true,
138
- value: FakeMediaStream,
139
- });
140
-
141
- Object.defineProperty(global, 'AudioContext', {
142
- writable: true,
143
- value: FakeAudioContext,
144
- });
145
-
146
- Object.defineProperty(global, 'AudioWorkletNode', {
147
- writable: true,
148
- value: FakeAudioWorkletNode,
149
- });
150
-
151
- Object.defineProperty(global, 'MediaStreamTrack', {
152
- writable: true,
153
- value: FakeMediaStreamTrack,
154
- });
155
-
156
- let effects;
157
-
158
- beforeEach(() => {
159
- webex = new MockWebex({
160
- children: {
161
- meetings: Meetings,
162
- },
163
- });
164
- MediaUtil.createPeerConnection = sinon.stub().returns({});
165
- meeting = new Meeting(
166
- {
167
- userId: uuid1,
168
- },
169
- {
170
- parent: webex,
171
- }
172
- );
173
-
174
- effects = createEffectsState('BNR');
175
- meeting.canUpdateMedia = sinon.stub().returns(true);
176
- MeetingUtil.validateOptions = sinon.stub().returns(Promise.resolve());
177
- MeetingUtil.updateTransceiver = sinon.stub();
178
-
179
- meeting.addMedia = sinon.stub().returns(Promise.resolve());
180
- meeting.getMediaStreams = sinon.stub().returns(Promise.resolve());
181
- sinon.stub(meeting, 'effects').value(effects);
182
- sinon.replace(meeting, 'addMedia', () => {
183
- sinon.stub(meeting.mediaProperties, 'audioTrack').value(fakeMediaTrack());
184
- sinon.stub(meeting.mediaProperties, 'mediaDirection').value({
185
- receiveAudio: true,
186
- });
187
- });
188
- });
189
-
190
- describe('bnr effect library', () => {
191
- beforeEach(async () => {
192
- await meeting.getMediaStreams();
193
- await meeting.addMedia();
194
- });
195
- describe('#enableBNR', () => {
196
- it('should have #enableBnr', () => {
197
- assert.exists(effects.enableBNR);
198
- });
199
-
200
- it('does bnr effect enable on audio track', async () => {
201
- assert.isTrue(await effects.handleClientRequest(true, meeting));
202
- assert.equal(effects.state.bnr.enabled, BNR_STATUS.ENABLED);
203
-
204
- assert(Metrics.sendBehavioralMetric.calledOnce);
205
- assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ENABLE_BNR_SUCCESS);
206
- });
207
-
208
- it('does resolve request if bnr is already enabled', async () => {
209
- effects.state.bnr.enabled = BNR_STATUS.ENABLED;
210
- assert.isTrue(await effects.handleClientRequest(true, meeting));
211
- assert.equal(effects.state.bnr.enabled, BNR_STATUS.ENABLED);
212
- });
213
-
214
- it('if called twice, does bnr effect enable on audio track for the first request and resolves second', async () => {
215
- Promise.all([
216
- effects.handleClientRequest(true, meeting),
217
- effects.handleClientRequest(true, meeting),
218
- ]).then((resolveFirst, resolveSecond) => {
219
- assert.isTrue(resolveFirst);
220
- assert.isTrue(resolveSecond);
221
- assert.calledOnce(MediaUtil.createMediaStream);
222
- });
223
- });
224
-
225
- it('should throw error for inappropriate sample rate and send error metrics', async () => {
226
- const fakeMediaTrack1 = () => ({
227
- id: Date.now().toString(),
228
- stop: () => {},
229
- readyState: 'live',
230
- getSettings: () => ({
231
- sampleRate: 49000,
232
- }),
233
- });
234
-
235
- sinon.stub(meeting.mediaProperties, 'audioTrack').value(fakeMediaTrack1());
236
-
237
- // eslint-disable-next-line no-undef
238
- MediaUtil.createMediaStream = sinon.stub().returns(new MediaStream([fakeMediaTrack1()]));
239
- try {
240
- await effects.handleClientRequest(true, meeting);
241
- } catch (err) {
242
- assert(Metrics.sendBehavioralMetric.calledOnce);
243
- assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ENABLE_BNR_FAILURE, {
244
- reason: err.message,
245
- stack: err.stack,
246
- });
247
- assert.equal(err.message, 'Sample rate of 49000 is not supported.');
248
- }
249
- });
250
- });
251
-
252
- describe('#disableBNR', () => {
253
- beforeEach(() => {
254
- effects.state.bnr.enabled = BNR_STATUS.ENABLED;
255
- });
256
- it('should have #disableBnr', () => {
257
- assert.exists(effects.disableBNR);
258
- });
259
-
260
- it('does bnr disable on audio track', async () => {
261
- assert.isTrue(await effects.handleClientRequest(false, meeting));
262
- assert.equal(effects.state.bnr.enabled, BNR_STATUS.NOT_ENABLED);
263
-
264
- assert(Metrics.sendBehavioralMetric.calledOnce);
265
- assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.DISABLE_BNR_SUCCESS);
266
- });
267
-
268
- it('reject request for disable bnr if not enabled', async () => {
269
- try {
270
- await effects.handleClientRequest(false, meeting);
271
- } catch (e) {
272
- assert.equal(e.message, 'Can not disable as BNR is not enabled');
273
- assert.equal(effects.state.bnr.enabled, BNR_STATUS.ENABLED);
274
-
275
- assert(Metrics.sendBehavioralMetric.calledOnce);
276
- assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.DISABLE_BNR_FAILURE);
277
- }
278
- });
279
- });
280
- });
281
- });
@@ -1,218 +0,0 @@
1
- import 'jsdom-global/register';
2
- import {assert} from '@webex/test-helper-chai';
3
- import sinon from 'sinon';
4
-
5
- import PeerConnectionManager from '@webex/plugin-meetings/src/peer-connection-manager/index';
6
- import StaticConfig from '@webex/plugin-meetings/src/common/config';
7
- import {InvalidSdpError} from '@webex/plugin-meetings/src/common/errors/webex-errors';
8
-
9
- describe('Peerconnection Manager', () => {
10
- describe('Methods', () => {
11
- let peerConnection = null;
12
- let sdp = null;
13
-
14
- beforeEach(() => {
15
- sdp =
16
- 'v=0\r\no=- 1026633665396855335 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1 2\r\nr\na=msid-semantic: WMS\r\nm=audio 40903 UDP/TLS/RTP/SAVPF 111 63 103 104 9 0 8 106 105 13 110 112 113 126\r\nb=TIAS:64000\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=candidate:602151403 1 udp 2122262783 2401:4900:2301:c2cb:5ea9:46d5:7321:2531 47974 typ host generation 0 network-id 2 network-cost 900\r\na=candidate:675071982 1 udp 2122197247 2401:4900:33fc:314c:ad57:3e1d:befe:34b7 41234 typ host generation 0 network-id 3 network-cost 900\r\na=candidate:1835525403 1 tcp 1518283007 2401:4900:2301:c2cb:5ea9:46d5:7321:2531 9 typ host tcptype active generation 0 network-id 2 network-cost 900\r\na=candidate:1723808542 1 tcp 1518217471 2401:4900:33fc:314c:ad57:3e1d:befe:34b7 9 typ host tcptype active generation 0 network-id 3 network-cost 900\r\na=ice-ufrag:zK3G\r\na=ice-pwd:e9xgQIGnRsJvaFpvTAenr5JQ\r\na=ice-options:trickle\r\nm=video 43875 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 122 121 127\r\nb=TIAS:4000000\r\nc=IN IP4 0.0.0.0\r\na=periodic-keyframes:20\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=candidate:602151403 1 udp 2122262783 2401:4900:2301:c2cb:5ea9:46d5:7321:2531 41619 typ host generation 0 network-id 2 network-cost 900\r\na=candidate:675071982 1 udp 2122197247 2401:4900:33fc:314c:ad57:3e1d:befe:34b7 47098 typ host generation 0 network-id 3 network-cost 900\r\na=candidate:1835525403 1 tcp 1518283007 2401:4900:2301:c2cb:5ea9:46d5:7321:2531 9 typ host tcptype active generation 0 network-id 2 network-cost 900\r\na=candidate:1723808542 1 tcp 1518217471 2401:4900:33fc:314c:ad57:3e1d:befe:34b7 9 typ host tcptype active generation 0 network-id 3 network-cost 900\r\na=ice-ufrag:zK3G\r\na=ice-pwd:e9xgQIGnRsJvaFpvTAenr5JQ\r\na=ice-options:trickle\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\nm=video 49298 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 122 121 127\r\nb=TIAS:4000000\r\nc=IN IP4 0.0.0.0\r\na=periodic-keyframes:20\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=candidate:602151403 1 udp 2122262783 2401:4900:2301:c2cb:5ea9:46d5:7321:2531 37670 typ host generation 0 network-id 2 network-cost 900\r\na=candidate:675071982 1 udp 2122197247 2401:4900:33fc:314c:ad57:3e1d:befe:34b7 37790 typ host generation 0 network-id 3 network-cost 900\r\na=candidate:1835525403 1 tcp 1518283007 2401:4900:2301:c2cb:5ea9:46d5:7321:2531 9 typ host tcptype active generation 0 network-id 2 network-cost 900\r\na=candidate:1723808542 1 tcp 1518217471 2401:4900:33fc:314c:ad57:3e1d:befe:34b7 9 typ host tcptype active generation 0 network-id 3 network-cost 900\r\na=ice-ufrag:zK3G\r\na=ice-pwd:e9xgQIGnRsJvaFpvTAenr5JQ\r\na=ice-options:trickle\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f;\r\na=content:slides\r\n';
17
-
18
- peerConnection = {
19
- iceGatheringState: 'new',
20
- onicecandidate: null,
21
- onicecandidateerror: null,
22
- localDescription: {sdp},
23
- };
24
-
25
- Object.defineProperty(global.window, 'RTCSessionDescription', {
26
- writable: true,
27
- value: class {
28
- constructor(options) {
29
- this.type = options.type;
30
- this.sdp = options.sdp;
31
- }
32
- },
33
- });
34
- });
35
- describe('setRemoteSessionDetails', () => {
36
- it('change the start bitrate on remoteSDP and remove extmap', async () => {
37
- StaticConfig.set({bandwidth: {audio: 50, video: 500, startBitrate: 2000}});
38
- let result = null;
39
- const setRemoteDescription = sinon.stub().callsFake((args) => {
40
- result = args;
41
-
42
- return Promise.resolve();
43
- });
44
- const remoteSdp =
45
- 'v=0\r\n' +
46
- 'm=video 5004 UDP/TLS/RTP/SAVPF 102 127 97 99\r\n' +
47
- 'a=fmtp:102 profile-level-id=42e016;packetization-mode=1;max-mbps=244800;max-fs=8160;max-fps=3000;max-dpb=12240;max-rcmd-nalu-size=196608;level-asymmetry-allowed=1\r\n' +
48
- 'a=rtpmap:127 H264/90000\r\n' +
49
- 'a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\n' +
50
- 'a=fmtp:127 profile-level-id=42e016;max-mbps=244800;max-fs=8160;max-fps=3000;max-dpb=12240;max-rcmd-nalu-size=196608;level-asymmetry-allowed=1\r\n';
51
-
52
- const resultSdp =
53
- 'v=0\r\n' +
54
- 'm=video 5004 UDP/TLS/RTP/SAVPF 102 127 97 99\r\n' +
55
- 'a=fmtp:102 profile-level-id=42e016;packetization-mode=1;max-mbps=244800;max-fs=8160;max-fps=3000;max-dpb=12240;max-rcmd-nalu-size=196608;level-asymmetry-allowed=1;x-google-start-bitrate=2000\r\n' +
56
- 'a=rtpmap:127 H264/90000\r\r\n' +
57
- 'a=fmtp:127 profile-level-id=42e016;max-mbps=244800;max-fs=8160;max-fps=3000;max-dpb=12240;max-rcmd-nalu-size=196608;level-asymmetry-allowed=1;x-google-start-bitrate=2000\r\n';
58
- const peerConnection = {
59
- signalingState: 'have-local-offer',
60
- setRemoteDescription,
61
- enableExtmap: false,
62
- };
63
-
64
- await PeerConnectionManager.setRemoteSessionDetails(
65
- peerConnection,
66
- 'answer',
67
- remoteSdp,
68
- {}
69
- );
70
-
71
- assert.equal(result.sdp, resultSdp);
72
- });
73
-
74
- it('dont change the start bitrate on remoteSDP if default value is 0', async () => {
75
- StaticConfig.set({bandwidth: {audio: 50, video: 500, startBitrate: 0}});
76
- let result = null;
77
- const setRemoteDescription = sinon.stub().callsFake((args) => {
78
- result = args;
79
-
80
- return Promise.resolve();
81
- });
82
- const remoteSdp =
83
- 'v=0\r\n' +
84
- 'm=video 5004 UDP/TLS/RTP/SAVPF 102 127 97 99\r\n' +
85
- 'a=fmtp:102 profile-level-id=42e016;packetization-mode=1;max-mbps=244800;max-fs=8160;max-fps=3000;max-dpb=12240;max-rcmd-nalu-size=196608;level-asymmetry-allowed=1\r\n' +
86
- 'a=rtpmap:127 H264/90000\r\n' +
87
- 'a=fmtp:127 profile-level-id=42e016;max-mbps=244800;max-fs=8160;max-fps=3000;max-dpb=12240;max-rcmd-nalu-size=196608;level-asymmetry-allowed=1\r\n';
88
-
89
- const peerConnection = {
90
- signalingState: 'have-local-offer',
91
- setRemoteDescription,
92
- };
93
-
94
- await PeerConnectionManager.setRemoteSessionDetails(
95
- peerConnection,
96
- 'answer',
97
- remoteSdp,
98
- {}
99
- );
100
-
101
- assert.equal(result.sdp, remoteSdp);
102
- });
103
-
104
- it('removes xTLS candidates from the remote sdp', async () => {
105
- StaticConfig.set({bandwidth: {}});
106
-
107
- const remoteSdpWithXtlsCandidates =
108
- 'v=0\r\n' +
109
- 'm=video 5004 UDP/TLS/RTP/SAVPF 102 127 97 99\r\n' +
110
- 'a=candidate:1 1 UDP 2130706175 18.206.82.54 9000 typ host\r\n' +
111
- 'a=candidate:2 1 TCP 1962934271 18.206.82.54 5004 typ host tcptype passive\r\n' +
112
- 'a=candidate:3 1 TCP 1962934015 18.206.82.54 9000 typ host tcptype passive\r\n' +
113
- 'a=candidate:4 1 xTLS 1795162111 external-media2.aintm-a-6.int.infra.webex.com 443 typ host tcptype passive fingerprint sha-1;55:B8:1D:94:BC:9D:B2:A5:5E:82:E7:84:C6:C8:10:AC:D3:FD:96:26\r\n' +
114
- 'a=rtpmap:127 H264/90000\r\n' +
115
- 'a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\n' +
116
- 'm=video 9000 UDP/TLS/RTP/SAVPF 102 127 97 99\r\n' +
117
- 'a=candidate:1 1 xTLS 1795162111 external-media2.aintm-a-6.int.infra.webex.com 443 typ host tcptype passive fingerprint sha-1;55:B8:1D:94:BC:9D:B2:A5:5E:82:E7:84:C6:C8:10:AC:D3:FD:96:26\r\n' +
118
- 'a=candidate:2 1 TCP 1962934271 18.206.82.54 5004 typ host tcptype passive\r\n' +
119
- 'a=fmtp:127 profile-level-id=42e016;max-mbps=244800;max-fs=8160;max-fps=3000;max-dpb=12240;max-rcmd-nalu-size=196608;level-asymmetry-allowed=1\r\n';
120
-
121
- // same as remoteSdpWithXtlsCandidates but without the xtls candidates
122
- const resultSdp =
123
- 'v=0\r\n' +
124
- 'm=video 5004 UDP/TLS/RTP/SAVPF 102 127 97 99\r\n' +
125
- 'a=candidate:1 1 UDP 2130706175 18.206.82.54 9000 typ host\r\n' +
126
- 'a=candidate:2 1 TCP 1962934271 18.206.82.54 5004 typ host tcptype passive\r\n' +
127
- 'a=candidate:3 1 TCP 1962934015 18.206.82.54 9000 typ host tcptype passive\r\n' +
128
- 'a=rtpmap:127 H264/90000\r\n' +
129
- 'a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\n' +
130
- 'm=video 9000 UDP/TLS/RTP/SAVPF 102 127 97 99\r\n' +
131
- 'a=candidate:2 1 TCP 1962934271 18.206.82.54 5004 typ host tcptype passive\r\n' +
132
- 'a=fmtp:127 profile-level-id=42e016;max-mbps=244800;max-fs=8160;max-fps=3000;max-dpb=12240;max-rcmd-nalu-size=196608;level-asymmetry-allowed=1\r\n';
133
-
134
- const peerConnection = {
135
- signalingState: 'have-local-offer',
136
- setRemoteDescription: sinon.stub().resolves(),
137
- enableExtmap: true,
138
- };
139
-
140
- await PeerConnectionManager.setRemoteSessionDetails(
141
- peerConnection,
142
- 'answer',
143
- remoteSdpWithXtlsCandidates,
144
- ''
145
- );
146
-
147
- assert.calledWith(
148
- peerConnection.setRemoteDescription,
149
- new global.window.RTCSessionDescription({sdp: resultSdp, type: 'answer'})
150
- );
151
- });
152
- });
153
-
154
- describe('iceCandidate', () => {
155
- beforeEach(() => {
156
- StaticConfig.set({bandwidth: {audio: 50, video: 500, startBitrate: 0}});
157
- peerConnection.sdp = null;
158
- });
159
- it('ice gathering already completed', async () => {
160
- peerConnection.iceGatheringState = 'complete';
161
-
162
- await PeerConnectionManager.iceCandidate(peerConnection, {remoteQualityLevel: 'HIGH'});
163
- console.error('Came her with sdp resolved');
164
- assert(peerConnection.sdp.search('max-fs:8192'), true);
165
- });
166
-
167
- it('listen onIceCandidate,onicecandidateerror and onIceGatheringStateChange', async () => {
168
- peerConnection.iceGatheringState = 'none';
169
- setTimeout(() => {
170
- peerConnection.onicecandidate({candidate: null});
171
- }, 1000);
172
- await PeerConnectionManager.iceCandidate(peerConnection, {remoteQualityLevel: 'HIGH'});
173
- assert.isFunction(peerConnection.onIceGatheringStateChange);
174
- assert.isFunction(peerConnection.onicecandidate);
175
- assert.isFunction(peerConnection.onicecandidateerror);
176
- });
177
-
178
- it('generate sdp with iceGatheringstate is `complet`', async () => {
179
- peerConnection.iceGatheringState = 'none';
180
- setTimeout(() => {
181
- peerConnection.iceGatheringState = 'complete';
182
- peerConnection.onIceGatheringStateChange();
183
- }, 1000);
184
- await PeerConnectionManager.iceCandidate(peerConnection, {remoteQualityLevel: 'HIGH'}).then(
185
- () => {
186
- assert(peerConnection.sdp.search('max-fs:8192'), true);
187
- }
188
- );
189
- });
190
-
191
- it('should still generate sdp even if onicecandidateerror is called ', async () => {
192
- peerConnection.iceGatheringState = 'none';
193
- setTimeout(() => {
194
- peerConnection.onicecandidateerror();
195
- peerConnection.onicecandidate({candidate: null});
196
- }, 1000);
197
- await PeerConnectionManager.iceCandidate(peerConnection, {remoteQualityLevel: 'HIGH'}).then(
198
- () => {
199
- assert(peerConnection.sdp.search('max-fs:8192'), true);
200
- }
201
- );
202
- });
203
-
204
- it('should throw generated SDP does not have candidates ', async () => {
205
- peerConnection.iceGatheringState = 'none';
206
- peerConnection.localDescription.sdp =
207
- 'v=0\r\no=- 1026633665396855335 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1 2\r\nr\na=msid-semantic: WMS\r\nm=audio 40903 UDP/TLS/RTP/SAVPF 111 63 103 104 9 0 8 106 105 13 110 112 113 126\r\nb=TIAS:64000\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:zK3G\r\na=ice-pwd:e9xgQIGnRsJvaFpvTAenr5JQ\r\na=ice-options:trickle\r\nm=video 43875 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 122 121 127\r\nb=TIAS:4000000\r\nc=IN IP4 0.0.0.0\r\na=periodic-keyframes:20\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:zK3G\r\na=ice-pwd:e9xgQIGnRsJvaFpvTAenr5JQ\r\na=ice-options:trickle\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\nm=video 49298 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 122 121 127\r\nb=TIAS:4000000\r\nc=IN IP4 0.0.0.0\r\na=periodic-keyframes:20\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:zK3G\r\na=ice-pwd:e9xgQIGnRsJvaFpvTAenr5JQ\r\na=ice-options:trickle\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f;\r\na=content:slides\r\n';
208
- setTimeout(() => {
209
- peerConnection.onicecandidate({candidate: null});
210
- }, 1000);
211
- await assert.isRejected(
212
- PeerConnectionManager.iceCandidate(peerConnection, {remoteQualityLevel: 'HIGH'}),
213
- InvalidSdpError
214
- );
215
- });
216
- });
217
- });
218
- });
@@ -1,49 +0,0 @@
1
- import {assert} from '@webex/test-helper-chai';
2
- import PeerConnectionUtils from '@webex/plugin-meetings/src/peer-connection-manager/util';
3
-
4
- import {
5
- SDP_MULTIPLE_VIDEO_CODECS,
6
- SDP_MULTIPLE_VIDEO_CODECS_WITH_LOWERED_H264_PROFILE_LEVEL,
7
- SDP_MULTIPLE_VIDEO_CODECS_WITH_MAX_FS,
8
- } from './utils.test-fixtures';
9
-
10
- describe('Peerconnection Manager', () => {
11
- describe('Utils', () => {
12
- describe('convertCLineToIpv4', () => {
13
- it('changes ipv6 to ipv4 default', () => {
14
- const localSdp =
15
- 'v=0\r\n' +
16
- 'm=video 5004 UDP/TLS/RTP/SAVPF 102 127 97 99\r\n' +
17
- 'c=IN IP6 2607:fb90:d27c:b314:211a:32dd:c47f:ffe\r\n' +
18
- 'a=rtpmap:127 H264/90000\r\n';
19
- const resultSdp =
20
- 'v=0\r\n' +
21
- 'm=video 5004 UDP/TLS/RTP/SAVPF 102 127 97 99\r\n' +
22
- 'c=IN IP4 0.0.0.0\r\n' +
23
- 'a=rtpmap:127 H264/90000\r\n';
24
-
25
- const temp = PeerConnectionUtils.convertCLineToIpv4(localSdp);
26
-
27
- assert.equal(temp, resultSdp);
28
- });
29
- });
30
-
31
- describe('adjustH264Profile', () => {
32
- it('appends max-fs and max-mbps to h264 fmtp lines when h264MaxFs value is higher than the value from the profile', () => {
33
- const modifiedSdp = PeerConnectionUtils.adjustH264Profile(SDP_MULTIPLE_VIDEO_CODECS, 8192);
34
-
35
- assert.equal(modifiedSdp, SDP_MULTIPLE_VIDEO_CODECS_WITH_MAX_FS);
36
- });
37
- it('keeps fmtp lines the same when h264MaxFs value matches the value from the profile', () => {
38
- const modifiedSdp = PeerConnectionUtils.adjustH264Profile(SDP_MULTIPLE_VIDEO_CODECS, 3600);
39
-
40
- assert.equal(modifiedSdp, SDP_MULTIPLE_VIDEO_CODECS);
41
- });
42
- it('changes the profile level in h264 fmtp lines when h264MaxFs value is lower than the value from the profile', () => {
43
- const modifiedSdp = PeerConnectionUtils.adjustH264Profile(SDP_MULTIPLE_VIDEO_CODECS, 1620);
44
-
45
- assert.equal(modifiedSdp, SDP_MULTIPLE_VIDEO_CODECS_WITH_LOWERED_H264_PROFILE_LEVEL);
46
- });
47
- });
48
- });
49
- });