@webex/plugin-meetings 3.0.0-beta.2 → 3.0.0-beta.20

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 (365) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +116 -0
  4. package/dist/breakouts/breakout.js.map +1 -0
  5. package/dist/breakouts/collection.js +23 -0
  6. package/dist/breakouts/collection.js.map +1 -0
  7. package/dist/breakouts/index.js +226 -0
  8. package/dist/breakouts/index.js.map +1 -0
  9. package/dist/common/browser-detection.js +1 -20
  10. package/dist/common/browser-detection.js.map +1 -1
  11. package/dist/common/collection.js +5 -20
  12. package/dist/common/collection.js.map +1 -1
  13. package/dist/common/config.js +0 -7
  14. package/dist/common/config.js.map +1 -1
  15. package/dist/common/errors/captcha-error.js +10 -24
  16. package/dist/common/errors/captcha-error.js.map +1 -1
  17. package/dist/common/errors/intent-to-join.js +11 -24
  18. package/dist/common/errors/intent-to-join.js.map +1 -1
  19. package/dist/common/errors/join-meeting.js +12 -25
  20. package/dist/common/errors/join-meeting.js.map +1 -1
  21. package/dist/common/errors/media.js +10 -24
  22. package/dist/common/errors/media.js.map +1 -1
  23. package/dist/common/errors/parameter.js +5 -33
  24. package/dist/common/errors/parameter.js.map +1 -1
  25. package/dist/common/errors/password-error.js +10 -24
  26. package/dist/common/errors/password-error.js.map +1 -1
  27. package/dist/common/errors/permission.js +9 -23
  28. package/dist/common/errors/permission.js.map +1 -1
  29. package/dist/common/errors/reconnection-in-progress.js +0 -17
  30. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  31. package/dist/common/errors/reconnection.js +10 -24
  32. package/dist/common/errors/reconnection.js.map +1 -1
  33. package/dist/common/errors/stats.js +10 -24
  34. package/dist/common/errors/stats.js.map +1 -1
  35. package/dist/common/errors/webex-errors.js +6 -41
  36. package/dist/common/errors/webex-errors.js.map +1 -1
  37. package/dist/common/errors/webex-meetings-error.js +5 -25
  38. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  39. package/dist/common/events/events-scope.js +0 -22
  40. package/dist/common/events/events-scope.js.map +1 -1
  41. package/dist/common/events/events.js +0 -23
  42. package/dist/common/events/events.js.map +1 -1
  43. package/dist/common/events/trigger-proxy.js +0 -12
  44. package/dist/common/events/trigger-proxy.js.map +1 -1
  45. package/dist/common/events/util.js +0 -15
  46. package/dist/common/events/util.js.map +1 -1
  47. package/dist/common/logs/logger-config.js +0 -4
  48. package/dist/common/logs/logger-config.js.map +1 -1
  49. package/dist/common/logs/logger-proxy.js +1 -8
  50. package/dist/common/logs/logger-proxy.js.map +1 -1
  51. package/dist/common/logs/request.js +37 -60
  52. package/dist/common/logs/request.js.map +1 -1
  53. package/dist/common/queue.js +4 -14
  54. package/dist/common/queue.js.map +1 -1
  55. package/dist/config.js +6 -6
  56. package/dist/config.js.map +1 -1
  57. package/dist/constants.js +88 -46
  58. package/dist/constants.js.map +1 -1
  59. package/dist/index.js +1 -17
  60. package/dist/index.js.map +1 -1
  61. package/dist/locus-info/controlsUtils.js +12 -29
  62. package/dist/locus-info/controlsUtils.js.map +1 -1
  63. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  64. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  65. package/dist/locus-info/fullState.js +0 -15
  66. package/dist/locus-info/fullState.js.map +1 -1
  67. package/dist/locus-info/hostUtils.js +4 -12
  68. package/dist/locus-info/hostUtils.js.map +1 -1
  69. package/dist/locus-info/index.js +184 -190
  70. package/dist/locus-info/index.js.map +1 -1
  71. package/dist/locus-info/infoUtils.js +3 -37
  72. package/dist/locus-info/infoUtils.js.map +1 -1
  73. package/dist/locus-info/mediaSharesUtils.js +12 -38
  74. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  75. package/dist/locus-info/parser.js +92 -118
  76. package/dist/locus-info/parser.js.map +1 -1
  77. package/dist/locus-info/selfUtils.js +34 -91
  78. package/dist/locus-info/selfUtils.js.map +1 -1
  79. package/dist/media/index.js +67 -111
  80. package/dist/media/index.js.map +1 -1
  81. package/dist/media/properties.js +80 -114
  82. package/dist/media/properties.js.map +1 -1
  83. package/dist/media/util.js +2 -9
  84. package/dist/media/util.js.map +1 -1
  85. package/dist/mediaQualityMetrics/config.js +10 -12
  86. package/dist/mediaQualityMetrics/config.js.map +1 -1
  87. package/dist/meeting/effectsState.js +125 -190
  88. package/dist/meeting/effectsState.js.map +1 -1
  89. package/dist/meeting/in-meeting-actions.js +5 -14
  90. package/dist/meeting/in-meeting-actions.js.map +1 -1
  91. package/dist/meeting/index.js +1692 -1925
  92. package/dist/meeting/index.js.map +1 -1
  93. package/dist/meeting/muteState.js +36 -77
  94. package/dist/meeting/muteState.js.map +1 -1
  95. package/dist/meeting/request.js +224 -230
  96. package/dist/meeting/request.js.map +1 -1
  97. package/dist/meeting/request.type.js +7 -0
  98. package/dist/meeting/request.type.js.map +1 -0
  99. package/dist/meeting/state.js +21 -31
  100. package/dist/meeting/state.js.map +1 -1
  101. package/dist/meeting/util.js +43 -215
  102. package/dist/meeting/util.js.map +1 -1
  103. package/dist/meeting-info/collection.js +6 -25
  104. package/dist/meeting-info/collection.js.map +1 -1
  105. package/dist/meeting-info/index.js +14 -32
  106. package/dist/meeting-info/index.js.map +1 -1
  107. package/dist/meeting-info/meeting-info-v2.js +193 -268
  108. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  109. package/dist/meeting-info/request.js +3 -15
  110. package/dist/meeting-info/request.js.map +1 -1
  111. package/dist/meeting-info/util.js +98 -183
  112. package/dist/meeting-info/util.js.map +1 -1
  113. package/dist/meeting-info/utilv2.js +137 -228
  114. package/dist/meeting-info/utilv2.js.map +1 -1
  115. package/dist/meetings/collection.js +5 -20
  116. package/dist/meetings/collection.js.map +1 -1
  117. package/dist/meetings/index.js +490 -560
  118. package/dist/meetings/index.js.map +1 -1
  119. package/dist/meetings/request.js +24 -41
  120. package/dist/meetings/request.js.map +1 -1
  121. package/dist/meetings/util.js +99 -155
  122. package/dist/meetings/util.js.map +1 -1
  123. package/dist/member/index.js +78 -86
  124. package/dist/member/index.js.map +1 -1
  125. package/dist/member/util.js +31 -68
  126. package/dist/member/util.js.map +1 -1
  127. package/dist/members/collection.js +3 -12
  128. package/dist/members/collection.js.map +1 -1
  129. package/dist/members/index.js +93 -200
  130. package/dist/members/index.js.map +1 -1
  131. package/dist/members/request.js +16 -39
  132. package/dist/members/request.js.map +1 -1
  133. package/dist/members/util.js +9 -38
  134. package/dist/members/util.js.map +1 -1
  135. package/dist/metrics/config.js +0 -2
  136. package/dist/metrics/config.js.map +1 -1
  137. package/dist/metrics/constants.js +1 -2
  138. package/dist/metrics/constants.js.map +1 -1
  139. package/dist/metrics/index.js +55 -135
  140. package/dist/metrics/index.js.map +1 -1
  141. package/dist/multistream/mediaRequestManager.js +57 -32
  142. package/dist/multistream/mediaRequestManager.js.map +1 -1
  143. package/dist/multistream/multistreamMedia.js +15 -21
  144. package/dist/multistream/multistreamMedia.js.map +1 -1
  145. package/dist/multistream/receiveSlot.js +10 -50
  146. package/dist/multistream/receiveSlot.js.map +1 -1
  147. package/dist/multistream/receiveSlotManager.js +45 -82
  148. package/dist/multistream/receiveSlotManager.js.map +1 -1
  149. package/dist/multistream/remoteMedia.js +18 -58
  150. package/dist/multistream/remoteMedia.js.map +1 -1
  151. package/dist/multistream/remoteMediaGroup.js +6 -40
  152. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  153. package/dist/multistream/remoteMediaManager.js +362 -416
  154. package/dist/multistream/remoteMediaManager.js.map +1 -1
  155. package/dist/networkQualityMonitor/index.js +36 -57
  156. package/dist/networkQualityMonitor/index.js.map +1 -1
  157. package/dist/personal-meeting-room/index.js +21 -45
  158. package/dist/personal-meeting-room/index.js.map +1 -1
  159. package/dist/personal-meeting-room/request.js +1 -31
  160. package/dist/personal-meeting-room/request.js.map +1 -1
  161. package/dist/personal-meeting-room/util.js +0 -13
  162. package/dist/personal-meeting-room/util.js.map +1 -1
  163. package/dist/reachability/index.js +138 -182
  164. package/dist/reachability/index.js.map +1 -1
  165. package/dist/reachability/request.js +3 -18
  166. package/dist/reachability/request.js.map +1 -1
  167. package/dist/reactions/constants.js +13 -0
  168. package/dist/reactions/constants.js.map +1 -0
  169. package/dist/reactions/reactions.js +109 -0
  170. package/dist/reactions/reactions.js.map +1 -0
  171. package/dist/reactions/reactions.type.js +36 -0
  172. package/dist/reactions/reactions.type.js.map +1 -0
  173. package/dist/reconnection-manager/index.js +322 -455
  174. package/dist/reconnection-manager/index.js.map +1 -1
  175. package/dist/recording-controller/enums.js +17 -0
  176. package/dist/recording-controller/enums.js.map +1 -0
  177. package/dist/recording-controller/index.js +343 -0
  178. package/dist/recording-controller/index.js.map +1 -0
  179. package/dist/recording-controller/util.js +63 -0
  180. package/dist/recording-controller/util.js.map +1 -0
  181. package/dist/roap/index.js +39 -64
  182. package/dist/roap/index.js.map +1 -1
  183. package/dist/roap/request.js +94 -113
  184. package/dist/roap/request.js.map +1 -1
  185. package/dist/roap/turnDiscovery.js +85 -94
  186. package/dist/roap/turnDiscovery.js.map +1 -1
  187. package/dist/statsAnalyzer/global.js +0 -2
  188. package/dist/statsAnalyzer/global.js.map +1 -1
  189. package/dist/statsAnalyzer/index.js +85 -175
  190. package/dist/statsAnalyzer/index.js.map +1 -1
  191. package/dist/statsAnalyzer/mqaUtil.js +72 -53
  192. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  193. package/dist/transcription/index.js +22 -47
  194. package/dist/transcription/index.js.map +1 -1
  195. package/internal-README.md +7 -6
  196. package/package.json +25 -20
  197. package/src/breakouts/README.md +190 -0
  198. package/src/breakouts/breakout.ts +110 -0
  199. package/src/breakouts/collection.ts +19 -0
  200. package/src/breakouts/index.ts +225 -0
  201. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  202. package/src/common/collection.ts +9 -7
  203. package/src/common/{config.js → config.ts} +1 -1
  204. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  205. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  206. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  207. package/src/common/errors/{media.js → media.ts} +11 -7
  208. package/src/common/errors/parameter.ts +11 -7
  209. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  210. package/src/common/errors/{permission.js → permission.ts} +10 -6
  211. package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
  212. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  213. package/src/common/errors/{stats.js → stats.ts} +11 -7
  214. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  215. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  216. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  217. package/src/common/events/{events.js → events.ts} +5 -1
  218. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  219. package/src/common/events/{util.js → util.ts} +2 -3
  220. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  221. package/src/common/logs/logger-proxy.ts +44 -0
  222. package/src/common/logs/{request.js → request.ts} +22 -9
  223. package/src/common/queue.ts +1 -2
  224. package/src/{config.js → config.ts} +17 -12
  225. package/src/constants.ts +40 -1
  226. package/src/index.js +1 -1
  227. package/src/locus-info/controlsUtils.ts +114 -0
  228. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  229. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  230. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  231. package/src/locus-info/{index.js → index.ts} +148 -64
  232. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  233. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  234. package/src/locus-info/{parser.js → parser.ts} +67 -79
  235. package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
  236. package/src/media/{index.js → index.ts} +181 -131
  237. package/src/media/{properties.js → properties.ts} +47 -28
  238. package/src/media/{util.js → util.ts} +2 -2
  239. package/src/mediaQualityMetrics/{config.js → config.ts} +46 -46
  240. package/src/meeting/{effectsState.js → effectsState.ts} +47 -41
  241. package/src/meeting/in-meeting-actions.ts +15 -3
  242. package/src/meeting/{index.js → index.ts} +2263 -1427
  243. package/src/meeting/{muteState.js → muteState.ts} +78 -42
  244. package/src/meeting/{request.js → request.ts} +292 -142
  245. package/src/meeting/request.type.ts +13 -0
  246. package/src/meeting/{state.js → state.ts} +50 -35
  247. package/src/meeting/{util.js → util.ts} +112 -115
  248. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  249. package/src/meeting-info/{index.js → index.ts} +42 -36
  250. package/src/meeting-info/meeting-info-v2.ts +273 -0
  251. package/src/meeting-info/{request.js → request.ts} +14 -4
  252. package/src/meeting-info/{util.js → util.ts} +60 -51
  253. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  254. package/src/meetings/{collection.js → collection.ts} +6 -3
  255. package/src/meetings/index.ts +1159 -0
  256. package/src/meetings/{request.js → request.ts} +32 -25
  257. package/src/meetings/{util.js → util.ts} +34 -32
  258. package/src/member/{index.js → index.ts} +102 -56
  259. package/src/member/{util.js → util.ts} +52 -25
  260. package/src/members/{collection.js → collection.ts} +2 -2
  261. package/src/members/{index.js → index.ts} +219 -142
  262. package/src/members/{request.js → request.ts} +60 -16
  263. package/src/members/{util.js → util.ts} +50 -48
  264. package/src/metrics/{config.js → config.ts} +254 -83
  265. package/src/metrics/{constants.js → constants.ts} +0 -2
  266. package/src/metrics/{index.js → index.ts} +106 -74
  267. package/src/multistream/mediaRequestManager.ts +81 -15
  268. package/src/multistream/multistreamMedia.ts +5 -0
  269. package/src/multistream/receiveSlot.ts +18 -12
  270. package/src/multistream/receiveSlotManager.ts +23 -21
  271. package/src/multistream/remoteMedia.ts +15 -5
  272. package/src/multistream/remoteMediaGroup.ts +4 -3
  273. package/src/multistream/remoteMediaManager.ts +153 -37
  274. package/src/networkQualityMonitor/{index.js → index.ts} +37 -25
  275. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  276. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  277. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  278. package/src/reachability/{index.js → index.ts} +99 -83
  279. package/src/reachability/request.ts +39 -33
  280. package/src/reactions/constants.ts +4 -0
  281. package/src/reactions/reactions.ts +104 -0
  282. package/src/reactions/reactions.type.ts +62 -0
  283. package/src/reconnection-manager/{index.js → index.ts} +195 -102
  284. package/src/recording-controller/enums.ts +8 -0
  285. package/src/recording-controller/index.ts +315 -0
  286. package/src/recording-controller/util.ts +58 -0
  287. package/src/roap/{index.js → index.ts} +73 -56
  288. package/src/roap/request.ts +157 -0
  289. package/src/roap/turnDiscovery.ts +77 -37
  290. package/src/statsAnalyzer/{global.js → global.ts} +30 -33
  291. package/src/statsAnalyzer/{index.js → index.ts} +468 -192
  292. package/src/statsAnalyzer/mqaUtil.ts +290 -0
  293. package/src/transcription/{index.js → index.ts} +46 -39
  294. package/test/integration/spec/journey.js +664 -463
  295. package/test/integration/spec/space-meeting.js +320 -206
  296. package/test/integration/spec/transcription.js +7 -8
  297. package/test/unit/spec/breakouts/breakout.ts +119 -0
  298. package/test/unit/spec/breakouts/collection.ts +15 -0
  299. package/test/unit/spec/breakouts/index.ts +293 -0
  300. package/test/unit/spec/common/browser-detection.js +9 -28
  301. package/test/unit/spec/fixture/locus.js +92 -90
  302. package/test/unit/spec/locus-info/controlsUtils.js +25 -5
  303. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  304. package/test/unit/spec/locus-info/index.js +104 -2
  305. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  306. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  307. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  308. package/test/unit/spec/locus-info/parser.js +3 -9
  309. package/test/unit/spec/locus-info/selfConstant.js +97 -103
  310. package/test/unit/spec/locus-info/selfUtils.js +105 -12
  311. package/test/unit/spec/media/index.ts +31 -47
  312. package/test/unit/spec/media/properties.ts +9 -9
  313. package/test/unit/spec/meeting/effectsState.js +39 -45
  314. package/test/unit/spec/meeting/in-meeting-actions.ts +5 -2
  315. package/test/unit/spec/meeting/index.js +2017 -742
  316. package/test/unit/spec/meeting/muteState.js +42 -33
  317. package/test/unit/spec/meeting/request.js +115 -44
  318. package/test/unit/spec/meeting/utils.js +104 -171
  319. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  320. package/test/unit/spec/meeting-info/request.js +7 -9
  321. package/test/unit/spec/meeting-info/util.js +11 -12
  322. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  323. package/test/unit/spec/meetings/collection.js +1 -1
  324. package/test/unit/spec/meetings/index.js +439 -257
  325. package/test/unit/spec/meetings/utils.js +14 -12
  326. package/test/unit/spec/member/index.js +0 -1
  327. package/test/unit/spec/member/util.js +31 -7
  328. package/test/unit/spec/members/index.js +104 -54
  329. package/test/unit/spec/members/request.js +29 -20
  330. package/test/unit/spec/members/utils.js +8 -5
  331. package/test/unit/spec/metrics/index.js +16 -21
  332. package/test/unit/spec/multistream/mediaRequestManager.ts +316 -50
  333. package/test/unit/spec/multistream/receiveSlot.ts +6 -6
  334. package/test/unit/spec/multistream/receiveSlotManager.ts +13 -13
  335. package/test/unit/spec/multistream/remoteMedia.ts +10 -2
  336. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  337. package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
  338. package/test/unit/spec/networkQualityMonitor/index.js +21 -15
  339. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  340. package/test/unit/spec/reachability/index.ts +58 -26
  341. package/test/unit/spec/reconnection-manager/index.js +102 -9
  342. package/test/unit/spec/recording-controller/index.js +231 -0
  343. package/test/unit/spec/recording-controller/util.js +102 -0
  344. package/test/unit/spec/roap/index.ts +2 -1
  345. package/test/unit/spec/roap/request.ts +114 -0
  346. package/test/unit/spec/roap/turnDiscovery.ts +64 -45
  347. package/test/unit/spec/stats-analyzer/index.js +27 -22
  348. package/test/utils/cmr.js +44 -42
  349. package/test/utils/testUtils.js +83 -74
  350. package/test/utils/webex-config.js +18 -18
  351. package/test/utils/webex-test-users.js +54 -50
  352. package/tsconfig.json +6 -0
  353. package/dist/media/internal-media-core-wrapper.js +0 -22
  354. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  355. package/dist/peer-connection-manager/util.js +0 -124
  356. package/dist/peer-connection-manager/util.js.map +0 -1
  357. package/src/common/logs/logger-proxy.js +0 -33
  358. package/src/locus-info/controlsUtils.js +0 -102
  359. package/src/media/internal-media-core-wrapper.ts +0 -9
  360. package/src/meeting-info/meeting-info-v2.js +0 -255
  361. package/src/meetings/index.js +0 -1015
  362. package/src/peer-connection-manager/util.ts +0 -117
  363. package/src/roap/request.js +0 -127
  364. package/src/statsAnalyzer/mqaUtil.js +0 -173
  365. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
