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

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 +4 -18
  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 +2 -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
@@ -0,0 +1,157 @@
1
+ /* global window */
2
+ // @ts-ignore
3
+ import {StatelessWebexPlugin} from '@webex/webex-core';
4
+
5
+ import LoggerProxy from '../common/logs/logger-proxy';
6
+ import {MEDIA, HTTP_VERBS, REACHABILITY} from '../constants';
7
+ import Metrics from '../metrics';
8
+ import {eventType} from '../metrics/config';
9
+
10
+ /**
11
+ * @class RoapRequest
12
+ */
13
+ export default class RoapRequest extends StatelessWebexPlugin {
14
+ /**
15
+ * Joins a meeting via ROAP
16
+ * @param {Object} localSdp
17
+ * @returns {Promise} returns a promise that resolves/rejects whatever the request does
18
+ */
19
+ async attachRechabilityData(localSdp) {
20
+ // @ts-ignore
21
+ const reachabilityData = await this.webex.boundedStorage
22
+ .get(REACHABILITY.namespace, REACHABILITY.localStorage)
23
+ .catch(() => {});
24
+
25
+ if (reachabilityData) {
26
+ try {
27
+ const reachabilityResult = JSON.parse(reachabilityData);
28
+
29
+ /* istanbul ignore else */
30
+ if (reachabilityResult && Object.keys(reachabilityResult).length) {
31
+ localSdp.reachability = reachabilityResult;
32
+ }
33
+ } catch (e) {
34
+ LoggerProxy.logger.error(
35
+ `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`
36
+ );
37
+ }
38
+ }
39
+
40
+ return localSdp;
41
+ }
42
+
43
+ /**
44
+ * Sends a ROAP message
45
+ * @param {Object} options
46
+ * @param {Object} options.roapMessage
47
+ * @param {String} options.locusSelfUrl
48
+ * @param {String} options.mediaId
49
+ * @param {String} options.correlationId
50
+ * @param {Boolean} options.audioMuted
51
+ * @param {Boolean} options.videoMuted
52
+ * @param {String} options.meetingId
53
+ * @param {Boolean} options.preferTranscoding
54
+ * @returns {Promise} returns the response/failure of the request
55
+ */
56
+ sendRoap(options: {
57
+ roapMessage: any;
58
+ locusSelfUrl: string;
59
+ mediaId: string;
60
+ correlationId: string;
61
+ audioMuted: boolean;
62
+ videoMuted: boolean;
63
+ meetingId: string;
64
+ preferTranscoding?: boolean;
65
+ }) {
66
+ const {roapMessage, locusSelfUrl, mediaId, correlationId, meetingId} = options;
67
+
68
+ if (!mediaId) {
69
+ LoggerProxy.logger.info('Roap:request#sendRoap --> Race Condition /call mediaID not present');
70
+ }
71
+
72
+ const mediaUrl = `${locusSelfUrl}/${MEDIA}`;
73
+ // @ts-ignore
74
+ const deviceUrl = this.webex.internal.device.url;
75
+
76
+ LoggerProxy.logger.info(
77
+ `Roap:request#sendRoap --> ${mediaUrl} \n ${roapMessage.messageType} \n seq:${roapMessage.seq}`
78
+ );
79
+
80
+ Metrics.postEvent({event: eventType.MEDIA_REQUEST, meetingId});
81
+
82
+ return this.attachRechabilityData({
83
+ roapMessage,
84
+ // eslint-disable-next-line no-warning-comments
85
+ // TODO: check whats the need for video and audiomute
86
+ audioMuted: !!options.audioMuted,
87
+ videoMuted: !!options.videoMuted,
88
+ }).then((sdpWithReachability) => {
89
+ // @ts-ignore
90
+ return this.webex
91
+ .request({
92
+ uri: mediaUrl,
93
+ method: HTTP_VERBS.PUT,
94
+ body: {
95
+ device: {
96
+ url: deviceUrl,
97
+ // @ts-ignore
98
+ deviceType: this.config.meetings.deviceType,
99
+ },
100
+ correlationId,
101
+ localMedias: [
102
+ {
103
+ localSdp: JSON.stringify(sdpWithReachability),
104
+ mediaId: options.mediaId,
105
+ },
106
+ ],
107
+ clientMediaPreferences: {
108
+ preferTranscoding: options.preferTranscoding ?? true,
109
+ },
110
+ },
111
+ })
112
+ .then((res) => {
113
+ Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meetingId});
114
+
115
+ // always it will be the first mediaConnection Object
116
+ const mediaConnections =
117
+ res.body.mediaConnections &&
118
+ res.body.mediaConnections.length > 0 &&
119
+ res.body.mediaConnections[0];
120
+
121
+ LoggerProxy.logger.info(
122
+ `Roap:request#sendRoap --> response:${JSON.stringify(
123
+ mediaConnections,
124
+ null,
125
+ 2
126
+ )}'\n StatusCode:'${res.statusCode}`
127
+ );
128
+ const {locus} = res.body;
129
+
130
+ locus.roapSeq = options.roapMessage.seq;
131
+
132
+ return {
133
+ locus,
134
+ ...(mediaConnections && {mediaConnections: res.body.mediaConnections}),
135
+ };
136
+ })
137
+ .catch((err) => {
138
+ Metrics.postEvent({
139
+ event: eventType.MEDIA_RESPONSE,
140
+ meetingId,
141
+ data: {error: Metrics.parseLocusError(err, true)},
142
+ });
143
+ LoggerProxy.logger.error(
144
+ `Roap:request#sendRoap --> Error:${JSON.stringify(err, null, 2)}`
145
+ );
146
+ LoggerProxy.logger.error(
147
+ `Roap:request#sendRoapRequest --> errorBody:${JSON.stringify(
148
+ roapMessage,
149
+ null,
150
+ 2
151
+ )} + '\\n mediaId:'${options.mediaId}`
152
+ );
153
+ throw err;
154
+ });
155
+ });
156
+ }
157
+ }
@@ -1,3 +1,4 @@
1
+ // @ts-ignore - Types not available for @webex/common
1
2
  import {Defer} from '@webex/common';
