@webex/plugin-meetings 3.0.0-beta.33 → 3.0.0-beta.331

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 (378) 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 +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +94 -15
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +709 -35
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/utils.js +45 -1
  17. package/dist/breakouts/utils.js.map +1 -1
  18. package/dist/common/errors/no-meeting-info.js +51 -0
  19. package/dist/common/errors/no-meeting-info.js.map +1 -0
  20. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  21. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +48 -7
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/common/logs/request.js +5 -1
  27. package/dist/common/logs/request.js.map +1 -1
  28. package/dist/common/queue.js +24 -9
  29. package/dist/common/queue.js.map +1 -1
  30. package/dist/config.js +4 -10
  31. package/dist/config.js.map +1 -1
  32. package/dist/constants.js +233 -29
  33. package/dist/constants.js.map +1 -1
  34. package/dist/controls-options-manager/enums.js +14 -2
  35. package/dist/controls-options-manager/enums.js.map +1 -1
  36. package/dist/controls-options-manager/index.js +109 -15
  37. package/dist/controls-options-manager/index.js.map +1 -1
  38. package/dist/controls-options-manager/types.js +7 -0
  39. package/dist/controls-options-manager/types.js.map +1 -0
  40. package/dist/controls-options-manager/util.js +309 -18
  41. package/dist/controls-options-manager/util.js.map +1 -1
  42. package/dist/index.js +112 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/interpretation/collection.js +23 -0
  45. package/dist/interpretation/collection.js.map +1 -0
  46. package/dist/interpretation/index.js +366 -0
  47. package/dist/interpretation/index.js.map +1 -0
  48. package/dist/interpretation/siLanguage.js +25 -0
  49. package/dist/interpretation/siLanguage.js.map +1 -0
  50. package/dist/locus-info/controlsUtils.js +91 -2
  51. package/dist/locus-info/controlsUtils.js.map +1 -1
  52. package/dist/locus-info/index.js +383 -62
  53. package/dist/locus-info/index.js.map +1 -1
  54. package/dist/locus-info/infoUtils.js +7 -1
  55. package/dist/locus-info/infoUtils.js.map +1 -1
  56. package/dist/locus-info/mediaSharesUtils.js +57 -1
  57. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  58. package/dist/locus-info/parser.js +249 -72
  59. package/dist/locus-info/parser.js.map +1 -1
  60. package/dist/locus-info/selfUtils.js +89 -14
  61. package/dist/locus-info/selfUtils.js.map +1 -1
  62. package/dist/media/index.js +61 -116
  63. package/dist/media/index.js.map +1 -1
  64. package/dist/media/properties.js +73 -124
  65. package/dist/media/properties.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +86 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +3917 -2960
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +292 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +230 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +260 -196
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +601 -417
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +73 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +192 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/util.js +1 -1
  83. package/dist/meeting-info/util.js.map +1 -1
  84. package/dist/meeting-info/utilv2.js +36 -36
  85. package/dist/meeting-info/utilv2.js.map +1 -1
  86. package/dist/meetings/collection.js +39 -0
  87. package/dist/meetings/collection.js.map +1 -1
  88. package/dist/meetings/index.js +424 -116
  89. package/dist/meetings/index.js.map +1 -1
  90. package/dist/meetings/meetings.types.js +7 -0
  91. package/dist/meetings/meetings.types.js.map +1 -0
  92. package/dist/meetings/request.js +2 -0
  93. package/dist/meetings/request.js.map +1 -1
  94. package/dist/meetings/util.js +72 -6
  95. package/dist/meetings/util.js.map +1 -1
  96. package/dist/member/index.js +58 -0
  97. package/dist/member/index.js.map +1 -1
  98. package/dist/member/types.js +25 -0
  99. package/dist/member/types.js.map +1 -0
  100. package/dist/member/util.js +132 -25
  101. package/dist/member/util.js.map +1 -1
  102. package/dist/members/collection.js +10 -0
  103. package/dist/members/collection.js.map +1 -1
  104. package/dist/members/index.js +102 -6
  105. package/dist/members/index.js.map +1 -1
  106. package/dist/members/request.js +106 -38
  107. package/dist/members/request.js.map +1 -1
  108. package/dist/members/types.js +15 -0
  109. package/dist/members/types.js.map +1 -0
  110. package/dist/members/util.js +326 -232
  111. package/dist/members/util.js.map +1 -1
  112. package/dist/metrics/constants.js +16 -5
  113. package/dist/metrics/constants.js.map +1 -1
  114. package/dist/metrics/index.js +1 -468
  115. package/dist/metrics/index.js.map +1 -1
  116. package/dist/multistream/mediaRequestManager.js +228 -58
  117. package/dist/multistream/mediaRequestManager.js.map +1 -1
  118. package/dist/multistream/receiveSlot.js +29 -16
  119. package/dist/multistream/receiveSlot.js.map +1 -1
  120. package/dist/multistream/receiveSlotManager.js +39 -36
  121. package/dist/multistream/receiveSlotManager.js.map +1 -1
  122. package/dist/multistream/remoteMedia.js +44 -18
  123. package/dist/multistream/remoteMedia.js.map +1 -1
  124. package/dist/multistream/remoteMediaGroup.js +60 -3
  125. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  126. package/dist/multistream/remoteMediaManager.js +209 -59
  127. package/dist/multistream/remoteMediaManager.js.map +1 -1
  128. package/dist/multistream/sendSlotManager.js +233 -0
  129. package/dist/multistream/sendSlotManager.js.map +1 -0
  130. package/dist/reachability/index.js +225 -59
  131. package/dist/reachability/index.js.map +1 -1
  132. package/dist/reachability/request.js +17 -8
  133. package/dist/reachability/request.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +214 -170
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -2
  137. package/dist/recording-controller/index.js.map +1 -1
  138. package/dist/recording-controller/util.js +9 -8
  139. package/dist/recording-controller/util.js.map +1 -1
  140. package/dist/roap/index.js +62 -32
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +112 -97
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +95 -36
  145. package/dist/roap/turnDiscovery.js.map +1 -1
  146. package/dist/rtcMetrics/constants.js +12 -0
  147. package/dist/rtcMetrics/constants.js.map +1 -0
  148. package/dist/rtcMetrics/index.js +142 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/index.js +107 -79
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +27 -26
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/types/annotation/annotation.types.d.ts +42 -0
  155. package/dist/types/annotation/constants.d.ts +31 -0
  156. package/dist/types/annotation/index.d.ts +117 -0
  157. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  158. package/dist/types/breakouts/events.d.ts +8 -0
  159. package/dist/types/breakouts/utils.d.ts +14 -0
  160. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  161. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  162. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  163. package/dist/types/common/logs/request.d.ts +2 -0
  164. package/dist/types/common/queue.d.ts +9 -7
  165. package/dist/types/config.d.ts +1 -7
  166. package/dist/types/constants.d.ts +201 -30
  167. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  168. package/dist/types/controls-options-manager/index.d.ts +17 -1
  169. package/dist/types/controls-options-manager/types.d.ts +43 -0
  170. package/dist/types/controls-options-manager/util.d.ts +1 -7
  171. package/dist/types/index.d.ts +6 -4
  172. package/dist/types/interpretation/collection.d.ts +5 -0
  173. package/dist/types/interpretation/index.d.ts +5 -0
  174. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  175. package/dist/types/locus-info/index.d.ts +57 -4
  176. package/dist/types/locus-info/parser.d.ts +67 -6
  177. package/dist/types/media/index.d.ts +2 -0
  178. package/dist/types/media/properties.d.ts +34 -48
  179. package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
  180. package/dist/types/meeting/index.d.ts +502 -512
  181. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  182. package/dist/types/meeting/muteState.d.ts +99 -23
  183. package/dist/types/meeting/request.d.ts +72 -43
  184. package/dist/types/meeting/util.d.ts +101 -1
  185. package/dist/types/meeting-info/index.d.ts +13 -1
  186. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  187. package/dist/types/meetings/collection.d.ts +17 -0
  188. package/dist/types/meetings/index.d.ts +101 -21
  189. package/dist/types/meetings/meetings.types.d.ts +4 -0
  190. package/dist/types/member/index.d.ts +14 -0
  191. package/dist/types/member/types.d.ts +32 -0
  192. package/dist/types/members/collection.d.ts +5 -0
  193. package/dist/types/members/index.d.ts +35 -2
  194. package/dist/types/members/request.d.ts +73 -9
  195. package/dist/types/members/types.d.ts +25 -0
  196. package/dist/types/members/util.d.ts +214 -1
  197. package/dist/types/metrics/constants.d.ts +15 -4
  198. package/dist/types/metrics/index.d.ts +4 -119
  199. package/dist/types/multistream/mediaRequestManager.d.ts +72 -5
  200. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  201. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  202. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  203. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  204. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  205. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  206. package/dist/types/reachability/index.d.ts +61 -7
  207. package/dist/types/reachability/request.d.ts +7 -3
  208. package/dist/types/reconnection-manager/index.d.ts +19 -0
  209. package/dist/types/recording-controller/index.d.ts +15 -1
  210. package/dist/types/recording-controller/util.d.ts +5 -4
  211. package/dist/types/roap/index.d.ts +2 -1
  212. package/dist/types/roap/request.d.ts +15 -11
  213. package/dist/types/roap/turnDiscovery.d.ts +21 -3
  214. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  215. package/dist/types/rtcMetrics/index.d.ts +54 -0
  216. package/dist/types/statsAnalyzer/index.d.ts +7 -1
  217. package/dist/types/webinar/collection.d.ts +16 -0
  218. package/dist/types/webinar/index.d.ts +5 -0
  219. package/dist/webinar/collection.js +44 -0
  220. package/dist/webinar/collection.js.map +1 -0
  221. package/dist/webinar/index.js +69 -0
  222. package/dist/webinar/index.js.map +1 -0
  223. package/package.json +24 -20
  224. package/src/annotation/annotation.types.ts +50 -0
  225. package/src/annotation/constants.ts +36 -0
  226. package/src/annotation/index.ts +328 -0
  227. package/src/breakouts/README.md +42 -12
  228. package/src/breakouts/breakout.ts +67 -9
  229. package/src/breakouts/edit-lock-error.ts +25 -0
  230. package/src/breakouts/events.ts +56 -0
  231. package/src/breakouts/index.ts +592 -20
  232. package/src/breakouts/utils.ts +42 -0
  233. package/src/common/errors/no-meeting-info.ts +24 -0
  234. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  235. package/src/common/errors/webex-errors.ts +44 -2
  236. package/src/common/logs/logger-proxy.ts +1 -1
  237. package/src/common/logs/request.ts +5 -1
  238. package/src/common/queue.ts +22 -8
  239. package/src/config.ts +3 -9
  240. package/src/constants.ts +224 -20
  241. package/src/controls-options-manager/enums.ts +12 -0
  242. package/src/controls-options-manager/index.ts +116 -21
  243. package/src/controls-options-manager/types.ts +59 -0
  244. package/src/controls-options-manager/util.ts +294 -14
  245. package/src/index.ts +40 -0
  246. package/src/interpretation/README.md +60 -0
  247. package/src/interpretation/collection.ts +19 -0
  248. package/src/interpretation/index.ts +332 -0
  249. package/src/interpretation/siLanguage.ts +18 -0
  250. package/src/locus-info/controlsUtils.ts +108 -0
  251. package/src/locus-info/index.ts +413 -59
  252. package/src/locus-info/infoUtils.ts +10 -2
  253. package/src/locus-info/mediaSharesUtils.ts +64 -0
  254. package/src/locus-info/parser.ts +258 -47
  255. package/src/locus-info/selfUtils.ts +81 -5
  256. package/src/media/index.ts +102 -122
  257. package/src/media/properties.ts +87 -110
  258. package/src/meeting/in-meeting-actions.ts +171 -3
  259. package/src/meeting/index.ts +3267 -2555
  260. package/src/meeting/locusMediaRequest.ts +313 -0
  261. package/src/meeting/muteState.ts +229 -131
  262. package/src/meeting/request.ts +177 -121
  263. package/src/meeting/util.ts +588 -394
  264. package/src/meeting-info/index.ts +81 -8
  265. package/src/meeting-info/meeting-info-v2.ts +170 -14
  266. package/src/meeting-info/util.ts +1 -1
  267. package/src/meeting-info/utilv2.ts +23 -23
  268. package/src/meetings/collection.ts +33 -0
  269. package/src/meetings/index.ts +454 -125
  270. package/src/meetings/meetings.types.ts +12 -0
  271. package/src/meetings/request.ts +2 -0
  272. package/src/meetings/util.ts +80 -11
  273. package/src/member/index.ts +58 -0
  274. package/src/member/types.ts +38 -0
  275. package/src/member/util.ts +141 -25
  276. package/src/members/collection.ts +8 -0
  277. package/src/members/index.ts +134 -8
  278. package/src/members/request.ts +97 -17
  279. package/src/members/types.ts +29 -0
  280. package/src/members/util.ts +333 -240
  281. package/src/metrics/constants.ts +15 -4
  282. package/src/metrics/index.ts +1 -490
  283. package/src/multistream/mediaRequestManager.ts +277 -82
  284. package/src/multistream/receiveSlot.ts +31 -17
  285. package/src/multistream/receiveSlotManager.ts +34 -24
  286. package/src/multistream/remoteMedia.ts +27 -2
  287. package/src/multistream/remoteMediaGroup.ts +59 -0
  288. package/src/multistream/remoteMediaManager.ts +148 -30
  289. package/src/multistream/sendSlotManager.ts +170 -0
  290. package/src/reachability/index.ts +228 -37
  291. package/src/reachability/request.ts +17 -8
  292. package/src/reconnection-manager/index.ts +128 -106
  293. package/src/recording-controller/index.ts +20 -3
  294. package/src/recording-controller/util.ts +26 -9
  295. package/src/roap/index.ts +63 -32
  296. package/src/roap/request.ts +100 -104
  297. package/src/roap/turnDiscovery.ts +48 -26
  298. package/src/rtcMetrics/constants.ts +3 -0
  299. package/src/rtcMetrics/index.ts +124 -0
  300. package/src/statsAnalyzer/index.ts +135 -92
  301. package/src/statsAnalyzer/mqaUtil.ts +30 -28
  302. package/src/webinar/collection.ts +31 -0
  303. package/src/webinar/index.ts +62 -0
  304. package/test/integration/spec/converged-space-meetings.js +60 -3
  305. package/test/integration/spec/journey.js +320 -261
  306. package/test/integration/spec/space-meeting.js +76 -3
  307. package/test/unit/spec/annotation/index.ts +418 -0
  308. package/test/unit/spec/breakouts/breakout.ts +118 -28
  309. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  310. package/test/unit/spec/breakouts/events.ts +89 -0
  311. package/test/unit/spec/breakouts/index.ts +1395 -69
  312. package/test/unit/spec/breakouts/utils.js +52 -1
  313. package/test/unit/spec/common/queue.js +31 -2
  314. package/test/unit/spec/controls-options-manager/index.js +163 -0
  315. package/test/unit/spec/controls-options-manager/util.js +576 -60
  316. package/test/unit/spec/fixture/locus.js +1 -0
  317. package/test/unit/spec/interpretation/collection.ts +15 -0
  318. package/test/unit/spec/interpretation/index.ts +589 -0
  319. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  320. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  321. package/test/unit/spec/locus-info/index.js +1304 -33
  322. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  323. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  324. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  325. package/test/unit/spec/locus-info/parser.js +116 -35
  326. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  327. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  328. package/test/unit/spec/media/index.ts +104 -37
  329. package/test/unit/spec/media/properties.ts +2 -2
  330. package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
  331. package/test/unit/spec/meeting/index.js +5750 -2023
  332. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  333. package/test/unit/spec/meeting/muteState.js +408 -208
  334. package/test/unit/spec/meeting/request.js +483 -49
  335. package/test/unit/spec/meeting/utils.js +679 -64
  336. package/test/unit/spec/meeting-info/index.js +300 -0
  337. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  338. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  339. package/test/unit/spec/meetings/collection.js +26 -0
  340. package/test/unit/spec/meetings/index.js +1231 -212
  341. package/test/unit/spec/meetings/utils.js +202 -2
  342. package/test/unit/spec/member/index.js +61 -6
  343. package/test/unit/spec/member/util.js +510 -34
  344. package/test/unit/spec/members/index.js +432 -1
  345. package/test/unit/spec/members/request.js +206 -27
  346. package/test/unit/spec/members/utils.js +210 -0
  347. package/test/unit/spec/metrics/index.js +1 -50
  348. package/test/unit/spec/multistream/mediaRequestManager.ts +776 -162
  349. package/test/unit/spec/multistream/receiveSlot.ts +28 -20
  350. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  351. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  352. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  353. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  354. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  355. package/test/unit/spec/reachability/index.ts +549 -9
  356. package/test/unit/spec/reachability/request.js +68 -0
  357. package/test/unit/spec/reconnection-manager/index.js +117 -11
  358. package/test/unit/spec/recording-controller/index.js +294 -218
  359. package/test/unit/spec/recording-controller/util.js +223 -96
  360. package/test/unit/spec/roap/index.ts +178 -64
  361. package/test/unit/spec/roap/request.ts +203 -85
  362. package/test/unit/spec/roap/turnDiscovery.ts +82 -36
  363. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  364. package/test/unit/spec/stats-analyzer/index.js +147 -3
  365. package/test/unit/spec/webinar/collection.ts +13 -0
  366. package/test/unit/spec/webinar/index.ts +60 -0
  367. package/test/utils/integrationTestUtils.js +46 -0
  368. package/test/utils/testUtils.js +0 -52
  369. package/dist/meeting/effectsState.js +0 -262
  370. package/dist/meeting/effectsState.js.map +0 -1
  371. package/dist/metrics/config.js +0 -299
  372. package/dist/metrics/config.js.map +0 -1
  373. package/dist/types/meeting/effectsState.d.ts +0 -42
  374. package/dist/types/metrics/config.d.ts +0 -178
  375. package/src/index.js +0 -16
  376. package/src/meeting/effectsState.ts +0 -211
  377. package/src/metrics/config.ts +0 -495
  378. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -1,43 +1,45 @@