@@ -4,12 +4,13 @@ import TurnDiscovery from '@webex/plugin-meetings/src/roap/turnDiscovery';
4
4
 
5
5
  import RoapRequest from '@webex/plugin-meetings/src/roap/request';
6
6
  import Roap from '@webex/plugin-meetings/src/roap/';
7
+ import Meeting from '@webex/plugin-meetings/src/meeting';
7
8
 
8
9
  describe('Roap', () => {
9
10
  describe('doTurnDiscovery', () => {
10
11
  it('calls this.turnDiscovery.doTurnDiscovery() and forwards all the arguments', async () => {
11
12
  const RESULT = {something: 'some value'};
12
- const meeting = {id: 'some meeting id'};
13
+ const meeting = {id: 'some meeting id'} as Meeting;
13
14
 
14
15
  const doTurnDiscoveryStub = sinon
15
16
  .stub(TurnDiscovery.prototype, 'doTurnDiscovery')
@@ -0,0 +1,114 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import sinon from 'sinon';
3
+ import MockWebex from '@webex/test-helper-mock-webex';
4
+ import Metrics from '@webex/plugin-meetings/src/metrics';
5
+
6
+ import RoapRequest from '@webex/plugin-meetings/src/roap/request';
7
+
8
+
9
+ describe('RoapRequest', () => {
10
+ describe('attachRechabilityData', () => {
11
+ let webex;
12
+
13
+ beforeEach(() => {
14
+ webex = new MockWebex();
15
+ });
16
+
17
+ it('attaches the reachability data when it exists', async () => {
18
+ // @ts-ignore
19
+ const roapRequest = new RoapRequest({}, {parent: webex});
20
+
21
+ const sdp = {some: 'attribute'};
22
+
23
+ const reachabilitData = {reachability: 'data'};
24
+
25
+ await webex.boundedStorage.put(
26
+ 'Reachability',
27
+ 'reachability.result',
28
+ JSON.stringify(reachabilitData)
29
+ );
30
+
31
+ const newSdp = await roapRequest.attachRechabilityData(sdp);
32
+
33
+ assert.deepEqual(newSdp, {
34
+ some: 'attribute',
35
+ reachability: reachabilitData
36
+ })
37
+ });
38
+
39
+ it('handles the case when realiability data does not exist', async () => {
40
+ // @ts-ignore
41
+ const roapRequest = new RoapRequest({}, {parent: webex});
42
+
43
+ const sdp = {some: 'attribute'};
44
+
45
+ const newSdp = await roapRequest.attachRechabilityData(sdp);
46
+
47
+ assert.deepEqual(newSdp, sdp);
48
+ });
49
+ });
50
+
51
+ describe('sendRoap', () => {
52
+ let webex;
53
+
54
+ beforeEach(() => {
55
+ webex = new MockWebex();
56
+ });
57
+
58
+ it('calls attachReliabilityData', async () => {
59
+ Metrics.postEvent = sinon.stub();
60
+
61
+ // @ts-ignore
62
+ const roapRequest = new RoapRequest({}, {parent: webex});
63
+
64
+ const newSdp = {new: 'sdp'}
65
+
66
+ roapRequest.attachRechabilityData = sinon.stub().returns(Promise.resolve(newSdp));
67
+ webex.request.returns(Promise.resolve({
68
+ body: {
69
+ locus: {}
70
+ }
71
+ }))
72
+
73
+ const result = await roapRequest.sendRoap({
74
+ roapMessage: {seq: 1},
75
+ locusSelfUrl: 'locusSelfUrl',
76
+ mediaId: 'mediaId',
77
+ correlationId: 'correlationId',
78
+ audioMuted: true,
79
+ videoMuted: true,
80
+ meetingId: 'meetingId',
81
+ preferTranscoding: true
82
+ });
83
+
84
+ assert.calledOnceWithExactly(webex.request, {
85
+ uri: 'locusSelfUrl/media',
86
+ method: 'PUT',
87
+ body: {
88
+ device: {
89
+ url: undefined,
90
+ deviceType: undefined,
91
+ },
92
+ correlationId: 'correlationId',
93
+ localMedias: [{
94
+ localSdp: JSON.stringify(newSdp),
95
+ mediaId: 'mediaId'
96
+ }],
97
+ clientMediaPreferences: {preferTranscoding: true}
98
+ },
99
+ });
100
+
101
+ assert.calledOnceWithExactly(roapRequest.attachRechabilityData, {
102
+ roapMessage: {seq: 1},
103
+ audioMuted: true,
104
+ videoMuted: true
105
+ })
106
+
107
+ assert.deepEqual(result, {
108
+ locus: {
109
+ roapSeq: 1
110
+ }
111
+ });
112
+ });
113
+ })
114
+ });
@@ -25,15 +25,15 @@ describe('TurnDiscovery', () => {
25
25
  sinon.stub(Metrics, 'sendBehavioralMetric');
26
26
 
27
27
  mockRoapRequest = {
28
- sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS})
28
+ sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS}),
29
29
  } as unknown as RoapRequest;
30
30
 
31
31
  testMeeting = {
32
32
  id: 'fake meeting id',
33
33
  config: {
34
34
  experimental: {
35
- enableTurnDiscovery: true
36
- }
35
+ enableTurnDiscovery: true,
36
+ },
37
37
  },
38
38
  correlationId: 'fake correlation id',
39
39
  selfUrl: 'fake self url',
@@ -46,7 +46,8 @@ describe('TurnDiscovery', () => {
46
46
  testMeeting.roapSeq = newSeq;
47
47
  }),
48
48
  updateMediaConnections: sinon.stub(),
49
- webex: {meetings: {reachability: {isAnyClusterReachable: () => false}}}
49
+ webex: {meetings: {reachability: {isAnyClusterReachable: () => Promise.resolve(false)}}},
50
+ isMultistream: false
50
51
  };
51
52
  });
52
53
 
@@ -55,7 +56,11 @@ describe('TurnDiscovery', () => {
55
56
  sinon.restore();
56
57
  });
57
58
 
58
- const checkRoapMessageSent = async (messageType, expectedSeq, expectedMediaId = testMeeting.mediaId) => {
59
+ const checkRoapMessageSent = async (
60
+ messageType,
61
+ expectedSeq,
62
+ expectedMediaId = testMeeting.mediaId
63
+ ) => {
59
64
  await testUtils.flushPromises();
60
65
 
61
66
  assert.calledOnce(mockRoapRequest.sendRoap);
@@ -70,7 +75,8 @@ describe('TurnDiscovery', () => {
70
75
  mediaId: expectedMediaId,
71
76
  audioMuted: testMeeting.isAudioMuted(),
72
77
  videoMuted: testMeeting.isVideoMuted(),
73
- meetingId: testMeeting.id
78
+ meetingId: testMeeting.id,
79
+ preferTranscoding: !testMeeting.isMultistream
74
80
  });
75
81
 
76
82
  if (messageType === 'TURN_DISCOVERY_REQUEST') {
@@ -93,39 +99,44 @@ describe('TurnDiscovery', () => {
93
99
  };
94
100
 
95
101
  describe('doTurnDiscovery', () => {
96
- it('sends TURN_DISCOVERY_REQUEST, waits for response and sends OK', async () => {
97
- const td = new TurnDiscovery(mockRoapRequest);
102
+ [false, true].forEach(function (enabledMultistream ) {
103
+ it('sends TURN_DISCOVERY_REQUEST'+ (enabledMultistream ? ' when enable Multistream':'') + ', waits for response and sends OK', async () => {
104
+ testMeeting.isMultistream = enabledMultistream;
98
105
 
99
- const result = td.doTurnDiscovery(testMeeting, false);
106
+ const td = new TurnDiscovery(mockRoapRequest);
100
107
 
101
- // check that TURN_DISCOVERY_REQUEST was sent
102
- await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
108
+ const result = td.doTurnDiscovery(testMeeting, false);
103
109
 
104
- mockRoapRequest.sendRoap.resetHistory();
110
+ // check that TURN_DISCOVERY_REQUEST was sent
111
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
105
112
 
106
- // simulate the response
107
- td.handleTurnDiscoveryResponse({
108
- headers: [
109
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
110
- `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
111
- `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
112
- ]
113
- });
113
+ // @ts-ignore
114
+ mockRoapRequest.sendRoap.resetHistory();
114
115
 
115
- await testUtils.flushPromises();
116
+ // simulate the response
117
+ td.handleTurnDiscoveryResponse({
118
+ headers: [
119
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
120
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
121
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
122
+ ]
123
+ });
116
124
 
117
- // check that we've sent OK
118
- await checkRoapMessageSent('OK', 0);
125
+ await testUtils.flushPromises();
119
126
 
120
- const {turnServerInfo, turnDiscoverySkippedReason} = await result;
127
+ // check that we've sent OK
128
+ await checkRoapMessageSent('OK', 0);
121
129
 
122
- assert.deepEqual(turnServerInfo, {
123
- url: FAKE_TURN_URL,
124
- username: FAKE_TURN_USERNAME,
125
- password: FAKE_TURN_PASSWORD
126
- });
130
+ const {turnServerInfo, turnDiscoverySkippedReason} = await result;
127
131
 
128
- assert.isUndefined(turnDiscoverySkippedReason);
132
+ assert.deepEqual(turnServerInfo, {
133
+ url: FAKE_TURN_URL,
134
+ username: FAKE_TURN_USERNAME,
135
+ password: FAKE_TURN_PASSWORD
136
+ });
137
+
138
+ assert.isUndefined(turnDiscoverySkippedReason);
139
+ });
129
140
  });
130
141
 
131
142
  it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
@@ -137,6 +148,7 @@ describe('TurnDiscovery', () => {
137
148
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0, '');
138
149
 
139
150
  // the main part of the test is complete now, checking the remaining part of the flow just for completeness
151
+ // @ts-ignore
140
152
  mockRoapRequest.sendRoap.resetHistory();
141
153
 
142
154
  // simulate the response
@@ -145,7 +157,7 @@ describe('TurnDiscovery', () => {
145
157
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
146
158
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
147
159
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
148
- ]
160
+ ],
149
161
  });
150
162
 
151
163
  await testUtils.flushPromises();
@@ -158,7 +170,7 @@ describe('TurnDiscovery', () => {
158
170
  assert.deepEqual(turnServerInfo, {
159
171
  url: FAKE_TURN_URL,
160
172
  username: FAKE_TURN_USERNAME,
161
- password: FAKE_TURN_PASSWORD
173
+ password: FAKE_TURN_PASSWORD,
162
174
  });
163
175
  assert.isUndefined(turnDiscoverySkippedReason);
164
176
  });
@@ -169,7 +181,7 @@ describe('TurnDiscovery', () => {
169
181
 
170
182
  // check that TURN_DISCOVERY_REQUEST was sent
171
183
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
172
-
184
+ // @ts-ignore
173
185
  mockRoapRequest.sendRoap.resetHistory();
174
186
 
175
187
  // simulate the response with some extra headers
@@ -181,7 +193,7 @@ describe('TurnDiscovery', () => {
181
193
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
182
194
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
183
195
  'another-header-at-the-end=12345',
184
- ]
196
+ ],
185
197
  });
186
198
 
187
199
  await testUtils.flushPromises();
@@ -193,7 +205,7 @@ describe('TurnDiscovery', () => {
193
205
  assert.deepEqual(turnServerInfo, {
194
206
  url: FAKE_TURN_URL,
195
207
  username: FAKE_TURN_USERNAME,
196
- password: FAKE_TURN_PASSWORD
208
+ password: FAKE_TURN_PASSWORD,
197
209
  });
198
210
  assert.isUndefined(turnDiscoverySkippedReason);
199
211
  });
@@ -202,7 +214,7 @@ describe('TurnDiscovery', () => {
202
214
  const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
203
215
 
204
216
  testMeeting.config.experimental.enableTurnDiscovery = false;
205
-
217
+ // @ts-ignore
206
218
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
207
219
 
208
220
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -232,7 +244,7 @@ describe('TurnDiscovery', () => {
232
244
 
233
245
  it('resolves with undefined when cluster is reachable', async () => {
234
246
  const prev = testMeeting.webex.meetings.reachability.isAnyClusterReachable;
235
- testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => true;
247
+ testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => Promise.resolve(true);
236
248
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
237
249
 
238
250
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -242,10 +254,9 @@ describe('TurnDiscovery', () => {
242
254
  assert.notCalled(mockRoapRequest.sendRoap);
243
255
  assert.notCalled(Metrics.sendBehavioralMetric);
244
256
  testMeeting.webex.meetings.reachability.isAnyClusterReachable = prev;
245
-
246
257
  });
247
258
 
248
- it('resolves with undefined if we don\'t get a response within 10s', async () => {
259
+ it("resolves with undefined if we don't get a response within 10s", async () => {
249
260
  const td = new TurnDiscovery(mockRoapRequest);
250
261
 
251
262
  const promise = td.doTurnDiscovery(testMeeting, false);
@@ -264,12 +275,14 @@ describe('TurnDiscovery', () => {
264
275
  const td = new TurnDiscovery(mockRoapRequest);
265
276
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
266
277
 
278
+ await testUtils.flushPromises();
279
+
267
280
  // simulate the response without the password
268
281
  td.handleTurnDiscoveryResponse({
269
282
  headers: [
270
283
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
271
284
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
272
- ]
285
+ ],
273
286
  });
274
287
  await testUtils.flushPromises();
275
288
  const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
@@ -283,6 +296,8 @@ describe('TurnDiscovery', () => {
283
296
  const td = new TurnDiscovery(mockRoapRequest);
284
297
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
285
298
 
299
+ await testUtils.flushPromises();
300
+
286
301
  // simulate the response without the headers
287
302
  td.handleTurnDiscoveryResponse({});
288
303
 
@@ -298,11 +313,13 @@ describe('TurnDiscovery', () => {
298
313
  const td = new TurnDiscovery(mockRoapRequest);
299
314
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
300
315
 
316
+ await testUtils.flushPromises();
317
+
301
318
  // simulate the response without the headers
302
319
  td.handleTurnDiscoveryResponse({headers: []});
303
320
 
304
321
  await testUtils.flushPromises();
305
- const {turnServerInfo, turnDiscoverySkippedReason}= await turnDiscoveryPromise;
322
+ const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
306
323
 
307
324
  assert.isUndefined(turnServerInfo);
308
325
  assert.isUndefined(turnDiscoverySkippedReason);
@@ -314,9 +331,11 @@ describe('TurnDiscovery', () => {
314
331
 
315
332
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
316
333
 
334
+ await testUtils.flushPromises();
335
+
317
336
  // check that TURN_DISCOVERY_REQUEST was sent
318
337
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
319
-
338
+ // @ts-ignore
320
339
  mockRoapRequest.sendRoap.resetHistory();
321
340
 
322
341
  // setup the mock so that sending of OK fails
@@ -328,7 +347,7 @@ describe('TurnDiscovery', () => {
328
347
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
329
348
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
330
349
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
331
- ]
350
+ ],
332
351
  });
333
352
 
334
353
  await testUtils.flushPromises();
@@ -345,7 +364,7 @@ describe('TurnDiscovery', () => {
345
364
  });
346
365
 
347
366
  describe('handleTurnDiscoveryResponse', () => {
348
- it('doesn\'t do anything if turn discovery was not started', () => {
367
+ it("doesn't do anything if turn discovery was not started", () => {
349
368
  const td = new TurnDiscovery(mockRoapRequest);
350
369
 
351
370
  // there is not much we can check, but we mainly want to make
@@ -355,7 +374,7 @@ describe('TurnDiscovery', () => {
355
374
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
356
375
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
357
376
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
358
- ]
377
+ ],
359
378
  });
360
379
 
361
380
  assert.notCalled(mockRoapRequest.sendRoap);
@@ -2,7 +2,7 @@ import 'jsdom-global/register';
2
2
  import chai from 'chai';
3
3
  import chaiAsPromised from 'chai-as-promised';
4
4
  import sinon from 'sinon';
5
- import {MediaConnection as MC} from '@webex/internal-media-core';
5
+ import {ConnectionState} from '@webex/internal-media-core';
6
6
 
7
7
  import {StatsAnalyzer, EVENTS} from '../../../../src/statsAnalyzer';
8
8
  import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
@@ -20,31 +20,31 @@ describe('plugin-meetings', () => {
20
20
  let sandBoxSpy;
21
21
 
22
22
  const initialConfig = {
23
- videoPacketLossRatioThreshold: 9
23
+ videoPacketLossRatioThreshold: 9,
24
24
  };
25
25
 
26
26
  const defaultStats = {
27
27
  internal: {
28
28
  video: {
29
29
  send: {
30
- totalPacketsLostOnReceiver: 10
31
- }
32
- }
30
+ totalPacketsLostOnReceiver: 10,
31
+ },
32
+ },
33
33
  },
34
34
  video: {
35
35
  send: {
36
36
  packetsSent: 2,
37
37
  meanRemoteJitter: [],
38
- meanRoundTripTime: []
39
- }
40
- }
38
+ meanRoundTripTime: [],
39
+ },
40
+ },
41
41
  };
42
42
 
43
43
  const statusResult = {
44
44
  type: 'remote-inbound-rtp',
45
45
  packetsLost: 11,
46
46
  rttThreshold: 501,
47
- jitterThreshold: 501
47
+ jitterThreshold: 501,
48
48
  };
49
49
 
50
50
  const sandbox = sinon.createSandbox();
@@ -54,7 +54,10 @@ describe('plugin-meetings', () => {
54
54
 
55
55
  statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor, defaultStats);
56
56
 
57
- sandBoxSpy = sandbox.spy(statsAnalyzer.networkQualityMonitor, 'determineUplinkNetworkQuality');
57
+ sandBoxSpy = sandbox.spy(
58
+ statsAnalyzer.networkQualityMonitor,
59
+ 'determineUplinkNetworkQuality'
60
+ );
58
61
  });
59
62
 
60
63
  afterEach(() => {
@@ -65,11 +68,13 @@ describe('plugin-meetings', () => {
65
68
  await statsAnalyzer.parseGetStatsResult(statusResult, 'video');
66
69
 
67
70
  assert.calledOnce(statsAnalyzer.networkQualityMonitor.determineUplinkNetworkQuality);
68
- assert(sandBoxSpy.calledWith({
69
- mediaType: 'video',
70
- remoteRtpResults: statusResult,
71
- statsAnalyzerCurrentStats: statsAnalyzer.statsResults
72
- }));
71
+ assert(
72
+ sandBoxSpy.calledWith({
73
+ mediaType: 'video',
74
+ remoteRtpResults: statusResult,
75
+ statsAnalyzerCurrentStats: statsAnalyzer.statsResults,
76
+ })
77
+ );
73
78
  });
74
79
  });
75
80
 
@@ -114,7 +119,7 @@ describe('plugin-meetings', () => {
114
119
  type: 'outbound-rtp',
115
120
  packetsSent: 0,
116
121
  bytesSent: 1,
117
- }
122
+ },
118
123
  },
119
124
  video: {
120
125
  receiver: {
@@ -126,12 +131,12 @@ describe('plugin-meetings', () => {
126
131
  type: 'outbound-rtp',
127
132
  framesSent: 0,
128
133
  bytesSent: 1,
129
- }
130
- }
134
+ },
135
+ },
131
136
  };
132
137
 
133
138
  pc = {
134
- getConnectionState: sinon.stub().returns(MC.ConnectionState.Connected),
139
+ getConnectionState: sinon.stub().returns(ConnectionState.Connected),
135
140
  getTransceiverStats: sinon.stub().resolves({
136
141
  audio: {
137
142
  sender: [fakeStats.audio.sender],
@@ -148,9 +153,9 @@ describe('plugin-meetings', () => {
148
153
  screenShareVideo: {
149
154
  sender: [],
150
155
  receiver: [],
151
- currentDirection: 'sendrecv'
152
- }
153
- })
156
+ currentDirection: 'sendrecv',
157
+ },
158
+ }),
154
159
  };
155
160
 
156
161
  networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
package/test/utils/cmr.js CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  import uuid from 'uuid';
3
2
  import retry from '@webex/test-helper-retry';
4
3
 
@@ -23,16 +22,16 @@ CMR.reserve = (webex, claimed) => {
23
22
  authorization: `Bearer ${webex.credentials.supertoken.access_token}`,
24
23
  'cisco-no-http-redirect': null,
25
24
  'spark-user-agent': null,
26
- trackingid: `ITCLIENT_${uuid.v4()}_0_imi:true`
25
+ trackingid: `ITCLIENT_${uuid.v4()}_0_imi:true`,
27
26
  },
28
27
  body: {
29
28
  resourceType,
30
29
  requestMetaData: {
31
30
  emailAddress: `test${uuid.v4()}@wx2.example.com`,
32
- loginType: 'loginGuest'
31
+ loginType: 'loginGuest',
33
32
  },
34
- reservedBy: 'Webex JavaScript SDK Test Suite'
35
- }
33
+ reservedBy: 'Webex JavaScript SDK Test Suite',
34
+ },
36
35
  };
37
36
 
38
37
  if (claimed) {
@@ -40,7 +39,8 @@ CMR.reserve = (webex, claimed) => {
40
39
  }
41
40
  console.log('USER ID ', webex.internal.device.userId);
42
41
 
43
- return webex.request(requestBody)
42
+ return webex
43
+ .request(requestBody)
44
44
  .then((response) => {
45
45
  const cmr = response.body;
46
46
 
@@ -56,47 +56,49 @@ CMR.reserve = (webex, claimed) => {
56
56
  CMR.release = (webex, reservationUrl) => {
57
57
  console.log('releasing cmr');
58
58
 
59
- return webex.request({
60
- method: 'DELETE',
61
- uri: reservationUrl,
62
- headers: {
63
- authorization: `Bearer ${webex.credentials.supertoken.access_token}`,
64
- 'cisco-no-http-redirect': null,
65
- 'spark-user-agent': null
66
- }
67
- })
59
+ return webex
60
+ .request({
61
+ method: 'DELETE',
62
+ uri: reservationUrl,
63
+ headers: {
64
+ authorization: `Bearer ${webex.credentials.supertoken.access_token}`,
65
+ 'cisco-no-http-redirect': null,
66
+ 'spark-user-agent': null,
67
+ },
68
+ })
68
69
  .then(() => console.log('released cmr'));
69
70
  };
70
71
 
71
- CMR.waitForHostToJoin = (webex, resourceUrl) => retry(() => {
72
- console.log('checking if the host has joined');
73
-
74
- return webex.request({
75
- method: 'GET',
76
- uri: resourceUrl,
77
- headers: {
78
- authorization: `Bearer ${webex.credentials.supertoken.access_token}`,
79
- 'cisco-no-http-redirect': null,
80
- 'spark-user-agent': null
81
- }
72
+ CMR.waitForHostToJoin = (webex, resourceUrl) =>
73
+ retry(() => {
74
+ console.log('checking if the host has joined');
75
+
76
+ return webex
77
+ .request({
78
+ method: 'GET',
79
+ uri: resourceUrl,
80
+ headers: {
81
+ authorization: `Bearer ${webex.credentials.supertoken.access_token}`,
82
+ 'cisco-no-http-redirect': null,
83
+ 'spark-user-agent': null,
84
+ },
85
+ })
86
+ .then((res) => {
87
+ if (res.body && res.body.meeting.hostPresent) {
88
+ console.log('the host has joined');
89
+
90
+ return;
91
+ }
92
+
93
+ console.log('the host has not joined');
94
+ throw new Error('Meeting host has not yet joined');
95
+ });
82
96
  })
83
- .then((res) => {
84
- if (res.body && res.body.meeting.hostPresent) {
85
- console.log('the host has joined');
97
+ .then(() => true)
98
+ .catch((reason) => {
99
+ console.warn(reason);
86
100
 
87
- return;
88
- }
89
-
90
- console.log('the host has not joined');
91
- throw new Error('Meeting host has not yet joined');
101
+ return false;
92
102
  });
93
- })
94
- .then(() => true)
95
- .catch((reason) => {
96
- console.warn(reason);
97
-
98
- return false;
99
- });
100
-
101
103
 
102
104
  export default CMR;