2
3
 
3
4
  import Metrics from '../metrics';
@@ -6,6 +7,7 @@ import LoggerProxy from '../common/logs/logger-proxy';
6
7
  import {ROAP} from '../constants';
7
8
 
8
9
  import RoapRequest from './request';
10
+ import Meeting from '../meeting';
9
11
 
10
12
  const TURN_DISCOVERY_TIMEOUT = 10; // in seconds
11
13
 
@@ -46,7 +48,6 @@ export default class TurnDiscovery {
46
48
  };
47
49
  }
48
50
 
49
-
50
51
  /**
51
52
  * waits for TURN_DISCOVERY_RESPONSE message to arrive
52
53
  *
@@ -54,22 +55,30 @@ export default class TurnDiscovery {
54
55
  * @private
55
56
  * @memberof Roap
56
57
  */
57
- waitForTurnDiscoveryResponse() {
58
+ private waitForTurnDiscoveryResponse() {
58
59
  if (!this.defer) {
59
- LoggerProxy.logger.warn('Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress');
60
+ LoggerProxy.logger.warn(
61
+ 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress'
62
+ );
60
63
 
61
- return Promise.reject(new Error('waitForTurnDiscoveryResponse() called before sendRoapTurnDiscoveryRequest()'));
64
+ return Promise.reject(
65
+ new Error('waitForTurnDiscoveryResponse() called before sendRoapTurnDiscoveryRequest()')
66
+ );
62
67
  }
63
68
 
64
69
  const {defer} = this;
65
70
 
66
71
  this.responseTimer = setTimeout(() => {
67
- LoggerProxy.logger.warn(`Roap:turnDiscovery#waitForTurnDiscoveryResponse --> timeout! no response arrived within ${TURN_DISCOVERY_TIMEOUT} seconds`);
72
+ LoggerProxy.logger.warn(
73
+ `Roap:turnDiscovery#waitForTurnDiscoveryResponse --> timeout! no response arrived within ${TURN_DISCOVERY_TIMEOUT} seconds`
74
+ );
68
75
 
69
76
  defer.reject(new Error('Timed out waiting for TURN_DISCOVERY_RESPONSE'));
70
77
  }, TURN_DISCOVERY_TIMEOUT * 1000);
71
78
 
72
- LoggerProxy.logger.info('Roap:turnDiscovery#waitForTurnDiscoveryResponse --> waiting for TURN_DISCOVERY_RESPONSE...');
79
+ LoggerProxy.logger.info(
80
+ 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> waiting for TURN_DISCOVERY_RESPONSE...'
81
+ );
73
82
 
74
83
  return defer.promise;
75
84
  }
@@ -82,11 +91,14 @@ export default class TurnDiscovery {
82
91
  * @public
83
92
  * @memberof Roap
84
93
  */
85
- handleTurnDiscoveryResponse(roapMessage) {
94
+ public handleTurnDiscoveryResponse(roapMessage: object) {
95
+ // @ts-ignore - Fix missing type
86
96
  const {headers} = roapMessage;
87
97
 
88
98
  if (!this.defer) {
89
- LoggerProxy.logger.warn('Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response');
99
+ LoggerProxy.logger.warn(
100
+ 'Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response'
101
+ );
90
102
 
91
103
  return;
92
104
  }
@@ -103,7 +115,9 @@ export default class TurnDiscovery {
103
115
  // check if it matches any of our expected headers
104
116
  expectedHeaders.forEach((expectedHeader) => {
105
117
  if (receivedHeader.startsWith(`${expectedHeader.headerName}=`)) {
106
- this.turnInfo[expectedHeader.field] = receivedHeader.substring(expectedHeader.headerName.length + 1);
118
+ this.turnInfo[expectedHeader.field] = receivedHeader.substring(
119
+ expectedHeader.headerName.length + 1
120
+ );
107
121
  foundHeaders += 1;
108
122
  }
109
123
  });
@@ -113,11 +127,18 @@ export default class TurnDiscovery {
113
127
  this.responseTimer = undefined;
114
128
 
115
129
  if (foundHeaders !== expectedHeaders.length) {
116
- LoggerProxy.logger.warn(`Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received: ${JSON.stringify(headers)}`);
117
- this.defer.reject(new Error(`TURN_DISCOVERY_RESPONSE missing some headers: ${JSON.stringify(headers)}`));
118
- }
119
- else {
120
- LoggerProxy.logger.info(`Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response, url=${this.turnInfo.url}`);
130
+ LoggerProxy.logger.warn(
131
+ `Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received: ${JSON.stringify(
132
+ headers
133
+ )}`
134
+ );
135
+ this.defer.reject(
136
+ new Error(`TURN_DISCOVERY_RESPONSE missing some headers: ${JSON.stringify(headers)}`)
137
+ );
138
+ } else {
139
+ LoggerProxy.logger.info(
140
+ `Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response, url=${this.turnInfo.url}`
141
+ );
121
142
  this.defer.resolve();
122
143
  }
123
144
  }
@@ -131,9 +152,11 @@ export default class TurnDiscovery {
131
152
  * @private
132
153
  * @memberof Roap
133
154
  */
134
- sendRoapTurnDiscoveryRequest(meeting, isReconnecting) {
155
+ sendRoapTurnDiscoveryRequest(meeting: Meeting, isReconnecting: boolean) {
135
156
  if (this.defer) {
136
- LoggerProxy.logger.warn('Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress');
157
+ LoggerProxy.logger.warn(
158
+ 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'
159
+ );
137
160
 
138
161
  return Promise.resolve();
139
162
  }
@@ -146,17 +169,22 @@ export default class TurnDiscovery {
146
169
  seq: TURN_DISCOVERY_SEQ,
147
170
  };
148
171
 
149
- LoggerProxy.logger.info('Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> sending TURN_DISCOVERY_REQUEST');
172
+ LoggerProxy.logger.info(
173
+ 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> sending TURN_DISCOVERY_REQUEST'
174
+ );
150
175
 
151
176
  return this.roapRequest
152
177
  .sendRoap({
153
178
  roapMessage,
154
179
  correlationId: meeting.correlationId,
180
+ // @ts-ignore - Fix missing type
155
181
  locusSelfUrl: meeting.selfUrl,
182
+ // @ts-ignore - Fix missing type
156
183
  mediaId: isReconnecting ? '' : meeting.mediaId,
157
184
  audioMuted: meeting.isAudioMuted(),
158
185
  videoMuted: meeting.isVideoMuted(),
159
- meetingId: meeting.id
186
+ meetingId: meeting.id,
187
+ preferTranscoding: !meeting.isMultistream,
160
188
  })
161
189
  .then(({mediaConnections}) => {
162
190
  if (mediaConnections) {
@@ -172,7 +200,7 @@ export default class TurnDiscovery {
172
200
  * @param {Meeting} meeting
173
201
  * @returns {Promise}
174
202
  */
175
- sendRoapOK(meeting) {
203
+ sendRoapOK(meeting: Meeting) {
176
204
  LoggerProxy.logger.info('Roap:turnDiscovery#sendRoapOK --> sending OK');
177
205
 
178
206
  return this.roapRequest.sendRoap({
@@ -181,12 +209,15 @@ export default class TurnDiscovery {
181
209
  version: ROAP.ROAP_VERSION,
182
210
  seq: TURN_DISCOVERY_SEQ,
183
211
  },
212
+ // @ts-ignore - fix type
184
213
  locusSelfUrl: meeting.selfUrl,
214
+ // @ts-ignore - fix type
185
215
  mediaId: meeting.mediaId,
186
216
  correlationId: meeting.correlationId,
187
217
  audioMuted: meeting.isAudioMuted(),
188
218
  videoMuted: meeting.isVideoMuted(),
189
- meetingId: meeting.id
219
+ meetingId: meeting.id,
220
+ preferTranscoding: !meeting.isMultistream,
190
221
  });
191
222
  }
192
223
 
@@ -207,18 +238,28 @@ export default class TurnDiscovery {
207
238
  * media connection just after a reconnection
208
239
  * @returns {Promise}
209
240
  */
210
- doTurnDiscovery(meeting, isReconnecting) {
211
- const isAnyClusterReachable = meeting.webex.meetings.reachability.isAnyClusterReachable();
241
+ async doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean) {
242
+ // @ts-ignore - fix type
243
+ const isAnyClusterReachable = await meeting.webex.meetings.reachability.isAnyClusterReachable();
212
244
 
213
245
  if (isAnyClusterReachable) {
214
- LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> reachability has not failed, skipping TURN discovery');
215
- return Promise.resolve({turnServerInfo: undefined, turnDiscoverySkippedReason: 'reachability'});
246
+ LoggerProxy.logger.info(
247
+ 'Roap:turnDiscovery#doTurnDiscovery --> reachability has not failed, skipping TURN discovery'
248
+ );
249
+
250
+ return {
251
+ turnServerInfo: undefined,
252
+ turnDiscoverySkippedReason: 'reachability',
253
+ };
216
254
  }
217
255
 
256
+ // @ts-ignore - fix type
218
257
  if (!meeting.config.experimental.enableTurnDiscovery) {
219
- LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery disabled in config, skipping it');
258
+ LoggerProxy.logger.info(
259
+ 'Roap:turnDiscovery#doTurnDiscovery --> TURN discovery disabled in config, skipping it'
260
+ );
220
261
 
221
- return Promise.resolve({turnServerInfo: undefined, turnDiscoverySkippedReason: 'config'});
262
+ return {turnServerInfo: undefined, turnDiscoverySkippedReason: 'config'};
222
263
  }
223
264
 
224
265
  return this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting)
@@ -233,19 +274,18 @@ export default class TurnDiscovery {
233
274
  })
234
275
  .catch((e) => {
235
276
  // we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN
236
- LoggerProxy.logger.info(`Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${e}`);
237
-
238
- Metrics.sendBehavioralMetric(
239
- BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE,
240
- {
241
- correlation_id: meeting.correlationId,
242
- locus_id: meeting.locusUrl.split('/').pop(),
243
- reason: e.message,
244
- stack: e.stack
245
- }
277
+ LoggerProxy.logger.info(
278
+ `Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${e}`
246
279
  );
247
280
 
248
- return Promise.resolve({turnServerInfo: undefined, turnDiscoverySkippedReason: undefined});
281
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {
282
+ correlation_id: meeting.correlationId,
283
+ locus_id: meeting.locusUrl.split('/').pop(),
284
+ reason: e.message,
285
+ stack: e.stack,
286
+ });
287
+
288
+ return {turnServerInfo: undefined, turnDiscoverySkippedReason: undefined};
249
289
  });
250
290
  }
251
291
  }
@@ -7,14 +7,14 @@ const STATS_DEFAULT = {
7
7
  availableBandwidth: 0,
8
8
  bytesSent: 0,
9
9
  meanRemoteJitter: [],
10
- meanRoundTripTime: []
10
+ meanRoundTripTime: [],
11
11
  },
12
12
  recv: {
13
13
  availableBandwidth: 0,
14
14
  bytesReceived: 0,
15
15
  meanRtpJitter: [],
16
- meanRoundTripTime: []
17
- }
16
+ meanRoundTripTime: [],
17
+ },
18
18
  },
19
19
  video: {
20
20
  send: {
@@ -22,17 +22,16 @@ const STATS_DEFAULT = {
22
22
  maxPacketLossRatio: 0,
23
23
  availableBandwidth: 0,
24
24
  meanRemoteJitter: [],
25
- meanRoundTripTime: []
25
+ meanRoundTripTime: [],
26
26
  },
27
27
  recv: {
28
28
  availableBandwidth: 0,
29
29
  totalPacketsLost: 0,
30
30
  meanRtpJitter: [],
31
- meanRoundTripTime: []
32
-
31
+ meanRoundTripTime: [],
33
32
  },
34
33
  latency: 0,
35
- packetsLost: 0
34
+ packetsLost: 0,
36
35
  },
37
36
  share: {
38
37
  send: {
@@ -40,16 +39,16 @@ const STATS_DEFAULT = {
40
39
  availableBandwidth: 0,
41
40
  totalPacketsLost: 0,
42
41
  meanRemoteJitter: [],
43
- meanRoundTripTime: []
42
+ meanRoundTripTime: [],
44
43
  },
45
44
  recv: {
46
45
  availableBandwidth: 0,
47
46
  meanRtpJitter: [],
48
- meanRoundTripTime: []
47
+ meanRoundTripTime: [],
49
48
  },
50
49
 
51
50
  latency: 0,
52
- packetsLost: 0
51
+ packetsLost: 0,
53
52
  },
54
53
  bandwidth: {
55
54
  systemBandwidth: 0,
@@ -57,9 +56,9 @@ const STATS_DEFAULT = {
57
56
  encodedPerSecond: 0,
58
57
  helper: {
59
58
  audioBytesSent: 0,
60
- videoBytestSent: 0
59
+ videoBytestSent: 0,
61
60
  },
62
- speed: 0
61
+ speed: 0,
63
62
  },
64
63
  results: {},
65
64
  connectionType: {
@@ -69,65 +68,63 @@ const STATS_DEFAULT = {
69
68
  candidateType: [],
70
69
  transport: [],
71
70
  ipAddress: [],
72
- networkType: []
71
+ networkType: [],
73
72
  },
74
73
  remote: {
75
74
  candidateType: [],
76
75
  transport: [],
77
76
  ipAddress: [],
78
- networkType: []
79
- }
77
+ networkType: [],
78
+ },
80
79
  },
81
80
  resolutions: {
82
81
  audio: {
83
82
  send: {
84
83
  width: 0,
85
- height: 0
84
+ height: 0,
86
85
  },
87
86
  recv: {
88
87
  width: 0,
89
- height: 0
90
- }
88
+ height: 0,
89
+ },
91
90
  },
92
91
  video: {
93
92
  send: {
94
93
  width: 0,
95
- height: 0
94
+ height: 0,
96
95
  },
97
96
  recv: {
98
97
  width: 0,
99
- height: 0
100
- }
98
+ height: 0,
99
+ },
101
100
  },
102
101
  share: {
103
102
  send: {
104
103
  width: 0,
105
- height: 0
104
+ height: 0,
106
105
  },
107
106
  recv: {
108
107
  width: 0,
109
- height: 0
110
- }
111
- }
108
+ height: 0,
109
+ },
110
+ },
112
111
  },
113
112
  internal: {
114
113
  audio: {
115
114
  send: {},
116
- recv: {}
115
+ recv: {},
117
116
  },
118
117
  video: {
119
118
  send: {},
120
- recv: {}
119
+ recv: {},
121
120
  },
122
121
  share: {
123
122
  send: {},
124
- recv: {}
123
+ recv: {},
125
124
  },
126
- remote: {
127
-
128
- },
129
- candidates: {}
130
- }
125
+ remote: {},
126
+ candidates: {},
127
+ },
131
128
  };
132
129
 
133
130
  export default STATS_DEFAULT;