@webex/plugin-meetings 3.0.0-beta.3 → 3.0.0-beta.30

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 (493) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +137 -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 +374 -0
  8. package/dist/breakouts/index.js.map +1 -0
  9. package/dist/breakouts/request.js +78 -0
  10. package/dist/breakouts/request.js.map +1 -0
  11. package/dist/breakouts/utils.js +23 -0
  12. package/dist/breakouts/utils.js.map +1 -0
  13. package/dist/common/browser-detection.js +1 -20
  14. package/dist/common/browser-detection.js.map +1 -1
  15. package/dist/common/collection.js +5 -20
  16. package/dist/common/collection.js.map +1 -1
  17. package/dist/common/config.js +0 -7
  18. package/dist/common/config.js.map +1 -1
  19. package/dist/common/errors/captcha-error.js +10 -24
  20. package/dist/common/errors/captcha-error.js.map +1 -1
  21. package/dist/common/errors/intent-to-join.js +11 -24
  22. package/dist/common/errors/intent-to-join.js.map +1 -1
  23. package/dist/common/errors/join-meeting.js +12 -25
  24. package/dist/common/errors/join-meeting.js.map +1 -1
  25. package/dist/common/errors/media.js +10 -24
  26. package/dist/common/errors/media.js.map +1 -1
  27. package/dist/common/errors/parameter.js +5 -33
  28. package/dist/common/errors/parameter.js.map +1 -1
  29. package/dist/common/errors/password-error.js +10 -24
  30. package/dist/common/errors/password-error.js.map +1 -1
  31. package/dist/common/errors/permission.js +9 -23
  32. package/dist/common/errors/permission.js.map +1 -1
  33. package/dist/common/errors/reconnection-in-progress.js +0 -17
  34. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  35. package/dist/common/errors/reconnection.js +10 -24
  36. package/dist/common/errors/reconnection.js.map +1 -1
  37. package/dist/common/errors/stats.js +10 -24
  38. package/dist/common/errors/stats.js.map +1 -1
  39. package/dist/common/errors/webex-errors.js +6 -41
  40. package/dist/common/errors/webex-errors.js.map +1 -1
  41. package/dist/common/errors/webex-meetings-error.js +5 -25
  42. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  43. package/dist/common/events/events-scope.js +0 -22
  44. package/dist/common/events/events-scope.js.map +1 -1
  45. package/dist/common/events/events.js +0 -23
  46. package/dist/common/events/events.js.map +1 -1
  47. package/dist/common/events/trigger-proxy.js +0 -12
  48. package/dist/common/events/trigger-proxy.js.map +1 -1
  49. package/dist/common/events/util.js +0 -15
  50. package/dist/common/events/util.js.map +1 -1
  51. package/dist/common/logs/logger-config.js +0 -4
  52. package/dist/common/logs/logger-config.js.map +1 -1
  53. package/dist/common/logs/logger-proxy.js +1 -8
  54. package/dist/common/logs/logger-proxy.js.map +1 -1
  55. package/dist/common/logs/request.js +37 -60
  56. package/dist/common/logs/request.js.map +1 -1
  57. package/dist/common/queue.js +4 -14
  58. package/dist/common/queue.js.map +1 -1
  59. package/dist/config.js +6 -6
  60. package/dist/config.js.map +1 -1
  61. package/dist/constants.js +92 -49
  62. package/dist/constants.js.map +1 -1
  63. package/dist/controls-options-manager/constants.js +14 -0
  64. package/dist/controls-options-manager/constants.js.map +1 -0
  65. package/dist/controls-options-manager/enums.js +15 -0
  66. package/dist/controls-options-manager/enums.js.map +1 -0
  67. package/dist/controls-options-manager/index.js +203 -0
  68. package/dist/controls-options-manager/index.js.map +1 -0
  69. package/dist/controls-options-manager/util.js +28 -0
  70. package/dist/controls-options-manager/util.js.map +1 -0
  71. package/dist/index.js +4 -18
  72. package/dist/index.js.map +1 -1
  73. package/dist/locus-info/controlsUtils.js +12 -29
  74. package/dist/locus-info/controlsUtils.js.map +1 -1
  75. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  76. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  77. package/dist/locus-info/fullState.js +0 -15
  78. package/dist/locus-info/fullState.js.map +1 -1
  79. package/dist/locus-info/hostUtils.js +4 -12
  80. package/dist/locus-info/hostUtils.js.map +1 -1
  81. package/dist/locus-info/index.js +186 -192
  82. package/dist/locus-info/index.js.map +1 -1
  83. package/dist/locus-info/infoUtils.js +3 -37
  84. package/dist/locus-info/infoUtils.js.map +1 -1
  85. package/dist/locus-info/mediaSharesUtils.js +12 -38
  86. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  87. package/dist/locus-info/parser.js +92 -118
  88. package/dist/locus-info/parser.js.map +1 -1
  89. package/dist/locus-info/selfUtils.js +34 -91
  90. package/dist/locus-info/selfUtils.js.map +1 -1
  91. package/dist/media/index.js +64 -137
  92. package/dist/media/index.js.map +1 -1
  93. package/dist/media/properties.js +80 -114
  94. package/dist/media/properties.js.map +1 -1
  95. package/dist/media/util.js +2 -9
  96. package/dist/media/util.js.map +1 -1
  97. package/dist/mediaQualityMetrics/config.js +505 -495
  98. package/dist/mediaQualityMetrics/config.js.map +1 -1
  99. package/dist/meeting/effectsState.js +125 -190
  100. package/dist/meeting/effectsState.js.map +1 -1
  101. package/dist/meeting/in-meeting-actions.js +13 -14
  102. package/dist/meeting/in-meeting-actions.js.map +1 -1
  103. package/dist/meeting/index.js +2142 -2101
  104. package/dist/meeting/index.js.map +1 -1
  105. package/dist/meeting/muteState.js +39 -80
  106. package/dist/meeting/muteState.js.map +1 -1
  107. package/dist/meeting/request.js +224 -230
  108. package/dist/meeting/request.js.map +1 -1
  109. package/dist/meeting/request.type.js +7 -0
  110. package/dist/meeting/request.type.js.map +1 -0
  111. package/dist/meeting/state.js +21 -31
  112. package/dist/meeting/state.js.map +1 -1
  113. package/dist/meeting/util.js +43 -215
  114. package/dist/meeting/util.js.map +1 -1
  115. package/dist/meeting-info/collection.js +6 -25
  116. package/dist/meeting-info/collection.js.map +1 -1
  117. package/dist/meeting-info/index.js +14 -32
  118. package/dist/meeting-info/index.js.map +1 -1
  119. package/dist/meeting-info/meeting-info-v2.js +193 -268
  120. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  121. package/dist/meeting-info/request.js +3 -15
  122. package/dist/meeting-info/request.js.map +1 -1
  123. package/dist/meeting-info/util.js +98 -183
  124. package/dist/meeting-info/util.js.map +1 -1
  125. package/dist/meeting-info/utilv2.js +137 -228
  126. package/dist/meeting-info/utilv2.js.map +1 -1
  127. package/dist/meetings/collection.js +5 -20
  128. package/dist/meetings/collection.js.map +1 -1
  129. package/dist/meetings/index.js +490 -560
  130. package/dist/meetings/index.js.map +1 -1
  131. package/dist/meetings/request.js +24 -41
  132. package/dist/meetings/request.js.map +1 -1
  133. package/dist/meetings/util.js +116 -155
  134. package/dist/meetings/util.js.map +1 -1
  135. package/dist/member/index.js +78 -86
  136. package/dist/member/index.js.map +1 -1
  137. package/dist/member/util.js +31 -68
  138. package/dist/member/util.js.map +1 -1
  139. package/dist/members/collection.js +3 -12
  140. package/dist/members/collection.js.map +1 -1
  141. package/dist/members/index.js +94 -200
  142. package/dist/members/index.js.map +1 -1
  143. package/dist/members/request.js +16 -39
  144. package/dist/members/request.js.map +1 -1
  145. package/dist/members/util.js +9 -38
  146. package/dist/members/util.js.map +1 -1
  147. package/dist/metrics/config.js +0 -2
  148. package/dist/metrics/config.js.map +1 -1
  149. package/dist/metrics/constants.js +1 -2
  150. package/dist/metrics/constants.js.map +1 -1
  151. package/dist/metrics/index.js +55 -135
  152. package/dist/metrics/index.js.map +1 -1
  153. package/dist/multistream/mediaRequestManager.js +57 -33
  154. package/dist/multistream/mediaRequestManager.js.map +1 -1
  155. package/dist/multistream/receiveSlot.js +30 -50
  156. package/dist/multistream/receiveSlot.js.map +1 -1
  157. package/dist/multistream/receiveSlotManager.js +60 -82
  158. package/dist/multistream/receiveSlotManager.js.map +1 -1
  159. package/dist/multistream/remoteMedia.js +18 -58
  160. package/dist/multistream/remoteMedia.js.map +1 -1
  161. package/dist/multistream/remoteMediaGroup.js +6 -40
  162. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  163. package/dist/multistream/remoteMediaManager.js +360 -413
  164. package/dist/multistream/remoteMediaManager.js.map +1 -1
  165. package/dist/networkQualityMonitor/index.js +40 -59
  166. package/dist/networkQualityMonitor/index.js.map +1 -1
  167. package/dist/personal-meeting-room/index.js +21 -45
  168. package/dist/personal-meeting-room/index.js.map +1 -1
  169. package/dist/personal-meeting-room/request.js +1 -31
  170. package/dist/personal-meeting-room/request.js.map +1 -1
  171. package/dist/personal-meeting-room/util.js +0 -13
  172. package/dist/personal-meeting-room/util.js.map +1 -1
  173. package/dist/reachability/index.js +138 -182
  174. package/dist/reachability/index.js.map +1 -1
  175. package/dist/reachability/request.js +3 -18
  176. package/dist/reachability/request.js.map +1 -1
  177. package/dist/reactions/constants.js +13 -0
  178. package/dist/reactions/constants.js.map +1 -0
  179. package/dist/reactions/reactions.js +109 -0
  180. package/dist/reactions/reactions.js.map +1 -0
  181. package/dist/reactions/reactions.type.js +36 -0
  182. package/dist/reactions/reactions.type.js.map +1 -0
  183. package/dist/reconnection-manager/index.js +322 -455
  184. package/dist/reconnection-manager/index.js.map +1 -1
  185. package/dist/recording-controller/enums.js +17 -0
  186. package/dist/recording-controller/enums.js.map +1 -0
  187. package/dist/recording-controller/index.js +343 -0
  188. package/dist/recording-controller/index.js.map +1 -0
  189. package/dist/recording-controller/util.js +63 -0
  190. package/dist/recording-controller/util.js.map +1 -0
  191. package/dist/roap/index.js +39 -64
  192. package/dist/roap/index.js.map +1 -1
  193. package/dist/roap/request.js +94 -113
  194. package/dist/roap/request.js.map +1 -1
  195. package/dist/roap/turnDiscovery.js +85 -94
  196. package/dist/roap/turnDiscovery.js.map +1 -1
  197. package/dist/statsAnalyzer/global.js +1 -95
  198. package/dist/statsAnalyzer/global.js.map +1 -1
  199. package/dist/statsAnalyzer/index.js +357 -449
  200. package/dist/statsAnalyzer/index.js.map +1 -1
  201. package/dist/statsAnalyzer/mqaUtil.js +137 -81
  202. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  203. package/dist/transcription/index.js +22 -47
  204. package/dist/transcription/index.js.map +1 -1
  205. package/dist/types/breakouts/breakout.d.ts +8 -0
  206. package/dist/types/breakouts/collection.d.ts +5 -0
  207. package/dist/types/breakouts/index.d.ts +5 -0
  208. package/dist/types/breakouts/request.d.ts +22 -0
  209. package/dist/types/breakouts/utils.d.ts +1 -0
  210. package/dist/types/common/browser-detection.d.ts +9 -0
  211. package/dist/types/common/collection.d.ts +48 -0
  212. package/dist/types/common/config.d.ts +2 -0
  213. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  214. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  215. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  216. package/dist/types/common/errors/media.d.ts +15 -0
  217. package/dist/types/common/errors/parameter.d.ts +15 -0
  218. package/dist/types/common/errors/password-error.d.ts +15 -0
  219. package/dist/types/common/errors/permission.d.ts +14 -0
  220. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  221. package/dist/types/common/errors/reconnection.d.ts +15 -0
  222. package/dist/types/common/errors/stats.d.ts +15 -0
  223. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  224. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  225. package/dist/types/common/events/events-scope.d.ts +17 -0
  226. package/dist/types/common/events/events.d.ts +12 -0
  227. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  228. package/dist/types/common/events/util.d.ts +2 -0
  229. package/dist/types/common/logs/logger-config.d.ts +2 -0
  230. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  231. package/dist/types/common/logs/request.d.ts +34 -0
  232. package/dist/types/common/queue.d.ts +32 -0
  233. package/dist/types/config.d.ts +77 -0
  234. package/dist/types/constants.d.ts +899 -0
  235. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  236. package/dist/types/controls-options-manager/enums.d.ts +5 -0
  237. package/dist/types/controls-options-manager/index.d.ts +120 -0
  238. package/dist/types/controls-options-manager/util.d.ts +7 -0
  239. package/dist/types/index.d.ts +5 -0
  240. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  241. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  242. package/dist/types/locus-info/fullState.d.ts +2 -0
  243. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  244. package/dist/types/locus-info/index.d.ts +269 -0
  245. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  246. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  247. package/dist/types/locus-info/parser.d.ts +212 -0
  248. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  249. package/dist/types/media/index.d.ts +32 -0
  250. package/dist/types/media/properties.d.ts +107 -0
  251. package/dist/types/media/util.d.ts +2 -0
  252. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  253. package/dist/types/meeting/effectsState.d.ts +42 -0
  254. package/dist/types/meeting/in-meeting-actions.d.ts +83 -0
  255. package/dist/types/meeting/index.d.ts +1724 -0
  256. package/dist/types/meeting/muteState.d.ts +108 -0
  257. package/dist/types/meeting/request.d.ts +261 -0
  258. package/dist/types/meeting/request.type.d.ts +11 -0
  259. package/dist/types/meeting/state.d.ts +9 -0
  260. package/dist/types/meeting/util.d.ts +2 -0
  261. package/dist/types/meeting-info/collection.d.ts +20 -0
  262. package/dist/types/meeting-info/index.d.ts +57 -0
  263. package/dist/types/meeting-info/meeting-info-v2.d.ts +93 -0
  264. package/dist/types/meeting-info/request.d.ts +22 -0
  265. package/dist/types/meeting-info/util.d.ts +2 -0
  266. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  267. package/dist/types/meetings/collection.d.ts +23 -0
  268. package/dist/types/meetings/index.d.ts +297 -0
  269. package/dist/types/meetings/request.d.ts +27 -0
  270. package/dist/types/meetings/util.d.ts +18 -0
  271. package/dist/types/member/index.d.ts +146 -0
  272. package/dist/types/member/util.d.ts +2 -0
  273. package/dist/types/members/collection.d.ts +24 -0
  274. package/dist/types/members/index.d.ts +320 -0
  275. package/dist/types/members/request.d.ts +50 -0
  276. package/dist/types/members/util.d.ts +2 -0
  277. package/dist/types/metrics/config.d.ts +178 -0
  278. package/dist/types/metrics/constants.d.ts +57 -0
  279. package/dist/types/metrics/index.d.ts +160 -0
  280. package/dist/types/multistream/mediaRequestManager.d.ts +50 -0
  281. package/dist/types/multistream/receiveSlot.d.ts +66 -0
  282. package/dist/types/multistream/receiveSlotManager.d.ts +46 -0
  283. package/dist/types/multistream/remoteMedia.d.ts +93 -0
  284. package/dist/types/multistream/remoteMediaGroup.d.ts +56 -0
  285. package/dist/types/multistream/remoteMediaManager.d.ts +241 -0
  286. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  287. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  288. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  289. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  290. package/dist/types/reachability/index.d.ts +140 -0
  291. package/dist/types/reachability/request.d.ts +35 -0
  292. package/dist/types/reactions/constants.d.ts +3 -0
  293. package/dist/types/reactions/reactions.d.ts +4 -0
  294. package/dist/types/reactions/reactions.type.d.ts +52 -0
  295. package/dist/types/reconnection-manager/index.d.ts +117 -0
  296. package/dist/types/recording-controller/enums.d.ts +7 -0
  297. package/dist/types/recording-controller/index.d.ts +193 -0
  298. package/dist/types/recording-controller/util.d.ts +13 -0
  299. package/dist/types/roap/index.d.ts +77 -0
  300. package/dist/types/roap/request.d.ts +35 -0
  301. package/dist/types/roap/turnDiscovery.d.ts +74 -0
  302. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  303. package/dist/types/statsAnalyzer/index.d.ts +195 -0
  304. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  305. package/dist/types/transcription/index.d.ts +64 -0
  306. package/internal-README.md +7 -6
  307. package/package.json +25 -20
  308. package/src/breakouts/README.md +190 -0
  309. package/src/breakouts/breakout.ts +130 -0
  310. package/src/breakouts/collection.ts +19 -0
  311. package/src/breakouts/index.ts +353 -0
  312. package/src/breakouts/request.ts +55 -0
  313. package/src/breakouts/utils.ts +15 -0
  314. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  315. package/src/common/collection.ts +9 -7
  316. package/src/common/{config.js → config.ts} +1 -1
  317. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  318. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  319. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  320. package/src/common/errors/{media.js → media.ts} +11 -7
  321. package/src/common/errors/parameter.ts +11 -7
  322. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  323. package/src/common/errors/{permission.js → permission.ts} +10 -6
  324. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  325. package/src/common/errors/{stats.js → stats.ts} +11 -7
  326. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  327. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  328. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  329. package/src/common/events/{events.js → events.ts} +5 -1
  330. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  331. package/src/common/events/{util.js → util.ts} +2 -3
  332. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  333. package/src/common/logs/logger-proxy.ts +44 -0
  334. package/src/common/logs/{request.js → request.ts} +22 -9
  335. package/src/common/queue.ts +1 -2
  336. package/src/{config.js → config.ts} +17 -12
  337. package/src/constants.ts +44 -4
  338. package/src/controls-options-manager/constants.ts +5 -0
  339. package/src/controls-options-manager/enums.ts +6 -0
  340. package/src/controls-options-manager/index.ts +183 -0
  341. package/src/controls-options-manager/util.ts +20 -0
  342. package/src/index.js +2 -1
  343. package/src/locus-info/controlsUtils.ts +114 -0
  344. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  345. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  346. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  347. package/src/locus-info/{index.js → index.ts} +150 -66
  348. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  349. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  350. package/src/locus-info/{parser.js → parser.ts} +67 -79
  351. package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
  352. package/src/media/{index.js → index.ts} +176 -157
  353. package/src/media/{properties.js → properties.ts} +48 -31
  354. package/src/media/{util.js → util.ts} +2 -2
  355. package/src/mediaQualityMetrics/config.ts +384 -0
  356. package/src/meeting/{effectsState.js → effectsState.ts} +47 -41
  357. package/src/meeting/in-meeting-actions.ts +31 -3
  358. package/src/meeting/{index.js → index.ts} +2479 -1466
  359. package/src/meeting/{muteState.js → muteState.ts} +80 -45
  360. package/src/meeting/{request.js → request.ts} +292 -142
  361. package/src/meeting/request.type.ts +13 -0
  362. package/src/meeting/{state.js → state.ts} +50 -35
  363. package/src/meeting/{util.js → util.ts} +112 -115
  364. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  365. package/src/meeting-info/{index.js → index.ts} +42 -36
  366. package/src/meeting-info/meeting-info-v2.ts +273 -0
  367. package/src/meeting-info/{request.js → request.ts} +14 -4
  368. package/src/meeting-info/{util.js → util.ts} +60 -51
  369. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  370. package/src/meetings/{collection.js → collection.ts} +6 -3
  371. package/src/meetings/index.ts +1159 -0
  372. package/src/meetings/{request.js → request.ts} +32 -25
  373. package/src/meetings/{util.js → util.ts} +58 -32
  374. package/src/member/{index.js → index.ts} +102 -56
  375. package/src/member/{util.js → util.ts} +52 -25
  376. package/src/members/{collection.js → collection.ts} +2 -2
  377. package/src/members/{index.js → index.ts} +221 -142
  378. package/src/members/{request.js → request.ts} +60 -16
  379. package/src/members/{util.js → util.ts} +50 -48
  380. package/src/metrics/{config.js → config.ts} +254 -83
  381. package/src/metrics/{constants.js → constants.ts} +0 -2
  382. package/src/metrics/{index.js → index.ts} +106 -74
  383. package/src/multistream/mediaRequestManager.ts +79 -15
  384. package/src/multistream/receiveSlot.ts +42 -13
  385. package/src/multistream/receiveSlotManager.ts +35 -21
  386. package/src/multistream/remoteMedia.ts +15 -5
  387. package/src/multistream/remoteMediaGroup.ts +4 -3
  388. package/src/multistream/remoteMediaManager.ts +152 -36
  389. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  390. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  391. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  392. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  393. package/src/reachability/{index.js → index.ts} +99 -83
  394. package/src/reachability/request.ts +39 -33
  395. package/src/reactions/constants.ts +4 -0
  396. package/src/reactions/reactions.ts +104 -0
  397. package/src/reactions/reactions.type.ts +62 -0
  398. package/src/reconnection-manager/{index.js → index.ts} +195 -102
  399. package/src/recording-controller/enums.ts +8 -0
  400. package/src/recording-controller/index.ts +315 -0
  401. package/src/recording-controller/util.ts +58 -0
  402. package/src/roap/{index.js → index.ts} +73 -56
  403. package/src/roap/request.ts +157 -0
  404. package/src/roap/turnDiscovery.ts +77 -37
  405. package/src/statsAnalyzer/global.ts +37 -0
  406. package/src/statsAnalyzer/index.ts +1234 -0
  407. package/src/statsAnalyzer/mqaUtil.ts +293 -0
  408. package/src/transcription/{index.js → index.ts} +46 -39
  409. package/test/integration/spec/converged-space-meetings.js +176 -0
  410. package/test/integration/spec/journey.js +664 -463
  411. package/test/integration/spec/space-meeting.js +320 -206
  412. package/test/integration/spec/transcription.js +7 -8
  413. package/test/unit/spec/breakouts/breakout.ts +147 -0
  414. package/test/unit/spec/breakouts/collection.ts +15 -0
  415. package/test/unit/spec/breakouts/index.ts +464 -0
  416. package/test/unit/spec/breakouts/request.ts +104 -0
  417. package/test/unit/spec/breakouts/utils.js +21 -0
  418. package/test/unit/spec/common/browser-detection.js +9 -28
  419. package/test/unit/spec/controls-options-manager/index.js +124 -0
  420. package/test/unit/spec/controls-options-manager/util.js +66 -0
  421. package/test/unit/spec/fixture/locus.js +92 -90
  422. package/test/unit/spec/locus-info/controlsUtils.js +25 -5
  423. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  424. package/test/unit/spec/locus-info/index.js +104 -2
  425. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  426. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  427. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  428. package/test/unit/spec/locus-info/parser.js +3 -9
  429. package/test/unit/spec/locus-info/selfConstant.js +97 -103
  430. package/test/unit/spec/locus-info/selfUtils.js +105 -12
  431. package/test/unit/spec/media/index.ts +31 -47
  432. package/test/unit/spec/media/properties.ts +9 -9
  433. package/test/unit/spec/meeting/effectsState.js +39 -45
  434. package/test/unit/spec/meeting/in-meeting-actions.ts +13 -2
  435. package/test/unit/spec/meeting/index.js +2214 -746
  436. package/test/unit/spec/meeting/muteState.js +43 -34
  437. package/test/unit/spec/meeting/request.js +115 -44
  438. package/test/unit/spec/meeting/utils.js +104 -171
  439. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  440. package/test/unit/spec/meeting-info/request.js +7 -9
  441. package/test/unit/spec/meeting-info/util.js +11 -12
  442. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  443. package/test/unit/spec/meetings/collection.js +1 -1
  444. package/test/unit/spec/meetings/index.js +439 -257
  445. package/test/unit/spec/meetings/utils.js +14 -12
  446. package/test/unit/spec/member/index.js +0 -1
  447. package/test/unit/spec/member/util.js +31 -7
  448. package/test/unit/spec/members/index.js +104 -54
  449. package/test/unit/spec/members/request.js +29 -20
  450. package/test/unit/spec/members/utils.js +8 -5
  451. package/test/unit/spec/metrics/index.js +16 -21
  452. package/test/unit/spec/multistream/mediaRequestManager.ts +312 -50
  453. package/test/unit/spec/multistream/receiveSlot.ts +57 -6
  454. package/test/unit/spec/multistream/receiveSlotManager.ts +41 -13
  455. package/test/unit/spec/multistream/remoteMedia.ts +10 -2
  456. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  457. package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
  458. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  459. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  460. package/test/unit/spec/reachability/index.ts +58 -26
  461. package/test/unit/spec/reconnection-manager/index.js +102 -9
  462. package/test/unit/spec/recording-controller/index.js +231 -0
  463. package/test/unit/spec/recording-controller/util.js +102 -0
  464. package/test/unit/spec/roap/index.ts +2 -1
  465. package/test/unit/spec/roap/request.ts +114 -0
  466. package/test/unit/spec/roap/turnDiscovery.ts +64 -45
  467. package/test/unit/spec/stats-analyzer/index.js +86 -57
  468. package/test/utils/cmr.js +44 -42
  469. package/test/utils/constants.js +9 -0
  470. package/test/utils/testUtils.js +96 -80
  471. package/test/utils/webex-config.js +22 -18
  472. package/test/utils/webex-test-users.js +57 -50
  473. package/tsconfig.json +6 -0
  474. package/dist/media/internal-media-core-wrapper.js +0 -22
  475. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  476. package/dist/multistream/multistreamMedia.js +0 -116
  477. package/dist/multistream/multistreamMedia.js.map +0 -1
  478. package/dist/peer-connection-manager/util.js +0 -124
  479. package/dist/peer-connection-manager/util.js.map +0 -1
  480. package/src/common/logs/logger-proxy.js +0 -33
  481. package/src/locus-info/controlsUtils.js +0 -102
  482. package/src/media/internal-media-core-wrapper.ts +0 -9
  483. package/src/mediaQualityMetrics/config.js +0 -382
  484. package/src/meeting-info/meeting-info-v2.js +0 -255
  485. package/src/meetings/index.js +0 -1015
  486. package/src/multistream/multistreamMedia.ts +0 -92
  487. package/src/peer-connection-manager/util.ts +0 -117
  488. package/src/roap/request.js +0 -127
  489. package/src/statsAnalyzer/global.js +0 -133
  490. package/src/statsAnalyzer/index.js +0 -1006
  491. package/src/statsAnalyzer/mqaUtil.js +0 -173
  492. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  493. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"names":["OSMap","OS_NAME","chrome","macOS","MAC","Windows","WINDOWS","iOS","IOS","Android","ANDROID","Linux","LINUX","BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","localIp","anonymize","triggerTimers","event","meeting","data","eventType","CALL_INITIATED","setStartCallInitiateJoinReq","LOCUS_JOIN_REQUEST","setEndCallInitiateJoinReq","setStartJoinReqResp","LOCUS_JOIN_RESPONSE","setEndJoinReqResp","setStartSetupDelay","mediaType","AUDIO","VIDEO","setStartSendingMediaDelay","RECEIVING_MEDIA_START","setEndSetupDelay","SENDING_MEDIA_START","setEndSendingMediaDelay","LOCAL_SDP_GENERATED","setStartLocalSDPGenRemoteSDPRecvDelay","REMOTE_SDP_RECEIVED","setEndLocalSDPGenRemoteSDPRecvDelay","Metrics","instance","_events","meetingCollection","keys","webex","options","meetingId","indexOf","LoggerProxy","logger","error","get","callEvents","MEDIA_QUALITY","sendMediaQualityAnalyzerMetrics","push","sendCallAnalyzerMetrics","info","identifiers","payload","eventId","uuid","v4","version","origin","name","networkType","userAgent","userAgentToString","clientInfo","clientType","clientVersion","CLIENT_NAME","localNetworkPrefix","meetings","geoHintInfo","clientAddress","osVersion","subClientType","os","getOsName","browser","browserVersion","originTime","triggered","Date","toISOString","senderCountryCode","countryCode","canProceed","eventData","webClientDomain","window","location","hostname","Object","prototype","hasOwnProperty","call","errors","trigger","pstnAudioType","mediaCapabilities","recoveredBy","joinTimes","isRoapCallEnabled","OTHERS","audioSetupDelay","videoSetupDelay","UNKNOWN","intervals","intervalData","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","err","showToUser","errorCode","statusCode","body","ERROR_CODE","MEETING_ERRORS","FREE_USER_MAX_PARTICIPANTS_EXCEEDED","PAID_USER_MAX_PARTICIPANTS_EXCEEDED","SERVICE_MAX_PARTICIPANTS_EXCEEDED","INACTIVE","EXCEEDED_MAX_JOINED_PARTICIPANTS","EXCEEDED_SERVICE_MAX_PARTICIPANTS","MEETING_IS_LOCKED","MEETING_IS_TERMINATING","MEETING_REQUIRE_MODERATOR_PIN_INTENT","MEETING_REQUIRE_MODERATOR_PIN","MEETING_REQUIRE_MODERATOR_ROLE","JOIN_RESTRICTED_USER","GET_RESTRICTED_USER","CREATE_MEDIA_RESTRICTED_USER","JOIN_RESTRICTED_USER_NOT_IN_ROOM","MEETING_NOT_FOUND","NOT_WEBEX_SITE","INVALID_JOIN_TIME","PHONE_NUMBER_NOT_A_NUMBER","PHONE_NUMBER_TOO_LONG","INVALID_DIALABLE_KEY","ONE_ON_ONE_TO_SELF_NOT_ALLOWED","REMOVED_PARTICIPANT","MEETING_LINK_NOT_FOUND","PHONE_NUMBER_TOO_SHORT_AFTER_IDD","INVALID_INVITEE_ADDRESS","PMR_ACCOUNT_LOCKED","RESOURCE_GUEST_FORBIDDEN","PMR_ACCOUNT_SUSPENDED","EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE","INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST","CONVERSATION_NOT_FOUND","RECORDING_CONTROL_NOT_SUPPORTED","RECORDING_NOT_STARTED","RECORDING_NOT_ENABLED","generateErrorPayload","LOCUS_RESPONSE","shownToUser","errorPayload","category","errorDescription","fatal","notFatalErrorList","OTHER","errorData","httpCode","userAgentOption","browserInfo","util","format","metrics","clientName","toLowerCase","split","osInfo","process","env","NODE_ENV","metricName","metricFields","metricTags","internal","submitClientMetrics","type","config","fields","tags"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport util from 'util';\n\nimport {includes} from 'lodash';\nimport uuid from 'uuid';\nimport window from 'global/window';\nimport anonymize from 'ip-anonymize';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEETING_ERRORS} from '../constants';\nimport BrowserDetection from '../common/browser-detection';\n\nimport {\n error, eventType, errorCodes as ERROR_CODE, OS_NAME, UNKNOWN, CLIENT_NAME,\n mediaType\n} from './config';\n\nconst OSMap = {\n 'Chrome OS': OS_NAME.chrome,\n macOS: OS_NAME.MAC,\n Windows: OS_NAME.WINDOWS,\n iOS: OS_NAME.IOS,\n Android: OS_NAME.ANDROID,\n Linux: OS_NAME.LINUX\n};\n\nconst {\n getOSName,\n getOSVersion,\n getBrowserName,\n getBrowserVersion\n} = BrowserDetection();\n\n// Apply a CIDR /28 format to the IPV4 and /96 to the IPV6 addresses\n// For reference : https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing\nconst anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);\n\nconst triggerTimers = ({event, meeting, data}) => {\n switch (event) {\n case eventType.CALL_INITIATED:\n meeting.setStartCallInitiateJoinReq();\n break;\n case eventType.LOCUS_JOIN_REQUEST:\n meeting.setEndCallInitiateJoinReq();\n meeting.setStartJoinReqResp();\n break;\n case eventType.LOCUS_JOIN_RESPONSE:\n meeting.setEndJoinReqResp();\n meeting.setStartSetupDelay(mediaType.AUDIO);\n meeting.setStartSetupDelay(mediaType.VIDEO);\n meeting.setStartSendingMediaDelay(mediaType.AUDIO);\n meeting.setStartSendingMediaDelay(mediaType.VIDEO);\n break;\n case eventType.RECEIVING_MEDIA_START:\n meeting.setEndSetupDelay(data.mediaType);\n break;\n case eventType.SENDING_MEDIA_START:\n meeting.setEndSendingMediaDelay(data.mediaType);\n break;\n case eventType.LOCAL_SDP_GENERATED:\n meeting.setStartLocalSDPGenRemoteSDPRecvDelay();\n break;\n case eventType.REMOTE_SDP_RECEIVED:\n meeting.setEndLocalSDPGenRemoteSDPRecvDelay();\n break;\n default:\n break;\n }\n};\n\n/**\n * @description Metrics handles all the call metrics events\n * @export\n * @class Metrics\n */\nclass Metrics {\n /**\n * Create Metrics Object\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor() {\n if (!Metrics.instance) {\n /**\n * @instance\n * @type {Array}\n * @private\n * @memberof Metrics\n */\n this._events = [];\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.meetingCollection = null;\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.keys = Object.values(eventType);\n /**\n * @instance\n * @type {Metrics}\n * @private\n * @memberof Metrics\n */\n Metrics.instance = this;\n }\n\n return Metrics.instance;\n }\n\n /**\n * Initializes the Metrics singleton with a meeting Collection.\n *\n * @param {Object} meetingCollection meetings object\n * @param {Object} webex webex SDK object\n *\n * @returns {void}\n */\n initialSetup(meetingCollection, webex) {\n this.meetingCollection = meetingCollection;\n this.webex = webex;\n }\n\n /**\n * poste Meeting event metrics\n * @param {object} options {meetingId/meeting} as a json object\n * @param {Meeting} options.meeting Meeting object\n * @param {String} options.meetingId\n * @param {object} options.data\n * @param {object} options.event\n * @returns {object} null\n */\n postEvent(options) {\n const {meetingId, data = {}, event} = options;\n let {meeting} = options;\n\n if (this.keys.indexOf(event) === -1) {\n LoggerProxy.logger.error(`Metrics:index#postEvent --> Event ${event} doesn't exist in dictionary`);\n }\n\n if (!meeting && meetingId) {\n meeting = this.meetingCollection.get(meetingId);\n options.meeting = meeting;\n }\n\n if (meeting) {\n triggerTimers(options);\n\n if (!meeting.callEvents) {\n meeting.callEvents = [];\n }\n if (event === eventType.MEDIA_QUALITY) {\n data.event = event;\n meeting.sendMediaQualityAnalyzerMetrics(data);\n }\n else {\n meeting.callEvents.push(event);\n data.event = event;\n meeting.sendCallAnalyzerMetrics(data);\n }\n }\n\n else {\n LoggerProxy.logger.info(`Metrics:index#postEvent --> Event received for meetingId:${meetingId}, but meeting not found in collection.`);\n }\n }\n\n /**\n * Docs for Call analyzer metrics\n * https://sqbu-github.cisco.com/WebExSquared/call-analyzer/wiki\n * https://sqbu-github.cisco.com/WebExSquared/event-dictionary/blob/master/diagnostic-events.raml\n */\n\n initPayload(eventType, identifiers, options) {\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n name: 'endpoint',\n networkType: 'unknown',\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType,\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n osVersion: getOSVersion() || 'unknown',\n subClientType: options.subClientType,\n os: this.getOsName(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion()\n }\n },\n originTime: {\n triggered: new Date().toISOString()\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n eventData: {webClientDomain: window.location.hostname}\n }\n };\n\n // TODO: more options should be checked and some of them should be mandatory in certain conditions\n if (options) {\n if (Object.prototype.hasOwnProperty.call(options, 'canProceed')) {\n payload.event.canProceed = options.canProceed;\n }\n if (options.errors) {\n payload.event.errors = options.errors;\n }\n if (options.mediaType) {\n payload.event.mediaType = options.mediaType;\n }\n if (options.trigger) {\n payload.event.trigger = options.trigger;\n }\n if (options.pstnAudioType) {\n payload.event.pstnAudioType = options.pstnAudioType;\n }\n if (options.mediaCapabilities) {\n payload.event.mediaCapabilities = options.mediaCapabilities;\n }\n if (options.recoveredBy) {\n payload.event.recoveredBy = options.recoveredBy;\n }\n if (options.joinTimes) {\n payload.event.joinTimes = options.joinTimes;\n }\n if (options.isRoapCallEnabled) {\n payload.event.isRoapCallEnabled = options.isRoapCallEnabled;\n }\n }\n\n return payload;\n }\n\n /**\n * returns metrics friendly OS versions\n * @param {String} osName Os name\n * @returns {String}\n * @private\n * @memberof Metrics\n */\n getOsName() {\n return OSMap[getOSName()] ?? OS_NAME.OTHERS;\n }\n\n /**\n * get the payload specific for a media quality event through call analyzer\n * @param {String} eventType the event name\n * @param {Object} identifiers contains the identifiers needed for CA\n * @param {String} identifiers.correlationId\n * @param {String} identifiers.locusUrl\n * @param {String} identifiers.locusId\n * @param {Object} options\n * @param {Object} options.intervalData\n * @param {String} options.clientType\n * @returns {Object}\n * @public\n * @memberof Metrics\n */\n initMediaPayload(eventType, identifiers, options = {}) {\n const {audioSetupDelay, videoSetupDelay, joinTimes} = options;\n\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n audioSetupDelay,\n videoSetupDelay,\n name: 'endpoint',\n networkType: options.networkType || UNKNOWN,\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n os: this.getOsName(),\n osVersion: getOSVersion() || UNKNOWN,\n subClientType: options.subClientType,\n browser: getBrowserName(),\n browserVersion: getBrowserVersion()\n }\n },\n originTime: {\n triggered: new Date().toISOString()\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n intervals: [options.intervalData],\n joinTimes,\n eventData: {\n webClientDomain: window.location.hostname\n },\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || UNKNOWN,\n startTime: new Date().toISOString()\n }\n }\n };\n\n return payload;\n }\n\n /**\n * This function Parses a Locus error and returns a diagnostic event payload.\n * It should keep updating from:\n * https://sqbu-github.cisco.com/WebExSquared/spark-client-framework/blob/master/spark-client-framework/Adapters/TelephonyAdapter/TelephonyAdapter.cpp#L920\n *\n * @param {Object} err the error Object from Locus response\n * @param {boolean} showToUser true if a toast is shown to user\n * @returns {{showToUser: boolean, category: string, errorDescription: string,\n * errorCode: number, errorData: *, fatal: boolean, name: string}}\n */\n parseLocusError(err, showToUser) {\n let errorCode;\n\n if (err && err.statusCode && err.statusCode >= 500) {\n errorCode = 1003;\n }\n else if (err && err.body && err.body.errorCode) {\n // locus error codes: https://sqbu-github.cisco.com/WebExSquared/locus/blob/master/server/src/main/resources/locus-error-codes.properties\n switch (ERROR_CODE[err.body.errorCode]) {\n case MEETING_ERRORS.FREE_USER_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3007;\n break;\n case MEETING_ERRORS.PAID_USER_MAX_PARTICIPANTS_EXCEEDED:\n case MEETING_ERRORS.SERVICE_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3002;\n break;\n case MEETING_ERRORS.INACTIVE:\n errorCode = 4001;\n break;\n case MEETING_ERRORS.EXCEEDED_MAX_JOINED_PARTICIPANTS:\n case MEETING_ERRORS.EXCEEDED_SERVICE_MAX_PARTICIPANTS:\n errorCode = 3001;\n break;\n case MEETING_ERRORS.MEETING_IS_LOCKED:\n errorCode = 4002;\n break;\n case MEETING_ERRORS.MEETING_IS_TERMINATING:\n errorCode = 4003;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN_INTENT:\n errorCode = 4004;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN:\n errorCode = 4005;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_ROLE:\n errorCode = 4006;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER:\n case MEETING_ERRORS.GET_RESTRICTED_USER:\n case MEETING_ERRORS.CREATE_MEDIA_RESTRICTED_USER:\n errorCode = 3005;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER_NOT_IN_ROOM:\n errorCode = 4007;\n break;\n case MEETING_ERRORS.MEETING_NOT_FOUND:\n errorCode = 4011;\n break;\n case MEETING_ERRORS.NOT_WEBEX_SITE:\n errorCode = 4012;\n break;\n case MEETING_ERRORS.INVALID_JOIN_TIME:\n errorCode = 4013;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_NOT_A_NUMBER:\n errorCode = 4016;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_LONG:\n errorCode = 4017;\n break;\n case MEETING_ERRORS.INVALID_DIALABLE_KEY:\n errorCode = 4018;\n break;\n case MEETING_ERRORS.ONE_ON_ONE_TO_SELF_NOT_ALLOWED:\n errorCode = 4019;\n break;\n case MEETING_ERRORS.REMOVED_PARTICIPANT:\n errorCode = 4020;\n break;\n case MEETING_ERRORS.MEETING_LINK_NOT_FOUND:\n errorCode = 4021;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_SHORT_AFTER_IDD:\n errorCode = 4022;\n break;\n case MEETING_ERRORS.INVALID_INVITEE_ADDRESS:\n errorCode = 4023;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_LOCKED:\n errorCode = 4024;\n break;\n case MEETING_ERRORS.RESOURCE_GUEST_FORBIDDEN:\n errorCode = 4025;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_SUSPENDED:\n errorCode = 4026;\n break;\n case MEETING_ERRORS.EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE:\n errorCode = 4027;\n break;\n case MEETING_ERRORS.INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST:\n errorCode = 1006;\n break;\n case MEETING_ERRORS.CONVERSATION_NOT_FOUND:\n errorCode = 4028;\n break;\n case MEETING_ERRORS.RECORDING_CONTROL_NOT_SUPPORTED:\n case MEETING_ERRORS.RECORDING_NOT_STARTED:\n case MEETING_ERRORS.RECORDING_NOT_ENABLED:\n errorCode = 4029;\n break;\n default:\n errorCode = 4008;\n }\n }\n else {\n errorCode = 4008;\n }\n\n return this.generateErrorPayload(\n errorCode, showToUser, error.name.LOCUS_RESPONSE, err\n );\n }\n\n\n generateErrorPayload(errorCode, shownToUser, name, err) {\n if (error.errors[errorCode]) {\n const errorPayload = {\n shownToUser: shownToUser || false,\n category: error.errors[errorCode][2],\n errorDescription: error.errors[errorCode][0],\n errorCode,\n fatal: !includes(error.notFatalErrorList, errorCode),\n name: name || error.name.OTHER\n };\n\n if (err && err.body) {\n errorPayload.errorData = err.body;\n }\n\n if (err && err.statusCode) {\n errorPayload.httpCode = err.statusCode;\n }\n\n return errorPayload;\n }\n\n return null;\n }\n\n /**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\n userAgentToString() {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${this.webex.meetings?.metrics?.clientName}`);\n\n if (['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1) {\n browserInfo = util.format('browser=%s', `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`);\n }\n const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);\n\n if (browserInfo) {\n userAgentOption = `(${browserInfo}`;\n }\n if (osInfo) {\n userAgentOption = userAgentOption ? `${userAgentOption}; ${clientInfo}; ${osInfo}` : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format('webex-js-sdk/%s %s', `${process.env.NODE_ENV}-${this.webex.version}`, userAgentOption);\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${this.webex.version}`);\n }\n\n /**\n * Uploads given metric to the Metrics service as an Behavioral metric.\n * Metadata about the environment such as browser, OS, SDK and their versions\n * are automatically added when the metric is sent.\n *\n * The Metrics service will send an Behavioral metric to InfluxDB for\n * aggregation.\n * See https://confluence-eng-gpk2.cisco.com/conf/display/WBXT/Getting+started+with+Metrics+Service.\n *\n * @param {string} metricName Name of the metric (measurement) to send\n * @param {Object} metricFields Key-valye pairs of data or values about this metric\n * @param {Object} metricTags Key-value pairs of metric metadata\n *\n * @returns {void}\n */\n sendBehavioralMetric(metricName, metricFields = {}, metricTags = {}) {\n this.webex.internal.metrics.submitClientMetrics(metricName, {\n type: this.webex.config.metrics.type,\n fields: metricFields,\n tags: metricTags\n });\n }\n}\n\n// Export Metrics singleton ---------------------------------------------------\nconst instance = new Metrics();\n\nexport default instance;\n"],"mappings":"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"}