1
- /* global window */
2
1
  // @ts-ignore
3
2
  import {StatelessWebexPlugin} from '@webex/webex-core';
4
3
 
5
4
  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';
5
+ import {IP_VERSION, REACHABILITY} from '../constants';
6
+ import {LocusMediaRequest} from '../meeting/locusMediaRequest';
9
7
 
10
8
  /**
11
9
  * @class RoapRequest
12
10
  */
13
11
  export default class RoapRequest extends StatelessWebexPlugin {
14
12
  /**
15
- * Joins a meeting via ROAP
13
+ * Returns reachability data.
16
14
  * @param {Object} localSdp
17
- * @returns {Promise} returns a promise that resolves/rejects whatever the request does
15
+ * @returns {Object}
18
16
  */
19
- async attachRechabilityData(localSdp) {
17
+ async attachReachabilityData(localSdp) {
18
+ let joinCookie;
19
+
20
+ // @ts-ignore
21
+ const reachabilityResult = await this.webex.meetings.reachability.getReachabilityResults();
22
+
23
+ if (reachabilityResult && Object.keys(reachabilityResult).length) {
24
+ localSdp.reachability = reachabilityResult;
25
+ }
26
+
20
27
  // @ts-ignore
21
- const reachabilityData = await this.webex.boundedStorage
22
- .get(REACHABILITY.namespace, REACHABILITY.localStorage)
28
+ const joinCookieRaw = await this.webex.boundedStorage
29
+ .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)
23
30
  .catch(() => {});
24
31
 
25
- if (reachabilityData) {
32
+ if (joinCookieRaw) {
26
33
  try {
27
- const reachabilityResult = JSON.parse(reachabilityData);
28
-
29
- /* istanbul ignore else */
30
- if (reachabilityResult && Object.keys(reachabilityResult).length) {
31
- localSdp.reachability = reachabilityResult;
32
- }
34
+ joinCookie = JSON.parse(joinCookieRaw);
33
35
  } catch (e) {
34
36
  LoggerProxy.logger.error(
35
- `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`
37
+ `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`
36
38
  );
37
39
  }
38
40
  }
39
41
 
40
- return localSdp;
42
+ return {localSdp, joinCookie};
41
43
  }
42
44
 
43
45
  /**
@@ -47,111 +49,105 @@ export default class RoapRequest extends StatelessWebexPlugin {
47
49
  * @param {String} options.locusSelfUrl
48
50
  * @param {String} options.mediaId
49
51
  * @param {String} options.correlationId
50
- * @param {Boolean} options.audioMuted
51
- * @param {Boolean} options.videoMuted
52
52
  * @param {String} options.meetingId
53
- * @param {Boolean} options.preferTranscoding
53
+ * @param {IP_VERSION} options.ipVersion only required for offers
54
54
  * @returns {Promise} returns the response/failure of the request
55
55
  */
56
- sendRoap(options: {
56
+ async sendRoap(options: {
57
57
  roapMessage: any;
58
58
  locusSelfUrl: string;
59
59
  mediaId: string;
60
- correlationId: string;
61
- audioMuted: boolean;
62
- videoMuted: boolean;
63
60
  meetingId: string;
64
- preferTranscoding?: boolean;
61
+ ipVersion?: IP_VERSION;
62
+ locusMediaRequest?: LocusMediaRequest;
65
63
  }) {
66
- const {roapMessage, locusSelfUrl, mediaId, correlationId, meetingId} = options;
64
+ const {roapMessage, locusSelfUrl, mediaId, meetingId, locusMediaRequest, ipVersion} = options;
67
65
 
68
66
  if (!mediaId) {
69
- LoggerProxy.logger.info('Roap:request#sendRoap --> Race Condition /call mediaID not present');
67
+ LoggerProxy.logger.info('Roap:request#sendRoap --> sending empty mediaID');
70
68
  }
71
69
 
72
- const mediaUrl = `${locusSelfUrl}/${MEDIA}`;
73
- // @ts-ignore
74
- const deviceUrl = this.webex.internal.device.url;
70
+ if (!locusMediaRequest) {
71
+ LoggerProxy.logger.warn(
72
+ 'Roap:request#sendRoap --> locusMediaRequest unavailable, not sending roap'
73
+ );
74
+
75
+ return Promise.reject(new Error('sendRoap called when locusMediaRequest is undefined'));
76
+ }
77
+ const {localSdp: localSdpWithReachabilityData, joinCookie} = await this.attachReachabilityData({
78
+ roapMessage,
79
+ });
75
80
 
76
81
  LoggerProxy.logger.info(
77
- `Roap:request#sendRoap --> ${mediaUrl} \n ${roapMessage.messageType} \n seq:${roapMessage.seq}`
82
+ `Roap:request#sendRoap --> ${locusSelfUrl} \n ${roapMessage.messageType} \n seq:${roapMessage.seq}`
78
83
  );
79
84
 
80
- Metrics.postEvent({event: eventType.MEDIA_REQUEST, meetingId});
85
+ // @ts-ignore
86
+ this.webex.internal.newMetrics.submitClientEvent({
87
+ name: 'client.locus.media.request',
88
+ options: {
89
+ meetingId,
90
+ },
91
+ });
81
92
 
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
- },
93
+ return locusMediaRequest
94
+ .send({
95
+ type: 'RoapMessage',
96
+ selfUrl: locusSelfUrl,
97
+ joinCookie,
98
+ mediaId,
99
+ roapMessage,
100
+ reachability: localSdpWithReachabilityData.reachability,
101
+ ipVersion,
102
+ })
103
+ .then((res) => {
104
+ // @ts-ignore
105
+ this.webex.internal.newMetrics.submitClientEvent({
106
+ name: 'client.locus.media.response',
107
+ options: {
108
+ meetingId,
110
109
  },
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.debug(
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,
110
+ });
111
+ // always it will be the first mediaConnection Object
112
+ const mediaConnections =
113
+ res.body.mediaConnections &&
114
+ res.body.mediaConnections.length > 0 &&
115
+ res.body.mediaConnections[0];
116
+
117
+ LoggerProxy.logger.debug(
118
+ `Roap:request#sendRoap --> response:${JSON.stringify(
119
+ mediaConnections,
120
+ null,
121
+ 2
122
+ )}'\n StatusCode:'${res.statusCode}`
123
+ );
124
+ const {locus} = res.body;
125
+
126
+ locus.roapSeq = options.roapMessage.seq;
127
+
128
+ return {
129
+ locus,
130
+ ...(mediaConnections && {mediaConnections: res.body.mediaConnections}),
131
+ };
132
+ })
133
+ .catch((err) => {
134
+ // @ts-ignore
135
+ this.webex.internal.newMetrics.submitClientEvent({
136
+ name: 'client.locus.media.response',
137
+ options: {
140
138
  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;
139
+ rawError: err,
140
+ },
154
141
  });
155
- });
142
+ LoggerProxy.logger.error(`Roap:request#sendRoap --> Error:${JSON.stringify(err, null, 2)}`);
143
+ LoggerProxy.logger.error(
144
+ `Roap:request#sendRoapRequest --> errorBody:${JSON.stringify(
145
+ roapMessage,
146
+ null,
147
+ 2
148
+ )} + '\\n mediaId:'${options.mediaId}`
149
+ );
150
+ throw err;
151
+ });
156
152
  }
157
153
  }
@@ -8,6 +8,7 @@ import {ROAP} from '../constants';
8
8
 
9
9
  import RoapRequest from './request';
10
10
  import Meeting from '../meeting';
11
+ import MeetingUtil from '../meeting/util';
11
12
 
12
13
  const TURN_DISCOVERY_TIMEOUT = 10; // in seconds
13
14
 
@@ -176,15 +177,14 @@ export default class TurnDiscovery {
176
177
  return this.roapRequest
177
178
  .sendRoap({
178
179
  roapMessage,
179
- correlationId: meeting.correlationId,
180
180
  // @ts-ignore - Fix missing type
181
181
  locusSelfUrl: meeting.selfUrl,
182
182
  // @ts-ignore - Fix missing type
183
183
  mediaId: isReconnecting ? '' : meeting.mediaId,
184
- audioMuted: meeting.isAudioMuted(),
185
- videoMuted: meeting.isVideoMuted(),
186
184
  meetingId: meeting.id,
187
- preferTranscoding: !meeting.isMultistream,
185
+ locusMediaRequest: meeting.locusMediaRequest,
186
+ // @ts-ignore - because of meeting.webex
187
+ ipVersion: MeetingUtil.getIpVersion(meeting.webex),
188
188
  })
189
189
  .then(({mediaConnections}) => {
190
190
  if (mediaConnections) {
@@ -213,14 +213,45 @@ export default class TurnDiscovery {
213
213
  locusSelfUrl: meeting.selfUrl,
214
214
  // @ts-ignore - fix type
215
215
  mediaId: meeting.mediaId,
216
- correlationId: meeting.correlationId,
217
- audioMuted: meeting.isAudioMuted(),
218
- videoMuted: meeting.isVideoMuted(),
219
216
  meetingId: meeting.id,
220
- preferTranscoding: !meeting.isMultistream,
217
+ locusMediaRequest: meeting.locusMediaRequest,
221
218
  });
222
219
  }
223
220
 
221
+ /**
222
+ * Gets the reason why reachability is skipped.
223
+ *
224
+ * @param {Meeting} meeting
225
+ * @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped
226
+ */
227
+ private async getSkipReason(meeting: Meeting): Promise<string> {
228
+ const isAnyPublicClusterReachable =
229
+ // @ts-ignore - fix type
230
+ await meeting.webex.meetings.reachability.isAnyPublicClusterReachable();
231
+
232
+ if (isAnyPublicClusterReachable) {
233
+ LoggerProxy.logger.info(
234
+ 'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'
235
+ );
236
+
237
+ return 'reachability';
238
+ }
239
+
240
+ return '';
241
+ }
242
+
243
+ /**
244
+ * Checks if TURN discovery is skipped.
245
+ *
246
+ * @param {Meeting} meeting
247
+ * @returns {Boolean} true if TURN discovery is being skipped, false if it is being done
248
+ */
249
+ async isSkipped(meeting) {
250
+ const skipReason = await this.getSkipReason(meeting);
251
+
252
+ return !!skipReason;
253
+ }
254
+
224
255
  /**
225
256
  * Retrieves TURN server information from the backend by doing
226
257
  * a roap message exchange:
@@ -234,34 +265,25 @@ export default class TurnDiscovery {
234
265
  * so it works fine no matter if TURN discovery is done or not.
235
266
  *
236
267
  * @param {Meeting} meeting
237
- * @param {Boolean} isReconnecting should be set to true if this is a new
268
+ * @param {Boolean} [isReconnecting] should be set to true if this is a new
238
269
  * media connection just after a reconnection
270
+ * @param {Boolean} [isForced]
239
271
  * @returns {Promise}
240
272
  */
241
- async doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean) {
242
- // @ts-ignore - fix type
243
- const isAnyClusterReachable = await meeting.webex.meetings.reachability.isAnyClusterReachable();
273
+ async doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean, isForced?: boolean) {
274
+ let turnDiscoverySkippedReason: string;
244
275
 
245
- if (isAnyClusterReachable) {
246
- LoggerProxy.logger.info(
247
- 'Roap:turnDiscovery#doTurnDiscovery --> reachability has not failed, skipping TURN discovery'
248
- );
276
+ if (!isForced) {
277
+ turnDiscoverySkippedReason = await this.getSkipReason(meeting);
278
+ }
249
279
 
280
+ if (turnDiscoverySkippedReason) {
250
281
  return {
251
282
  turnServerInfo: undefined,
252
- turnDiscoverySkippedReason: 'reachability',
283
+ turnDiscoverySkippedReason,
253
284
  };
254
285
  }
255
286
 
256
- // @ts-ignore - fix type
257
- if (!meeting.config.experimental.enableTurnDiscovery) {
258
- LoggerProxy.logger.info(
259
- 'Roap:turnDiscovery#doTurnDiscovery --> TURN discovery disabled in config, skipping it'
260
- );
261
-
262
- return {turnServerInfo: undefined, turnDiscoverySkippedReason: 'config'};
263
- }
264
-
265
287
  return this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting)
266
288
  .then(() => this.waitForTurnDiscoveryResponse())
267
289
  .then(() => this.sendRoapOK(meeting))
@@ -0,0 +1,3 @@
1
+ const RTC_METRICS = {APP_ID: 'FFB51ED5-4319-4C55-8303-B1F2FCCDE231'};
2
+
3
+ export {RTC_METRICS as default};
@@ -0,0 +1,124 @@
1
+ /* eslint-disable class-methods-use-this */
2
+ import {CallDiagnosticUtils} from '@webex/internal-plugin-metrics';
3
+ import RTC_METRICS from './constants';
4
+
5
+ /**
6
+ * Rtc Metrics
7
+ */
8
+ export default class RtcMetrics {
9
+ /**
10
+ * Array of MetricData items to be sent to the metrics service.
11
+ */
12
+ metricsQueue = [];
13
+
14
+ intervalId: number;
15
+
16
+ webex: any;
17
+
18
+ meetingId: string;
19
+
20
+ correlationId: string;
21
+
22
+ /**
23
+ * Initialize the interval.
24
+ *
25
+ * @param {object} webex - The main `webex` object.
26
+ * @param {string} meetingId - The meeting id.
27
+ * @param {string} correlationId - The correlation id.
28
+ */
29
+ constructor(webex, meetingId, correlationId) {
30
+ // `window` is used to prevent typescript from returning a NodeJS.Timer.
31
+ this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);
32
+ this.meetingId = meetingId;
33
+ this.webex = webex;
34
+ this.correlationId = correlationId;
35
+ // Send the first set of metrics at 5 seconds in the case of a user leaving the call shortly after joining.
36
+ setTimeout(this.sendMetricsInQueue.bind(this), 5 * 1000);
37
+ }
38
+
39
+ /**
40
+ * Check to see if the metrics queue has any items.
41
+ *
42
+ * @returns {void}
43
+ */
44
+ public sendMetricsInQueue() {
45
+ if (this.metricsQueue.length) {
46
+ this.sendMetrics();
47
+ this.metricsQueue = [];
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Add metrics items to the metrics queue.
53
+ *
54
+ * @param {object} data - An object with a payload array of metrics items.
55
+ *
56
+ * @returns {void}
57
+ */
58
+ addMetrics(data) {
59
+ if (data.payload.length) {
60
+ if (data.name === 'stats-report') {
61
+ data.payload = data.payload.map(this.anonymizeIp);
62
+ }
63
+ this.metricsQueue.push(data);
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Clear the metrics interval.
69
+ *
70
+ * @returns {void}
71
+ */
72
+ closeMetrics() {
73
+ this.sendMetricsInQueue();
74
+ clearInterval(this.intervalId);
75
+ }
76
+
77
+ /**
78
+ * Anonymize IP addresses.
79
+ *
80
+ * @param {array} stats - An RTCStatsReport organized into an array of strings.
81
+ * @returns {string}
82
+ */
83
+ anonymizeIp(stats: string): string {
84
+ const data = JSON.parse(stats);
85
+ // on local and remote candidates, anonymize the last 4 bits.
86
+ if (data.type === 'local-candidate' || data.type === 'remote-candidate') {
87
+ data.ip = CallDiagnosticUtils.anonymizeIPAddress(data.ip) || undefined;
88
+ data.address = CallDiagnosticUtils.anonymizeIPAddress(data.address) || undefined;
89
+ data.relatedAddress =
90
+ CallDiagnosticUtils.anonymizeIPAddress(data.relatedAddress) || undefined;
91
+ }
92
+
93
+ return JSON.stringify(data);
94
+ }
95
+
96
+ /**
97
+ * Send metrics to the metrics service.
98
+ *
99
+ * @returns {void}
100
+ */
101
+ private sendMetrics() {
102
+ this.webex.request({
103
+ method: 'POST',
104
+ service: 'unifiedTelemetry',
105
+ resource: 'metric/v2',
106
+ headers: {
107
+ type: 'webrtcMedia',
108
+ appId: RTC_METRICS.APP_ID,
109
+ },
110
+ body: {
111
+ metrics: [
112
+ {
113
+ type: 'webrtc',
114
+ version: '1.0.1',
115
+ userId: this.webex.internal.device.userId,
116
+ meetingId: this.meetingId,
117
+ correlationId: this.correlationId,
118
+ data: this.metricsQueue,
119
+ },
120
+ ],
121
+ },
122
+ });
123
+ }
124
+ }