1
+ {"version":3,"names":["OSMap","OS_NAME","chrome","macOS","MAC","Windows","WINDOWS","iOS","IOS","Android","ANDROID","Linux","LINUX","BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","localIp","anonymize","triggerTimers","event","meeting","data","eventType","CALL_INITIATED","setStartCallInitiateJoinReq","LOCUS_JOIN_REQUEST","setEndCallInitiateJoinReq","setStartJoinReqResp","LOCUS_JOIN_RESPONSE","setEndJoinReqResp","setStartSetupDelay","mediaType","AUDIO","VIDEO","setStartSendingMediaDelay","RECEIVING_MEDIA_START","setEndSetupDelay","SENDING_MEDIA_START","setEndSendingMediaDelay","LOCAL_SDP_GENERATED","setStartLocalSDPGenRemoteSDPRecvDelay","REMOTE_SDP_RECEIVED","setEndLocalSDPGenRemoteSDPRecvDelay","Metrics","instance","_events","meetingCollection","keys","webex","options","meetingId","indexOf","LoggerProxy","logger","error","get","callEvents","MEDIA_QUALITY","sendMediaQualityAnalyzerMetrics","push","sendCallAnalyzerMetrics","info","identifiers","payload","eventId","uuid","v4","version","origin","name","networkType","userAgent","userAgentToString","clientInfo","clientType","clientVersion","CLIENT_NAME","localNetworkPrefix","meetings","geoHintInfo","clientAddress","osVersion","subClientType","os","getOsName","browser","browserVersion","originTime","triggered","Date","toISOString","senderCountryCode","countryCode","canProceed","eventData","webClientDomain","window","location","hostname","Object","prototype","hasOwnProperty","call","errors","trigger","pstnAudioType","mediaCapabilities","recoveredBy","joinTimes","isRoapCallEnabled","OTHERS","audioSetupDelay","videoSetupDelay","UNKNOWN","intervals","intervalData","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","err","showToUser","errorCode","statusCode","body","ERROR_CODE","MEETING_ERRORS","FREE_USER_MAX_PARTICIPANTS_EXCEEDED","PAID_USER_MAX_PARTICIPANTS_EXCEEDED","SERVICE_MAX_PARTICIPANTS_EXCEEDED","INACTIVE","EXCEEDED_MAX_JOINED_PARTICIPANTS","EXCEEDED_SERVICE_MAX_PARTICIPANTS","MEETING_IS_LOCKED","MEETING_IS_TERMINATING","MEETING_REQUIRE_MODERATOR_PIN_INTENT","MEETING_REQUIRE_MODERATOR_PIN","MEETING_REQUIRE_MODERATOR_ROLE","JOIN_RESTRICTED_USER","GET_RESTRICTED_USER","CREATE_MEDIA_RESTRICTED_USER","JOIN_RESTRICTED_USER_NOT_IN_ROOM","MEETING_NOT_FOUND","NOT_WEBEX_SITE","INVALID_JOIN_TIME","PHONE_NUMBER_NOT_A_NUMBER","PHONE_NUMBER_TOO_LONG","INVALID_DIALABLE_KEY","ONE_ON_ONE_TO_SELF_NOT_ALLOWED","REMOVED_PARTICIPANT","MEETING_LINK_NOT_FOUND","PHONE_NUMBER_TOO_SHORT_AFTER_IDD","INVALID_INVITEE_ADDRESS","PMR_ACCOUNT_LOCKED","RESOURCE_GUEST_FORBIDDEN","PMR_ACCOUNT_SUSPENDED","EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE","INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST","CONVERSATION_NOT_FOUND","RECORDING_CONTROL_NOT_SUPPORTED","RECORDING_NOT_STARTED","RECORDING_NOT_ENABLED","generateErrorPayload","LOCUS_RESPONSE","shownToUser","errorPayload","category","errorDescription","fatal","notFatalErrorList","OTHER","errorData","httpCode","userAgentOption","browserInfo","util","format","metrics","clientName","toLowerCase","split","osInfo","process","env","NODE_ENV","metricName","metricFields","metricTags","internal","submitClientMetrics","type","config","fields","tags"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport util from 'util';\n\nimport {includes} from 'lodash';\nimport uuid from 'uuid';\nimport window from 'global/window';\nimport anonymize from 'ip-anonymize';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEETING_ERRORS} from '../constants';\nimport BrowserDetection from '../common/browser-detection';\n\nimport {\n error,\n eventType,\n errorCodes as ERROR_CODE,\n OS_NAME,\n UNKNOWN,\n CLIENT_NAME,\n mediaType,\n} from './config';\n\nconst OSMap = {\n // @ts-ignore\n 'Chrome OS': OS_NAME.chrome,\n macOS: OS_NAME.MAC,\n Windows: OS_NAME.WINDOWS,\n iOS: OS_NAME.IOS,\n Android: OS_NAME.ANDROID,\n Linux: OS_NAME.LINUX,\n};\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\n// Apply a CIDR /28 format to the IPV4 and /96 to the IPV6 addresses\n// For reference : https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing\nconst anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);\n\nconst triggerTimers = ({event, meeting, data}) => {\n switch (event) {\n case eventType.CALL_INITIATED:\n meeting.setStartCallInitiateJoinReq();\n break;\n case eventType.LOCUS_JOIN_REQUEST:\n meeting.setEndCallInitiateJoinReq();\n meeting.setStartJoinReqResp();\n break;\n case eventType.LOCUS_JOIN_RESPONSE:\n meeting.setEndJoinReqResp();\n meeting.setStartSetupDelay(mediaType.AUDIO);\n meeting.setStartSetupDelay(mediaType.VIDEO);\n meeting.setStartSendingMediaDelay(mediaType.AUDIO);\n meeting.setStartSendingMediaDelay(mediaType.VIDEO);\n break;\n case eventType.RECEIVING_MEDIA_START:\n meeting.setEndSetupDelay(data.mediaType);\n break;\n case eventType.SENDING_MEDIA_START:\n meeting.setEndSendingMediaDelay(data.mediaType);\n break;\n case eventType.LOCAL_SDP_GENERATED:\n meeting.setStartLocalSDPGenRemoteSDPRecvDelay();\n break;\n case eventType.REMOTE_SDP_RECEIVED:\n meeting.setEndLocalSDPGenRemoteSDPRecvDelay();\n break;\n default:\n break;\n }\n};\n\n/**\n * @description Metrics handles all the call metrics events\n * @export\n * @class Metrics\n */\nclass Metrics {\n static instance: Metrics;\n\n _events: any;\n keys: any;\n meetingCollection: any;\n webex: any;\n\n /**\n * Create Metrics Object\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor() {\n if (!Metrics.instance) {\n /**\n * @instance\n * @type {Array}\n * @private\n * @memberof Metrics\n */\n this._events = [];\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.meetingCollection = null;\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.keys = Object.values(eventType);\n /**\n * @instance\n * @type {Metrics}\n * @private\n * @memberof Metrics\n */\n Metrics.instance = this;\n }\n\n // eslint-disable-next-line no-constructor-return\n return Metrics.instance;\n }\n\n /**\n * Initializes the Metrics singleton with a meeting Collection.\n *\n * @param {Object} meetingCollection meetings object\n * @param {Object} webex webex SDK object\n *\n * @returns {void}\n */\n initialSetup(meetingCollection: object, webex: object) {\n this.meetingCollection = meetingCollection;\n this.webex = webex;\n }\n\n /**\n * poste Meeting event metrics\n * @param {object} options {meetingId/meeting} as a json object\n * @param {Meeting} options.meeting Meeting object\n * @param {String} options.meetingId\n * @param {object} options.data\n * @param {object} options.event\n * @returns {object} null\n */\n postEvent(options: {meeting?: any; meetingId?: string; data?: object; event?: any} | any) {\n const {meetingId, data = {}, event} = options;\n let {meeting} = options;\n\n if (this.keys.indexOf(event) === -1) {\n LoggerProxy.logger.error(\n `Metrics:index#postEvent --> Event ${event} doesn't exist in dictionary`\n );\n }\n\n if (!meeting && meetingId) {\n meeting = this.meetingCollection.get(meetingId);\n options.meeting = meeting;\n }\n\n if (meeting) {\n triggerTimers(options);\n\n if (!meeting.callEvents) {\n meeting.callEvents = [];\n }\n if (event === eventType.MEDIA_QUALITY) {\n data.event = event;\n meeting.sendMediaQualityAnalyzerMetrics(data);\n } else {\n meeting.callEvents.push(event);\n data.event = event;\n meeting.sendCallAnalyzerMetrics(data);\n }\n } else {\n LoggerProxy.logger.info(\n `Metrics:index#postEvent --> Event received for meetingId:${meetingId}, but meeting not found in collection.`\n );\n }\n }\n\n /**\n * Docs for Call analyzer metrics\n * https://sqbu-github.cisco.com/WebExSquared/call-analyzer/wiki\n * https://sqbu-github.cisco.com/WebExSquared/event-dictionary/blob/master/diagnostic-events.raml\n */\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n initPayload(eventType, identifiers, options) {\n const payload: any = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n name: 'endpoint',\n networkType: 'unknown',\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType,\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n osVersion: getOSVersion() || 'unknown',\n subClientType: options.subClientType,\n os: this.getOsName(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion(),\n },\n },\n originTime: {\n triggered: new Date().toISOString(),\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n eventData: {webClientDomain: window.location.hostname},\n },\n };\n\n // TODO: more options should be checked and some of them should be mandatory in certain conditions\n if (options) {\n if (Object.prototype.hasOwnProperty.call(options, 'canProceed')) {\n payload.event.canProceed = options.canProceed;\n }\n if (options.errors) {\n payload.event.errors = options.errors;\n }\n if (options.mediaType) {\n payload.event.mediaType = options.mediaType;\n }\n if (options.trigger) {\n payload.event.trigger = options.trigger;\n }\n if (options.pstnAudioType) {\n payload.event.pstnAudioType = options.pstnAudioType;\n }\n if (options.mediaCapabilities) {\n payload.event.mediaCapabilities = options.mediaCapabilities;\n }\n if (options.recoveredBy) {\n payload.event.recoveredBy = options.recoveredBy;\n }\n if (options.joinTimes) {\n payload.event.joinTimes = options.joinTimes;\n }\n if (options.isRoapCallEnabled) {\n payload.event.isRoapCallEnabled = options.isRoapCallEnabled;\n }\n }\n\n return payload;\n }\n\n /**\n * returns metrics friendly OS versions\n * @param {String} osName Os name\n * @returns {String}\n * @private\n * @memberof Metrics\n */\n private getOsName() {\n return OSMap[getOSName()] ?? OS_NAME.OTHERS;\n }\n\n /**\n * get the payload specific for a media quality event through call analyzer\n * @param {String} eventType the event name\n * @param {Object} identifiers contains the identifiers needed for CA\n * @param {String} identifiers.correlationId\n * @param {String} identifiers.locusUrl\n * @param {String} identifiers.locusId\n * @param {Object} options\n * @param {Object} options.intervalData\n * @param {String} options.clientType\n * @returns {Object}\n * @public\n * @memberof Metrics\n */\n public initMediaPayload(\n // eslint-disable-next-line @typescript-eslint/no-shadow\n eventType: string,\n identifiers: {\n correlationId: string;\n locusUrl: string;\n locusId: string;\n },\n options:\n | {\n intervalData: object;\n clientType: string;\n }\n | any = {}\n ) {\n const {audioSetupDelay, videoSetupDelay, joinTimes} = options;\n\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n audioSetupDelay,\n videoSetupDelay,\n name: 'endpoint',\n networkType: options.networkType || UNKNOWN,\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n os: this.getOsName(),\n osVersion: getOSVersion() || UNKNOWN,\n subClientType: options.subClientType,\n browser: getBrowserName(),\n browserVersion: getBrowserVersion(),\n },\n },\n originTime: {\n triggered: new Date().toISOString(),\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n intervals: [options.intervalData],\n joinTimes,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || UNKNOWN,\n startTime: new Date().toISOString(),\n },\n },\n };\n\n return payload;\n }\n\n /**\n * This function Parses a Locus error and returns a diagnostic event payload.\n * It should keep updating from:\n * https://sqbu-github.cisco.com/WebExSquared/spark-client-framework/blob/master/spark-client-framework/Adapters/TelephonyAdapter/TelephonyAdapter.cpp#L920\n *\n * @param {Object} err the error Object from Locus response\n * @param {boolean} showToUser true if a toast is shown to user\n * @returns {{showToUser: boolean, category: string, errorDescription: string,\n * errorCode: number, errorData: *, fatal: boolean, name: string}}\n */\n parseLocusError(err: any, showToUser: boolean) {\n let errorCode;\n\n if (err && err.statusCode && err.statusCode >= 500) {\n errorCode = 1003;\n } else if (err && err.body && err.body.errorCode) {\n // locus error codes: https://sqbu-github.cisco.com/WebExSquared/locus/blob/master/server/src/main/resources/locus-error-codes.properties\n switch (ERROR_CODE[err.body.errorCode]) {\n case MEETING_ERRORS.FREE_USER_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3007;\n break;\n case MEETING_ERRORS.PAID_USER_MAX_PARTICIPANTS_EXCEEDED:\n case MEETING_ERRORS.SERVICE_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3002;\n break;\n case MEETING_ERRORS.INACTIVE:\n errorCode = 4001;\n break;\n case MEETING_ERRORS.EXCEEDED_MAX_JOINED_PARTICIPANTS:\n case MEETING_ERRORS.EXCEEDED_SERVICE_MAX_PARTICIPANTS:\n errorCode = 3001;\n break;\n case MEETING_ERRORS.MEETING_IS_LOCKED:\n errorCode = 4002;\n break;\n case MEETING_ERRORS.MEETING_IS_TERMINATING:\n errorCode = 4003;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN_INTENT:\n errorCode = 4004;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN:\n errorCode = 4005;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_ROLE:\n errorCode = 4006;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER:\n case MEETING_ERRORS.GET_RESTRICTED_USER:\n case MEETING_ERRORS.CREATE_MEDIA_RESTRICTED_USER:\n errorCode = 3005;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER_NOT_IN_ROOM:\n errorCode = 4007;\n break;\n case MEETING_ERRORS.MEETING_NOT_FOUND:\n errorCode = 4011;\n break;\n case MEETING_ERRORS.NOT_WEBEX_SITE:\n errorCode = 4012;\n break;\n case MEETING_ERRORS.INVALID_JOIN_TIME:\n errorCode = 4013;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_NOT_A_NUMBER:\n errorCode = 4016;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_LONG:\n errorCode = 4017;\n break;\n case MEETING_ERRORS.INVALID_DIALABLE_KEY:\n errorCode = 4018;\n break;\n case MEETING_ERRORS.ONE_ON_ONE_TO_SELF_NOT_ALLOWED:\n errorCode = 4019;\n break;\n case MEETING_ERRORS.REMOVED_PARTICIPANT:\n errorCode = 4020;\n break;\n case MEETING_ERRORS.MEETING_LINK_NOT_FOUND:\n errorCode = 4021;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_SHORT_AFTER_IDD:\n errorCode = 4022;\n break;\n case MEETING_ERRORS.INVALID_INVITEE_ADDRESS:\n errorCode = 4023;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_LOCKED:\n errorCode = 4024;\n break;\n case MEETING_ERRORS.RESOURCE_GUEST_FORBIDDEN:\n errorCode = 4025;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_SUSPENDED:\n errorCode = 4026;\n break;\n case MEETING_ERRORS.EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE:\n errorCode = 4027;\n break;\n case MEETING_ERRORS.INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST:\n errorCode = 1006;\n break;\n case MEETING_ERRORS.CONVERSATION_NOT_FOUND:\n errorCode = 4028;\n break;\n case MEETING_ERRORS.RECORDING_CONTROL_NOT_SUPPORTED:\n case MEETING_ERRORS.RECORDING_NOT_STARTED:\n case MEETING_ERRORS.RECORDING_NOT_ENABLED:\n errorCode = 4029;\n break;\n default:\n errorCode = 4008;\n }\n } else {\n errorCode = 4008;\n }\n\n return this.generateErrorPayload(errorCode, showToUser, error.name.LOCUS_RESPONSE, err);\n }\n\n generateErrorPayload(errorCode, shownToUser, name, err) {\n if (error.errors[errorCode]) {\n const errorPayload: any = {\n shownToUser: shownToUser || false,\n category: error.errors[errorCode][2],\n errorDescription: error.errors[errorCode][0],\n errorCode,\n fatal: !includes(error.notFatalErrorList, errorCode),\n name: name || error.name.OTHER,\n };\n\n if (err && err.body) {\n errorPayload.errorData = err.body;\n }\n\n if (err && err.statusCode) {\n errorPayload.httpCode = err.statusCode;\n }\n\n return errorPayload;\n }\n\n return null;\n }\n\n /**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\n userAgentToString() {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${this.webex.meetings?.metrics?.clientName}`);\n\n if (\n ['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !==\n -1\n ) {\n browserInfo = util.format(\n 'browser=%s',\n `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`\n );\n }\n const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);\n\n if (browserInfo) {\n userAgentOption = `(${browserInfo}`;\n }\n if (osInfo) {\n userAgentOption = userAgentOption\n ? `${userAgentOption}; ${clientInfo}; ${osInfo}`\n : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format(\n 'webex-js-sdk/%s %s',\n `${process.env.NODE_ENV}-${this.webex.version}`,\n userAgentOption\n );\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${this.webex.version}`);\n }\n\n /**\n * Uploads given metric to the Metrics service as an Behavioral metric.\n * Metadata about the environment such as browser, OS, SDK and their versions\n * are automatically added when the metric is sent.\n *\n * The Metrics service will send an Behavioral metric to InfluxDB for\n * aggregation.\n * See https://confluence-eng-gpk2.cisco.com/conf/display/WBXT/Getting+started+with+Metrics+Service.\n *\n * @param {string} metricName Name of the metric (measurement) to send\n * @param {Object} metricFields Key-valye pairs of data or values about this metric\n * @param {Object} metricTags Key-value pairs of metric metadata\n *\n * @returns {void}\n */\n sendBehavioralMetric(metricName: string, metricFields: object = {}, metricTags: object = {}) {\n this.webex.internal.metrics.submitClientMetrics(metricName, {\n type: this.webex.config.metrics.type,\n fields: metricFields,\n tags: metricTags,\n });\n }\n}\n\n// Export Metrics singleton ---------------------------------------------------\nconst instance = new Metrics();\n\nexport default instance;\n"],"mappings":"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"}
@@ -1,32 +1,23 @@
1
1
  "use strict";
2
2
 
3
3
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
-
5
4
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
-
7
5
  _Object$defineProperty(exports, "__esModule", {
8
6
  value: true
9
7
  });
10
-
11
8
  exports.MediaRequestManager = void 0;
12
-
13
9
  var _values = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/values"));
14
-
15
10
  var _entries = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/entries"));
16
-
17
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
18
-
19
12
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
20
-
21
13
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
22
-
23
14
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
24
-
15
+ var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
25
16
  var _internalMediaCore = require("@webex/internal-media-core");
26
-
27
17
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
28
-
18
+ var _remoteMedia = require("./remoteMedia");
29
19
  /* eslint-disable require-jsdoc */
20
+
30
21
  var CODEC_DEFAULTS = {
31
22
  h264: {
32
23
  maxFs: 8192,
@@ -34,58 +25,95 @@ var CODEC_DEFAULTS = {
34
25
  maxMbps: 245760
35
26
  }
36
27
  };
37
-
38
28
  var MediaRequestManager = /*#__PURE__*/function () {
39
- function MediaRequestManager(sendMediaRequestsCallback) {
29
+ function MediaRequestManager(degradationPreferences, sendMediaRequestsCallback) {
40
30
  (0, _classCallCheck2.default)(this, MediaRequestManager);
41
31
  (0, _defineProperty2.default)(this, "sendMediaRequestsCallback", void 0);
42
32
  (0, _defineProperty2.default)(this, "counter", void 0);
43
33
  (0, _defineProperty2.default)(this, "clientRequests", void 0);
44
34
  (0, _defineProperty2.default)(this, "slotsActiveInLastMediaRequest", void 0);
35
+ (0, _defineProperty2.default)(this, "degradationPreferences", void 0);
45
36
  this.sendMediaRequestsCallback = sendMediaRequestsCallback;
46
37
  this.counter = 0;
47
38
  this.clientRequests = {};
48
39
  this.slotsActiveInLastMediaRequest = {};
40
+ this.degradationPreferences = degradationPreferences;
49
41
  }
50
-
51
42
  (0, _createClass2.default)(MediaRequestManager, [{
52
43
  key: "resetInactiveReceiveSlots",
53
44
  value: function resetInactiveReceiveSlots() {
54
- var activeSlots = {}; // create a map of all currently used slot ids
45
+ var activeSlots = {};
55
46
 
47
+ // create a map of all currently used slot ids
56
48
  (0, _values.default)(this.clientRequests).forEach(function (request) {
57
49
  return request.receiveSlots.forEach(function (slot) {
58
50
  activeSlots[slot.id] = slot;
59
51
  });
60
- }); // when we stop using some receive slots and they are not included in the new media request,
52
+ });
53
+
54
+ // when we stop using some receive slots and they are not included in the new media request,
61
55
  // we will never get a 'no source' notification for them, so we reset their state,
62
56
  // so that the client doesn't try to display their video anymore
63
-
64
57
  for (var _i = 0, _Object$entries = (0, _entries.default)(this.slotsActiveInLastMediaRequest); _i < _Object$entries.length; _i++) {
65
58
  var _Object$entries$_i = (0, _slicedToArray2.default)(_Object$entries[_i], 2),
66
- slotId = _Object$entries$_i[0],
67
- slot = _Object$entries$_i[1];
68
-
59
+ slotId = _Object$entries$_i[0],
60
+ slot = _Object$entries$_i[1];
69
61
  if (!(slotId in activeSlots)) {
70
62
  _loggerProxy.default.logger.info("multistream:mediaRequestManager --> resetting sourceState to \"no source\" for slot ".concat(slot.id));
71
-
72
63
  slot.resetSourceState();
73
64
  }
74
65
  }
75
-
76
66
  this.slotsActiveInLastMediaRequest = activeSlots;
77
67
  }
68
+ }, {
69
+ key: "setDegradationPreferences",
70
+ value: function setDegradationPreferences(degradationPreferences) {
71
+ this.degradationPreferences = degradationPreferences;
72
+ this.sendRequests(); // re-send requests after preferences are set
73
+ }
74
+ }, {
75
+ key: "getDegradedClientRequests",
76
+ value: function getDegradedClientRequests() {
77
+ var _this = this;
78
+ var clientRequests = (0, _cloneDeep2.default)(this.clientRequests);
79
+ var maxFsLimits = [(0, _remoteMedia.getMaxFs)('best'), (0, _remoteMedia.getMaxFs)('large'), (0, _remoteMedia.getMaxFs)('medium'), (0, _remoteMedia.getMaxFs)('small'), (0, _remoteMedia.getMaxFs)('very small'), (0, _remoteMedia.getMaxFs)('thumbnail')];
80
+
81
+ // reduce max-fs until total macroblocks is below limit
82
+ var _loop = function _loop(i) {
83
+ var totalMacroblocksRequested = 0;
84
+ (0, _values.default)(clientRequests).forEach(function (mr) {
85
+ if (mr.codecInfo) {
86
+ mr.codecInfo.maxFs = Math.min(mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs, maxFsLimits[i]);
87
+ totalMacroblocksRequested += mr.codecInfo.maxFs * mr.receiveSlots.length;
88
+ }
89
+ });
90
+ if (totalMacroblocksRequested <= _this.degradationPreferences.maxMacroblocksLimit) {
91
+ if (i !== 0) {
92
+ _loggerProxy.default.logger.warn("multistream:mediaRequestManager --> too many requests with high max-fs, frame size will be limited to ".concat(maxFsLimits[i]));
93
+ }
94
+ return "break";
95
+ } else if (i === maxFsLimits.length - 1) {
96
+ _loggerProxy.default.logger.warn("multistream:mediaRequestManager --> even with frame size limited to ".concat(maxFsLimits[i], " you are still requesting too many streams, consider reducing the number of requests"));
97
+ }
98
+ };
99
+ for (var i = 0; i < maxFsLimits.length; i += 1) {
100
+ var _ret = _loop(i);
101
+ if (_ret === "break") break;
102
+ }
103
+ return clientRequests;
104
+ }
78
105
  }, {
79
106
  key: "sendRequests",
80
107
  value: function sendRequests() {
81
- var wcmeMediaRequests = []; // todo: check how many streams we're asking for and what resolution and introduce some limits (spark-377701)
82
-
83
- var maxPayloadBitsPerSecond = 10 * 1000 * 1000; // map all the client media requests to wcme media requests
108
+ var wcmeMediaRequests = [];
109
+ var clientRequests = this.getDegradedClientRequests();
110
+ var maxPayloadBitsPerSecond = 10 * 1000 * 1000;
84
111
 
85
- (0, _values.default)(this.clientRequests).forEach(function (mr) {
86
- wcmeMediaRequests.push(new _internalMediaCore.MediaConnection.MediaRequest(mr.policyInfo.policy === 'active-speaker' ? _internalMediaCore.MediaConnection.Policy.ActiveSpeaker : _internalMediaCore.MediaConnection.Policy.ReceiverSelected, mr.policyInfo.policy === 'active-speaker' ? new _internalMediaCore.MediaConnection.ActiveSpeakerInfo(mr.policyInfo.priority, mr.policyInfo.crossPriorityDuplication, mr.policyInfo.crossPolicyDuplication, mr.policyInfo.preferLiveVideo) : new _internalMediaCore.MediaConnection.ReceiverSelectedInfo(mr.policyInfo.csi), mr.receiveSlots.map(function (receiveSlot) {
112
+ // map all the client media requests to wcme media requests
113
+ (0, _values.default)(clientRequests).forEach(function (mr) {
114
+ wcmeMediaRequests.push(new _internalMediaCore.MediaRequest(mr.policyInfo.policy === 'active-speaker' ? _internalMediaCore.Policy.ActiveSpeaker : _internalMediaCore.Policy.ReceiverSelected, mr.policyInfo.policy === 'active-speaker' ? new _internalMediaCore.ActiveSpeakerInfo(mr.policyInfo.priority, mr.policyInfo.crossPriorityDuplication, mr.policyInfo.crossPolicyDuplication, mr.policyInfo.preferLiveVideo) : new _internalMediaCore.ReceiverSelectedInfo(mr.policyInfo.csi), mr.receiveSlots.map(function (receiveSlot) {
87
115
  return receiveSlot.wcmeReceiveSlot;
88
- }), maxPayloadBitsPerSecond, mr.codecInfo && [new _internalMediaCore.MediaConnection.CodecInfo(0x80, new _internalMediaCore.MediaConnection.H264Codec(mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs, mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps, mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps, mr.codecInfo.maxWidth, mr.codecInfo.maxHeight))]));
116
+ }), maxPayloadBitsPerSecond, mr.codecInfo && [new _internalMediaCore.CodecInfo(0x80, new _internalMediaCore.H264Codec(mr.codecInfo.maxFs, mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps, mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps, mr.codecInfo.maxWidth, mr.codecInfo.maxHeight))]));
89
117
  });
90
118
  this.sendMediaRequestsCallback(wcmeMediaRequests);
91
119
  this.resetInactiveReceiveSlots();
@@ -97,11 +125,9 @@ var MediaRequestManager = /*#__PURE__*/function () {
97
125
  // eslint-disable-next-line no-plusplus
98
126
  var newId = "".concat(this.counter++);
99
127
  this.clientRequests[newId] = mediaRequest;
100
-
101
128
  if (commit) {
102
129
  this.commit();
103
130
  }
104
-
105
131
  return newId;
106
132
  }
107
133
  }, {
@@ -109,7 +135,6 @@ var MediaRequestManager = /*#__PURE__*/function () {
109
135
  value: function cancelRequest(requestId) {
110
136
  var commit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
111
137
  delete this.clientRequests[requestId];
112
-
113
138
  if (commit) {
114
139
  this.commit();
115
140
  }
@@ -128,6 +153,5 @@ var MediaRequestManager = /*#__PURE__*/function () {
128
153
  }]);
129
154
  return MediaRequestManager;
130
155
  }();
131
-
132
156
  exports.MediaRequestManager = MediaRequestManager;
133
157
  //# sourceMappingURL=mediaRequestManager.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["CODEC_DEFAULTS","h264","maxFs","maxFps","maxMbps","MediaRequestManager","sendMediaRequestsCallback","counter","clientRequests","slotsActiveInLastMediaRequest","activeSlots","forEach","request","receiveSlots","slot","id","slotId","LoggerProxy","logger","info","resetSourceState","wcmeMediaRequests","maxPayloadBitsPerSecond","mr","push","MC","MediaRequest","policyInfo","policy","Policy","ActiveSpeaker","ReceiverSelected","ActiveSpeakerInfo","priority","crossPriorityDuplication","crossPolicyDuplication","preferLiveVideo","ReceiverSelectedInfo","csi","map","receiveSlot","wcmeReceiveSlot","codecInfo","CodecInfo","H264Codec","maxWidth","maxHeight","resetInactiveReceiveSlots","mediaRequest","commit","newId","requestId","sendRequests"],"sources":["mediaRequestManager.ts"],"sourcesContent":["/* eslint-disable require-jsdoc */\nimport {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport {ReceiveSlot, ReceiveSlotId} from './receiveSlot';\n\nexport interface ActiveSpeakerPolicyInfo {\n policy: 'active-speaker';\n priority: number;\n crossPriorityDuplication: boolean;\n crossPolicyDuplication: boolean;\n preferLiveVideo: boolean;\n}\n\nexport interface ReceiverSelectedPolicyInfo {\n policy: 'receiver-selected';\n csi: number;\n}\n\nexport type PolicyInfo = ActiveSpeakerPolicyInfo | ReceiverSelectedPolicyInfo;\n\nexport interface H264CodecInfo {\n codec: 'h264';\n maxFs?: number;\n maxFps?: number;\n maxMbps?: number;\n maxWidth?: number;\n maxHeight?: number;\n}\n\nexport type CodecInfo = H264CodecInfo; // we'll add AV1 here in the future when it's available\n\nexport interface MediaRequest {\n policyInfo: PolicyInfo;\n receiveSlots: Array<ReceiveSlot>;\n codecInfo?: CodecInfo;\n}\n\nexport type MediaRequestId = string;\n\nconst CODEC_DEFAULTS = {\n h264: {\n maxFs: 8192,\n maxFps: 3000,\n maxMbps: 245760,\n },\n};\n\ntype SendMediaRequestsCallback = (mediaRequests: MC.MediaRequest[]) => void;\n\nexport class MediaRequestManager {\n private sendMediaRequestsCallback: SendMediaRequestsCallback;\n\n private counter;\n\n private clientRequests: {[key: MediaRequestId]: MediaRequest};\n\n private slotsActiveInLastMediaRequest: {[key: ReceiveSlotId]: ReceiveSlot};\n\n constructor(sendMediaRequestsCallback: SendMediaRequestsCallback) {\n this.sendMediaRequestsCallback = sendMediaRequestsCallback;\n this.counter = 0;\n this.clientRequests = {};\n this.slotsActiveInLastMediaRequest = {};\n }\n\n private resetInactiveReceiveSlots() {\n const activeSlots: {[key: ReceiveSlotId]: ReceiveSlot} = {};\n\n // create a map of all currently used slot ids\n Object.values(this.clientRequests).forEach((request) =>\n request.receiveSlots.forEach((slot) => {\n activeSlots[slot.id] = slot;\n })\n );\n\n // when we stop using some receive slots and they are not included in the new media request,\n // we will never get a 'no source' notification for them, so we reset their state,\n // so that the client doesn't try to display their video anymore\n for (const [slotId, slot] of Object.entries(this.slotsActiveInLastMediaRequest)) {\n if (!(slotId in activeSlots)) {\n LoggerProxy.logger.info(\n `multistream:mediaRequestManager --> resetting sourceState to \"no source\" for slot ${slot.id}`\n );\n slot.resetSourceState();\n }\n }\n\n this.slotsActiveInLastMediaRequest = activeSlots;\n }\n\n private sendRequests() {\n const wcmeMediaRequests: MC.MediaRequest[] = [];\n\n // todo: check how many streams we're asking for and what resolution and introduce some limits (spark-377701)\n const maxPayloadBitsPerSecond = 10 * 1000 * 1000;\n\n // map all the client media requests to wcme media requests\n Object.values(this.clientRequests).forEach((mr) => {\n wcmeMediaRequests.push(\n new MC.MediaRequest(\n mr.policyInfo.policy === 'active-speaker'\n ? MC.Policy.ActiveSpeaker\n : MC.Policy.ReceiverSelected,\n mr.policyInfo.policy === 'active-speaker'\n ? new MC.ActiveSpeakerInfo(\n mr.policyInfo.priority,\n mr.policyInfo.crossPriorityDuplication,\n mr.policyInfo.crossPolicyDuplication,\n mr.policyInfo.preferLiveVideo\n )\n : new MC.ReceiverSelectedInfo(mr.policyInfo.csi),\n mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),\n maxPayloadBitsPerSecond,\n mr.codecInfo && [\n new MC.CodecInfo(\n 0x80,\n new MC.H264Codec(\n mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,\n mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,\n mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps,\n mr.codecInfo.maxWidth,\n mr.codecInfo.maxHeight\n )\n ),\n ]\n )\n );\n });\n\n this.sendMediaRequestsCallback(wcmeMediaRequests);\n\n this.resetInactiveReceiveSlots();\n }\n\n public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {\n // eslint-disable-next-line no-plusplus\n const newId = `${this.counter++}`;\n\n this.clientRequests[newId] = mediaRequest;\n\n if (commit) {\n this.commit();\n }\n\n return newId;\n }\n\n public cancelRequest(requestId: MediaRequestId, commit = true) {\n delete this.clientRequests[requestId];\n\n if (commit) {\n this.commit();\n }\n }\n\n public commit() {\n return this.sendRequests();\n }\n\n public reset() {\n this.clientRequests = {};\n this.slotsActiveInLastMediaRequest = {};\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["CODEC_DEFAULTS","h264","maxFs","maxFps","maxMbps","MediaRequestManager","degradationPreferences","sendMediaRequestsCallback","counter","clientRequests","slotsActiveInLastMediaRequest","activeSlots","forEach","request","receiveSlots","slot","id","slotId","LoggerProxy","logger","info","resetSourceState","sendRequests","maxFsLimits","getMaxFs","totalMacroblocksRequested","mr","codecInfo","Math","min","i","length","maxMacroblocksLimit","warn","wcmeMediaRequests","getDegradedClientRequests","maxPayloadBitsPerSecond","push","WcmeMediaRequest","policyInfo","policy","Policy","ActiveSpeaker","ReceiverSelected","ActiveSpeakerInfo","priority","crossPriorityDuplication","crossPolicyDuplication","preferLiveVideo","ReceiverSelectedInfo","csi","map","receiveSlot","wcmeReceiveSlot","WcmeCodecInfo","H264Codec","maxWidth","maxHeight","resetInactiveReceiveSlots","mediaRequest","commit","newId","requestId"],"sources":["mediaRequestManager.ts"],"sourcesContent":["/* eslint-disable require-jsdoc */\nimport {\n MediaRequest as WcmeMediaRequest,\n Policy,\n ActiveSpeakerInfo,\n ReceiverSelectedInfo,\n CodecInfo as WcmeCodecInfo,\n H264Codec,\n} from '@webex/internal-media-core';\nimport {cloneDeep} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport {ReceiveSlot, ReceiveSlotId} from './receiveSlot';\nimport {getMaxFs} from './remoteMedia';\n\nexport interface ActiveSpeakerPolicyInfo {\n policy: 'active-speaker';\n priority: number;\n crossPriorityDuplication: boolean;\n crossPolicyDuplication: boolean;\n preferLiveVideo: boolean;\n}\n\nexport interface ReceiverSelectedPolicyInfo {\n policy: 'receiver-selected';\n csi: number;\n}\n\nexport type PolicyInfo = ActiveSpeakerPolicyInfo | ReceiverSelectedPolicyInfo;\n\nexport interface H264CodecInfo {\n codec: 'h264';\n maxFs?: number;\n maxFps?: number;\n maxMbps?: number;\n maxWidth?: number;\n maxHeight?: number;\n}\n\nexport type CodecInfo = H264CodecInfo; // we'll add AV1 here in the future when it's available\n\nexport interface MediaRequest {\n policyInfo: PolicyInfo;\n receiveSlots: Array<ReceiveSlot>;\n codecInfo?: CodecInfo;\n}\n\nexport type MediaRequestId = string;\n\nconst CODEC_DEFAULTS = {\n h264: {\n maxFs: 8192,\n maxFps: 3000,\n maxMbps: 245760,\n },\n};\n\ntype DegradationPreferences = {\n maxMacroblocksLimit: number;\n};\n\ntype SendMediaRequestsCallback = (mediaRequests: WcmeMediaRequest[]) => void;\n\nexport class MediaRequestManager {\n private sendMediaRequestsCallback: SendMediaRequestsCallback;\n\n private counter: number;\n\n private clientRequests: {[key: MediaRequestId]: MediaRequest};\n\n private slotsActiveInLastMediaRequest: {[key: ReceiveSlotId]: ReceiveSlot};\n\n private degradationPreferences: DegradationPreferences;\n\n constructor(\n degradationPreferences: DegradationPreferences,\n sendMediaRequestsCallback: SendMediaRequestsCallback\n ) {\n this.sendMediaRequestsCallback = sendMediaRequestsCallback;\n this.counter = 0;\n this.clientRequests = {};\n this.slotsActiveInLastMediaRequest = {};\n this.degradationPreferences = degradationPreferences;\n }\n\n private resetInactiveReceiveSlots() {\n const activeSlots: {[key: ReceiveSlotId]: ReceiveSlot} = {};\n\n // create a map of all currently used slot ids\n Object.values(this.clientRequests).forEach((request) =>\n request.receiveSlots.forEach((slot) => {\n activeSlots[slot.id] = slot;\n })\n );\n\n // when we stop using some receive slots and they are not included in the new media request,\n // we will never get a 'no source' notification for them, so we reset their state,\n // so that the client doesn't try to display their video anymore\n for (const [slotId, slot] of Object.entries(this.slotsActiveInLastMediaRequest)) {\n if (!(slotId in activeSlots)) {\n LoggerProxy.logger.info(\n `multistream:mediaRequestManager --> resetting sourceState to \"no source\" for slot ${slot.id}`\n );\n slot.resetSourceState();\n }\n }\n\n this.slotsActiveInLastMediaRequest = activeSlots;\n }\n\n public setDegradationPreferences(degradationPreferences: DegradationPreferences) {\n this.degradationPreferences = degradationPreferences;\n this.sendRequests(); // re-send requests after preferences are set\n }\n\n private getDegradedClientRequests() {\n const clientRequests = cloneDeep(this.clientRequests);\n const maxFsLimits = [\n getMaxFs('best'),\n getMaxFs('large'),\n getMaxFs('medium'),\n getMaxFs('small'),\n getMaxFs('very small'),\n getMaxFs('thumbnail'),\n ];\n\n // reduce max-fs until total macroblocks is below limit\n for (let i = 0; i < maxFsLimits.length; i += 1) {\n let totalMacroblocksRequested = 0;\n Object.values(clientRequests).forEach((mr) => {\n if (mr.codecInfo) {\n mr.codecInfo.maxFs = Math.min(\n mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,\n maxFsLimits[i]\n );\n totalMacroblocksRequested += mr.codecInfo.maxFs * mr.receiveSlots.length;\n }\n });\n if (totalMacroblocksRequested <= this.degradationPreferences.maxMacroblocksLimit) {\n if (i !== 0) {\n LoggerProxy.logger.warn(\n `multistream:mediaRequestManager --> too many requests with high max-fs, frame size will be limited to ${maxFsLimits[i]}`\n );\n }\n break;\n } else if (i === maxFsLimits.length - 1) {\n LoggerProxy.logger.warn(\n `multistream:mediaRequestManager --> even with frame size limited to ${maxFsLimits[i]} you are still requesting too many streams, consider reducing the number of requests`\n );\n }\n }\n\n return clientRequests;\n }\n\n private sendRequests() {\n const wcmeMediaRequests: WcmeMediaRequest[] = [];\n\n const clientRequests = this.getDegradedClientRequests();\n const maxPayloadBitsPerSecond = 10 * 1000 * 1000;\n\n // map all the client media requests to wcme media requests\n Object.values(clientRequests).forEach((mr) => {\n wcmeMediaRequests.push(\n new WcmeMediaRequest(\n mr.policyInfo.policy === 'active-speaker'\n ? Policy.ActiveSpeaker\n : Policy.ReceiverSelected,\n mr.policyInfo.policy === 'active-speaker'\n ? new ActiveSpeakerInfo(\n mr.policyInfo.priority,\n mr.policyInfo.crossPriorityDuplication,\n mr.policyInfo.crossPolicyDuplication,\n mr.policyInfo.preferLiveVideo\n )\n : new ReceiverSelectedInfo(mr.policyInfo.csi),\n mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),\n maxPayloadBitsPerSecond,\n mr.codecInfo && [\n new WcmeCodecInfo(\n 0x80,\n new H264Codec(\n mr.codecInfo.maxFs,\n mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,\n mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps,\n mr.codecInfo.maxWidth,\n mr.codecInfo.maxHeight\n )\n ),\n ]\n )\n );\n });\n\n this.sendMediaRequestsCallback(wcmeMediaRequests);\n\n this.resetInactiveReceiveSlots();\n }\n\n public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {\n // eslint-disable-next-line no-plusplus\n const newId = `${this.counter++}`;\n\n this.clientRequests[newId] = mediaRequest;\n\n if (commit) {\n this.commit();\n }\n\n return newId;\n }\n\n public cancelRequest(requestId: MediaRequestId, commit = true) {\n delete this.clientRequests[requestId];\n\n if (commit) {\n this.commit();\n }\n }\n\n public commit() {\n return this.sendRequests();\n }\n\n public reset() {\n this.clientRequests = {};\n this.slotsActiveInLastMediaRequest = {};\n }\n}\n"],"mappings":"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"}
@@ -1,164 +1,125 @@
1
1
  "use strict";
2
2
 
3
3
  var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
-
5
4
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
6
-
7
5
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
8
-
9
6
  _Object$defineProperty(exports, "__esModule", {
10
7
  value: true
11
8
  });
12
-
13
9
  exports.ReceiveSlotEvents = exports.ReceiveSlot = void 0;
14
-
15
10
  var _weakMap = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/weak-map"));
16
-
17
11
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
18
-
19
12
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
20
-
21
13
  var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
22
-
23
14
  var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
24
-
25
15
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
26
-
27
16
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
28
-
29
17
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
30
-
31
18
  var _classPrivateFieldGet2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classPrivateFieldGet"));
32
-
33
19
  var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classPrivateFieldSet"));
34
-
35
20
  var _internalMediaCore = require("@webex/internal-media-core");
36
-
37
21
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
38
-
39
22
  var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
40
-
41
23
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
42
-
43
24
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
44
-
45
25
  function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
46
-
47
26
  function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
48
-
49
27
  var ReceiveSlotEvents = {
50
28
  SourceUpdate: 'sourceUpdate'
51
29
  };
52
30
  exports.ReceiveSlotEvents = ReceiveSlotEvents;
53
31
  var receiveSlotCounter = 0;
54
-
55
32
  var _memberId = /*#__PURE__*/new _weakMap.default();
56
-
57
33
  var _csi = /*#__PURE__*/new _weakMap.default();
58
-
59
34
  var _sourceState = /*#__PURE__*/new _weakMap.default();
60
-
61
35
  /**
62
36
  * Class representing a receive slot. A single receive slot is able to receive a single track
63
37
  * for example some participant's main video or audio
64
38
  */
65
39
  var ReceiveSlot = /*#__PURE__*/function (_EventsScope) {
66
40
  (0, _inherits2.default)(ReceiveSlot, _EventsScope);
67
-
68
41
  var _super = _createSuper(ReceiveSlot);
69
-
70
42
  /**
71
43
  * constructor - don't use it directly, you should always use meeting.receiveSlotManager.allocateSlot()
72
44
  * to create any receive slots
73
45
  *
74
- * @param {MC.MediaType} mediaType
75
- * @param {MC.ReceiveSlot} mcReceiveSlot
46
+ * @param {MediaType} mediaType
47
+ * @param {ReceiveSlot} mcReceiveSlot
76
48
  * @param {FindMemberIdCallback} findMemberIdCallback callback for finding memberId for given CSI
77
49
  */
78
50
  function ReceiveSlot(mediaType, mcReceiveSlot, findMemberIdCallback) {
79
51
  var _this;
80
-
81
52
  (0, _classCallCheck2.default)(this, ReceiveSlot);
82
53
  _this = _super.call(this);
83
54
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mcReceiveSlot", void 0);
84
55
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "findMemberIdCallback", void 0);
85
56
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "id", void 0);
86
57
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mediaType", void 0);
87
-
88
58
  _classPrivateFieldInitSpec((0, _assertThisInitialized2.default)(_this), _memberId, {
89
59
  writable: true,
90
60
  value: void 0
91
61
  });
92
-
93
62
  _classPrivateFieldInitSpec((0, _assertThisInitialized2.default)(_this), _csi, {
94
63
  writable: true,
95
64
  value: void 0
96
65
  });
97
-
98
66
  _classPrivateFieldInitSpec((0, _assertThisInitialized2.default)(_this), _sourceState, {
99
67
  writable: true,
100
68
  value: void 0
101
69
  });
102
-
103
70
  receiveSlotCounter += 1;
104
71
  _this.findMemberIdCallback = findMemberIdCallback;
105
72
  _this.mediaType = mediaType;
106
73
  _this.mcReceiveSlot = mcReceiveSlot;
107
74
  (0, _classPrivateFieldSet2.default)((0, _assertThisInitialized2.default)(_this), _sourceState, 'no source');
108
75
  _this.id = "r".concat(receiveSlotCounter);
109
-
110
76
  _this.setupEventListeners();
111
-
112
77
  return _this;
113
78
  }
79
+
114
80
  /**
115
81
  * Getter for memberId
116
82
  */
117
-
118
-
119
83
  (0, _createClass2.default)(ReceiveSlot, [{
120
84
  key: "memberId",
121
85
  get: function get() {
122
86
  return (0, _classPrivateFieldGet2.default)(this, _memberId);
123
87
  }
88
+
124
89
  /**
125
90
  * Getter for csi
126
91
  */
127
-
128
92
  }, {
129
93
  key: "csi",
130
94
  get: function get() {
131
95
  return (0, _classPrivateFieldGet2.default)(this, _csi);
132
96
  }
97
+
133
98
  /**
134
99
  * Getter for sourceState
135
100
  */
136
-
137
101
  }, {
138
102
  key: "sourceState",
139
103
  get: function get() {
140
104
  return (0, _classPrivateFieldGet2.default)(this, _sourceState);
141
105
  }
106
+
142
107
  /**
143
108
  * registers event handlers with the underlying ReceiveSlot
144
109
  */
145
-
146
110
  }, {
147
111
  key: "setupEventListeners",
148
112
  value: function setupEventListeners() {
149
113
  var _this2 = this;
150
-
151
114
  var scope = {
152
115
  file: 'meeting/receiveSlot',
153
116
  function: 'setupEventListeners'
154
117
  };
155
- this.mcReceiveSlot.on(_internalMediaCore.MediaConnection.ReceiveSlotEvents.SourceUpdate, function (state, csi) {
118
+ this.mcReceiveSlot.on(_internalMediaCore.ReceiveSlotEvents.SourceUpdate, function (state, csi) {
156
119
  _loggerProxy.default.logger.log("ReceiveSlot#setupEventListeners --> got source update on receive slot ".concat(_this2.id, ", mediaType=").concat(_this2.mediaType, ", csi=").concat(csi, ", state=").concat(state));
157
-
158
120
  (0, _classPrivateFieldSet2.default)(_this2, _memberId, csi ? _this2.findMemberIdCallback(csi) : undefined);
159
121
  (0, _classPrivateFieldSet2.default)(_this2, _csi, csi);
160
122
  (0, _classPrivateFieldSet2.default)(_this2, _sourceState, state);
161
-
162
123
  _this2.emit(scope, ReceiveSlotEvents.SourceUpdate, {
163
124
  state: (0, _classPrivateFieldGet2.default)(_this2, _sourceState),
164
125
  csi: (0, _classPrivateFieldGet2.default)(_this2, _csi),
@@ -166,26 +127,47 @@ var ReceiveSlot = /*#__PURE__*/function (_EventsScope) {
166
127
  });
167
128
  });
168
129
  }
130
+
131
+ /** Tries to find the member id for this receive slot if it hasn't got one */
132
+ }, {
133
+ key: "findMemberId",
134
+ value: function findMemberId() {
135
+ if ((0, _classPrivateFieldGet2.default)(this, _memberId) === undefined && (0, _classPrivateFieldGet2.default)(this, _csi)) {
136
+ (0, _classPrivateFieldSet2.default)(this, _memberId, this.findMemberIdCallback((0, _classPrivateFieldGet2.default)(this, _csi)));
137
+ if ((0, _classPrivateFieldGet2.default)(this, _memberId)) {
138
+ // if we found the memberId, simulate source update so that the client app knows that something's changed
139
+ this.emit({
140
+ file: 'meeting/receiveSlot',
141
+ function: 'findMemberId'
142
+ }, ReceiveSlotEvents.SourceUpdate, {
143
+ state: (0, _classPrivateFieldGet2.default)(this, _sourceState),
144
+ csi: (0, _classPrivateFieldGet2.default)(this, _csi),
145
+ memberId: (0, _classPrivateFieldGet2.default)(this, _memberId)
146
+ });
147
+ }
148
+ }
149
+ }
150
+
169
151
  /**
170
152
  * The MediaStream object associated with this slot.
171
153
  *
172
154
  * @returns {MediaStream} The MediaStreamTrack.
173
155
  */
174
-
175
156
  }, {
176
157
  key: "stream",
177
158
  get: function get() {
178
159
  return this.mcReceiveSlot.stream;
179
160
  }
161
+
180
162
  /**
181
163
  * The underlying WCME receive slot
182
164
  */
183
-
184
165
  }, {
185
166
  key: "wcmeReceiveSlot",
186
167
  get: function get() {
187
168
  return this.mcReceiveSlot;
188
169
  }
170
+
189
171
  /**
190
172
  * Resets the source state to the default 'no source' value.
191
173
  * This function should be called on receive slots that are
@@ -193,7 +175,6 @@ var ReceiveSlot = /*#__PURE__*/function (_EventsScope) {
193
175
  * does not send any more events on such slots, so the sourceState
194
176
  * value would not represent the truth anymore.
195
177
  */
196
-
197
178
  }, {
198
179
  key: "resetSourceState",
199
180
  value: function resetSourceState() {
@@ -204,6 +185,5 @@ var ReceiveSlot = /*#__PURE__*/function (_EventsScope) {
204
185
  }]);
205
186
  return ReceiveSlot;
206
187
  }(_eventsScope.default);
207
-
208
188
  exports.ReceiveSlot = ReceiveSlot;
209
189
  //# sourceMappingURL=receiveSlot.js.map