@webex/plugin-meetings 2.59.2 → 2.59.3-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/.eslintrc.js +6 -6
  2. package/LICENSE +1 -1
  3. package/README.md +1204 -1204
  4. package/UPGRADING.md +287 -287
  5. package/babel.config.js +3 -3
  6. package/browsers.js +108 -108
  7. package/dist/common/browser-detection.d.ts +9 -9
  8. package/dist/common/browser-detection.js.map +1 -1
  9. package/dist/common/collection.d.ts +48 -48
  10. package/dist/common/collection.js +43 -43
  11. package/dist/common/collection.js.map +1 -1
  12. package/dist/common/config.d.ts +2 -2
  13. package/dist/common/config.js.map +1 -1
  14. package/dist/common/errors/captcha-error.d.ts +15 -15
  15. package/dist/common/errors/captcha-error.js +7 -7
  16. package/dist/common/errors/captcha-error.js.map +1 -1
  17. package/dist/common/errors/intent-to-join.d.ts +16 -16
  18. package/dist/common/errors/intent-to-join.js +7 -7
  19. package/dist/common/errors/intent-to-join.js.map +1 -1
  20. package/dist/common/errors/join-meeting.d.ts +17 -17
  21. package/dist/common/errors/join-meeting.js +8 -8
  22. package/dist/common/errors/join-meeting.js.map +1 -1
  23. package/dist/common/errors/media.d.ts +15 -15
  24. package/dist/common/errors/media.js +7 -7
  25. package/dist/common/errors/media.js.map +1 -1
  26. package/dist/common/errors/parameter.d.ts +15 -15
  27. package/dist/common/errors/parameter.js +7 -7
  28. package/dist/common/errors/parameter.js.map +1 -1
  29. package/dist/common/errors/password-error.d.ts +15 -15
  30. package/dist/common/errors/password-error.js +7 -7
  31. package/dist/common/errors/password-error.js.map +1 -1
  32. package/dist/common/errors/permission.d.ts +14 -14
  33. package/dist/common/errors/permission.js +6 -6
  34. package/dist/common/errors/permission.js.map +1 -1
  35. package/dist/common/errors/reconnection-in-progress.d.ts +9 -9
  36. package/dist/common/errors/reconnection-in-progress.js +6 -6
  37. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  38. package/dist/common/errors/reconnection.d.ts +15 -15
  39. package/dist/common/errors/reconnection.js +7 -7
  40. package/dist/common/errors/reconnection.js.map +1 -1
  41. package/dist/common/errors/stats.d.ts +15 -15
  42. package/dist/common/errors/stats.js +7 -7
  43. package/dist/common/errors/stats.js.map +1 -1
  44. package/dist/common/errors/webex-errors.d.ts +81 -81
  45. package/dist/common/errors/webex-errors.js +42 -42
  46. package/dist/common/errors/webex-errors.js.map +1 -1
  47. package/dist/common/errors/webex-meetings-error.d.ts +20 -20
  48. package/dist/common/errors/webex-meetings-error.js +12 -12
  49. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  50. package/dist/common/events/events-scope.d.ts +17 -17
  51. package/dist/common/events/events-scope.js +10 -10
  52. package/dist/common/events/events-scope.js.map +1 -1
  53. package/dist/common/events/events.d.ts +12 -12
  54. package/dist/common/events/events.js +4 -4
  55. package/dist/common/events/events.js.map +1 -1
  56. package/dist/common/events/trigger-proxy.d.ts +2 -2
  57. package/dist/common/events/trigger-proxy.js.map +1 -1
  58. package/dist/common/events/util.d.ts +2 -2
  59. package/dist/common/events/util.js.map +1 -1
  60. package/dist/common/logs/logger-config.d.ts +2 -2
  61. package/dist/common/logs/logger-config.js.map +1 -1
  62. package/dist/common/logs/logger-proxy.d.ts +2 -2
  63. package/dist/common/logs/logger-proxy.js.map +1 -1
  64. package/dist/common/logs/request.d.ts +34 -34
  65. package/dist/common/logs/request.js +18 -18
  66. package/dist/common/logs/request.js.map +1 -1
  67. package/dist/common/queue.d.ts +32 -32
  68. package/dist/common/queue.js +18 -18
  69. package/dist/common/queue.js.map +1 -1
  70. package/dist/config.d.ts +73 -73
  71. package/dist/config.js.map +1 -1
  72. package/dist/constants.d.ts +924 -924
  73. package/dist/constants.js +9 -9
  74. package/dist/constants.js.map +1 -1
  75. package/dist/controls-options-manager/constants.d.ts +4 -4
  76. package/dist/controls-options-manager/constants.js.map +1 -1
  77. package/dist/controls-options-manager/enums.d.ts +5 -5
  78. package/dist/controls-options-manager/enums.js.map +1 -1
  79. package/dist/controls-options-manager/index.d.ts +120 -120
  80. package/dist/controls-options-manager/index.js +81 -81
  81. package/dist/controls-options-manager/index.js.map +1 -1
  82. package/dist/controls-options-manager/util.d.ts +7 -7
  83. package/dist/controls-options-manager/util.js.map +1 -1
  84. package/dist/index.d.ts +4 -4
  85. package/dist/index.js.map +1 -1
  86. package/dist/locus-info/controlsUtils.d.ts +2 -2
  87. package/dist/locus-info/controlsUtils.js +21 -21
  88. package/dist/locus-info/controlsUtils.js.map +1 -1
  89. package/dist/locus-info/embeddedAppsUtils.d.ts +2 -2
  90. package/dist/locus-info/embeddedAppsUtils.js +14 -14
  91. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  92. package/dist/locus-info/fullState.d.ts +2 -2
  93. package/dist/locus-info/fullState.js.map +1 -1
  94. package/dist/locus-info/hostUtils.d.ts +2 -2
  95. package/dist/locus-info/hostUtils.js +19 -19
  96. package/dist/locus-info/hostUtils.js.map +1 -1
  97. package/dist/locus-info/index.d.ts +269 -269
  98. package/dist/locus-info/index.js +180 -180
  99. package/dist/locus-info/index.js.map +1 -1
  100. package/dist/locus-info/infoUtils.d.ts +2 -2
  101. package/dist/locus-info/infoUtils.js.map +1 -1
  102. package/dist/locus-info/mediaSharesUtils.d.ts +2 -2
  103. package/dist/locus-info/mediaSharesUtils.js +50 -50
  104. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  105. package/dist/locus-info/parser.d.ts +212 -212
  106. package/dist/locus-info/parser.js +136 -136
  107. package/dist/locus-info/parser.js.map +1 -1
  108. package/dist/locus-info/selfUtils.d.ts +2 -2
  109. package/dist/locus-info/selfUtils.js +52 -52
  110. package/dist/locus-info/selfUtils.js.map +1 -1
  111. package/dist/media/index.d.ts +32 -32
  112. package/dist/media/index.js +145 -145
  113. package/dist/media/index.js.map +1 -1
  114. package/dist/media/properties.d.ts +108 -108
  115. package/dist/media/properties.js +49 -49
  116. package/dist/media/properties.js.map +1 -1
  117. package/dist/media/util.d.ts +2 -2
  118. package/dist/media/util.js.map +1 -1
  119. package/dist/mediaQualityMetrics/config.d.ts +233 -233
  120. package/dist/mediaQualityMetrics/config.js.map +1 -1
  121. package/dist/meeting/effectsState.d.ts +42 -42
  122. package/dist/meeting/effectsState.js +24 -24
  123. package/dist/meeting/effectsState.js.map +1 -1
  124. package/dist/meeting/in-meeting-actions.d.ts +79 -79
  125. package/dist/meeting/in-meeting-actions.js +11 -11
  126. package/dist/meeting/in-meeting-actions.js.map +1 -1
  127. package/dist/meeting/index.d.ts +1621 -1621
  128. package/dist/meeting/index.js +1502 -1505
  129. package/dist/meeting/index.js.map +1 -1
  130. package/dist/meeting/muteState.d.ts +116 -116
  131. package/dist/meeting/muteState.js +85 -85
  132. package/dist/meeting/muteState.js.map +1 -1
  133. package/dist/meeting/request.d.ts +255 -255
  134. package/dist/meeting/request.js +141 -141
  135. package/dist/meeting/request.js.map +1 -1
  136. package/dist/meeting/state.d.ts +9 -9
  137. package/dist/meeting/state.js +30 -30
  138. package/dist/meeting/state.js.map +1 -1
  139. package/dist/meeting/util.d.ts +2 -2
  140. package/dist/meeting/util.js.map +1 -1
  141. package/dist/meeting-info/collection.d.ts +20 -20
  142. package/dist/meeting-info/collection.js +11 -11
  143. package/dist/meeting-info/collection.js.map +1 -1
  144. package/dist/meeting-info/index.d.ts +57 -57
  145. package/dist/meeting-info/index.js +50 -50
  146. package/dist/meeting-info/index.js.map +1 -1
  147. package/dist/meeting-info/meeting-info-v2.d.ts +93 -93
  148. package/dist/meeting-info/meeting-info-v2.js +52 -52
  149. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  150. package/dist/meeting-info/request.d.ts +22 -22
  151. package/dist/meeting-info/request.js +14 -14
  152. package/dist/meeting-info/request.js.map +1 -1
  153. package/dist/meeting-info/util.d.ts +2 -2
  154. package/dist/meeting-info/util.js +9 -9
  155. package/dist/meeting-info/util.js.map +1 -1
  156. package/dist/meeting-info/utilv2.d.ts +2 -2
  157. package/dist/meeting-info/utilv2.js +20 -20
  158. package/dist/meeting-info/utilv2.js.map +1 -1
  159. package/dist/meetings/collection.d.ts +23 -23
  160. package/dist/meetings/collection.js +14 -14
  161. package/dist/meetings/collection.js.map +1 -1
  162. package/dist/meetings/index.d.ts +296 -296
  163. package/dist/meetings/index.js +259 -259
  164. package/dist/meetings/index.js.map +1 -1
  165. package/dist/meetings/request.d.ts +27 -27
  166. package/dist/meetings/request.js +15 -15
  167. package/dist/meetings/request.js.map +1 -1
  168. package/dist/meetings/util.d.ts +18 -18
  169. package/dist/meetings/util.js +29 -29
  170. package/dist/meetings/util.js.map +1 -1
  171. package/dist/member/index.d.ts +147 -147
  172. package/dist/member/index.js +214 -214
  173. package/dist/member/index.js.map +1 -1
  174. package/dist/member/member.types.d.ts +11 -11
  175. package/dist/member/member.types.js.map +1 -1
  176. package/dist/member/util.d.ts +2 -2
  177. package/dist/member/util.js +60 -60
  178. package/dist/member/util.js.map +1 -1
  179. package/dist/members/collection.d.ts +24 -24
  180. package/dist/members/collection.js +11 -11
  181. package/dist/members/collection.js.map +1 -1
  182. package/dist/members/index.d.ts +298 -298
  183. package/dist/members/index.js +275 -275
  184. package/dist/members/index.js.map +1 -1
  185. package/dist/members/request.d.ts +50 -50
  186. package/dist/members/request.js +27 -27
  187. package/dist/members/request.js.map +1 -1
  188. package/dist/members/util.d.ts +2 -2
  189. package/dist/members/util.js +21 -21
  190. package/dist/members/util.js.map +1 -1
  191. package/dist/metrics/config.d.ts +169 -169
  192. package/dist/metrics/config.js.map +1 -1
  193. package/dist/metrics/constants.d.ts +57 -57
  194. package/dist/metrics/constants.js.map +1 -1
  195. package/dist/metrics/index.d.ts +152 -152
  196. package/dist/metrics/index.js +90 -90
  197. package/dist/metrics/index.js.map +1 -1
  198. package/dist/networkQualityMonitor/index.d.ts +70 -70
  199. package/dist/networkQualityMonitor/index.js +65 -65
  200. package/dist/networkQualityMonitor/index.js.map +1 -1
  201. package/dist/peer-connection-manager/index.d.ts +6 -6
  202. package/dist/peer-connection-manager/index.js +87 -87
  203. package/dist/peer-connection-manager/index.js.map +1 -1
  204. package/dist/peer-connection-manager/util.d.ts +6 -6
  205. package/dist/peer-connection-manager/util.js +9 -9
  206. package/dist/peer-connection-manager/util.js.map +1 -1
  207. package/dist/personal-meeting-room/index.d.ts +47 -47
  208. package/dist/personal-meeting-room/index.js +67 -67
  209. package/dist/personal-meeting-room/index.js.map +1 -1
  210. package/dist/personal-meeting-room/request.d.ts +14 -14
  211. package/dist/personal-meeting-room/request.js +7 -7
  212. package/dist/personal-meeting-room/request.js.map +1 -1
  213. package/dist/personal-meeting-room/util.d.ts +2 -2
  214. package/dist/personal-meeting-room/util.js.map +1 -1
  215. package/dist/reachability/index.d.ts +139 -139
  216. package/dist/reachability/index.js +110 -110
  217. package/dist/reachability/index.js.map +1 -1
  218. package/dist/reachability/request.d.ts +35 -35
  219. package/dist/reachability/request.js +15 -15
  220. package/dist/reachability/request.js.map +1 -1
  221. package/dist/reactions/reactions.d.ts +4 -4
  222. package/dist/reactions/reactions.js.map +1 -1
  223. package/dist/reactions/reactions.type.d.ts +32 -32
  224. package/dist/reactions/reactions.type.js.map +1 -1
  225. package/dist/reconnection-manager/index.d.ts +112 -112
  226. package/dist/reconnection-manager/index.js +112 -112
  227. package/dist/reconnection-manager/index.js.map +1 -1
  228. package/dist/recording-controller/enums.d.ts +7 -7
  229. package/dist/recording-controller/enums.js.map +1 -1
  230. package/dist/recording-controller/index.d.ts +193 -193
  231. package/dist/recording-controller/index.js +127 -127
  232. package/dist/recording-controller/index.js.map +1 -1
  233. package/dist/recording-controller/util.d.ts +13 -13
  234. package/dist/recording-controller/util.js.map +1 -1
  235. package/dist/roap/collection.d.ts +10 -10
  236. package/dist/roap/collection.js.map +1 -1
  237. package/dist/roap/handler.d.ts +47 -47
  238. package/dist/roap/handler.js +27 -27
  239. package/dist/roap/handler.js.map +1 -1
  240. package/dist/roap/index.d.ts +116 -116
  241. package/dist/roap/index.js +111 -111
  242. package/dist/roap/index.js.map +1 -1
  243. package/dist/roap/request.d.ts +35 -35
  244. package/dist/roap/request.js +17 -17
  245. package/dist/roap/request.js.map +1 -1
  246. package/dist/roap/state.d.ts +9 -9
  247. package/dist/roap/state.js +14 -14
  248. package/dist/roap/state.js.map +1 -1
  249. package/dist/roap/turnDiscovery.d.ts +67 -67
  250. package/dist/roap/turnDiscovery.js +46 -46
  251. package/dist/roap/turnDiscovery.js.map +1 -1
  252. package/dist/roap/util.d.ts +2 -2
  253. package/dist/roap/util.js.map +1 -1
  254. package/dist/statsAnalyzer/global.d.ts +126 -116
  255. package/dist/statsAnalyzer/global.js +10 -0
  256. package/dist/statsAnalyzer/global.js.map +1 -1
  257. package/dist/statsAnalyzer/index.d.ts +190 -191
  258. package/dist/statsAnalyzer/index.js +137 -139
  259. package/dist/statsAnalyzer/index.js.map +1 -1
  260. package/dist/statsAnalyzer/mqaUtil.d.ts +22 -22
  261. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  262. package/dist/transcription/index.d.ts +64 -64
  263. package/dist/transcription/index.js +42 -42
  264. package/dist/transcription/index.js.map +1 -1
  265. package/internal-README.md +172 -172
  266. package/jest.config.js +3 -3
  267. package/package.json +22 -21
  268. package/process +1 -1
  269. package/src/common/browser-detection.ts +39 -39
  270. package/src/common/collection.ts +94 -94
  271. package/src/common/config.ts +9 -9
  272. package/src/common/errors/captcha-error.ts +25 -25
  273. package/src/common/errors/intent-to-join.ts +27 -27
  274. package/src/common/errors/join-meeting.ts +32 -32
  275. package/src/common/errors/media.ts +25 -25
  276. package/src/common/errors/parameter.ts +33 -33
  277. package/src/common/errors/password-error.ts +25 -25
  278. package/src/common/errors/permission.ts +24 -24
  279. package/src/common/errors/reconnection-in-progress.ts +8 -8
  280. package/src/common/errors/reconnection.ts +25 -25
  281. package/src/common/errors/stats.ts +25 -25
  282. package/src/common/errors/webex-errors.ts +140 -140
  283. package/src/common/errors/webex-meetings-error.ts +35 -35
  284. package/src/common/events/events-scope.ts +30 -30
  285. package/src/common/events/events.ts +25 -25
  286. package/src/common/events/trigger-proxy.ts +25 -25
  287. package/src/common/events/util.ts +39 -39
  288. package/src/common/logs/logger-config.ts +8 -8
  289. package/src/common/logs/logger-proxy.ts +44 -44
  290. package/src/common/logs/request.ts +65 -65
  291. package/src/common/queue.ts +50 -50
  292. package/src/config.ts +96 -96
  293. package/src/constants.ts +1121 -1121
  294. package/src/controls-options-manager/constants.ts +5 -5
  295. package/src/controls-options-manager/enums.ts +6 -6
  296. package/src/controls-options-manager/index.ts +183 -183
  297. package/src/controls-options-manager/util.ts +20 -20
  298. package/src/index.js +15 -15
  299. package/src/locus-info/controlsUtils.ts +112 -112
  300. package/src/locus-info/embeddedAppsUtils.ts +57 -57
  301. package/src/locus-info/fullState.ts +69 -69
  302. package/src/locus-info/hostUtils.ts +60 -60
  303. package/src/locus-info/index.ts +1303 -1303
  304. package/src/locus-info/infoUtils.ts +101 -101
  305. package/src/locus-info/mediaSharesUtils.ts +173 -173
  306. package/src/locus-info/parser.ts +680 -680
  307. package/src/locus-info/selfUtils.ts +428 -428
  308. package/src/media/index.ts +675 -675
  309. package/src/media/properties.ts +313 -313
  310. package/src/media/util.ts +37 -37
  311. package/src/mediaQualityMetrics/config.ts +382 -382
  312. package/src/meeting/effectsState.ts +209 -209
  313. package/src/meeting/in-meeting-actions.ts +153 -153
  314. package/src/meeting/index.ts +6537 -6543
  315. package/src/meeting/muteState.ts +365 -365
  316. package/src/meeting/request.ts +810 -810
  317. package/src/meeting/state.ts +194 -194
  318. package/src/meeting/util.ts +530 -530
  319. package/src/meeting-info/collection.ts +41 -41
  320. package/src/meeting-info/index.ts +137 -137
  321. package/src/meeting-info/meeting-info-v2.ts +273 -273
  322. package/src/meeting-info/request.ts +46 -46
  323. package/src/meeting-info/util.ts +314 -314
  324. package/src/meeting-info/utilv2.ts +324 -324
  325. package/src/meetings/collection.ts +43 -43
  326. package/src/meetings/index.ts +1128 -1128
  327. package/src/meetings/request.ts +81 -81
  328. package/src/meetings/util.ts +181 -181
  329. package/src/member/index.ts +446 -446
  330. package/src/member/member.types.ts +13 -13
  331. package/src/member/util.ts +286 -286
  332. package/src/members/collection.ts +40 -40
  333. package/src/members/index.ts +900 -900
  334. package/src/members/request.ts +175 -175
  335. package/src/members/util.ts +260 -260
  336. package/src/metrics/config.ts +485 -485
  337. package/src/metrics/constants.ts +61 -61
  338. package/src/metrics/index.ts +543 -543
  339. package/src/networkQualityMonitor/index.ts +211 -211
  340. package/src/peer-connection-manager/index.ts +847 -847
  341. package/src/peer-connection-manager/util.ts +119 -119
  342. package/src/personal-meeting-room/index.ts +157 -157
  343. package/src/personal-meeting-room/request.ts +48 -48
  344. package/src/personal-meeting-room/util.ts +49 -49
  345. package/src/reachability/index.ts +478 -478
  346. package/src/reachability/request.ts +81 -81
  347. package/src/reactions/reactions.ts +104 -104
  348. package/src/reactions/reactions.type.ts +36 -36
  349. package/src/reconnection-manager/index.ts +622 -622
  350. package/src/recording-controller/enums.ts +8 -8
  351. package/src/recording-controller/index.ts +315 -315
  352. package/src/recording-controller/util.ts +58 -58
  353. package/src/roap/collection.ts +62 -62
  354. package/src/roap/handler.ts +294 -294
  355. package/src/roap/index.ts +413 -413
  356. package/src/roap/request.ts +229 -229
  357. package/src/roap/state.ts +156 -156
  358. package/src/roap/turnDiscovery.ts +283 -283
  359. package/src/roap/util.ts +100 -100
  360. package/src/statsAnalyzer/global.ts +128 -118
  361. package/src/statsAnalyzer/index.ts +1266 -1265
  362. package/src/statsAnalyzer/mqaUtil.ts +290 -290
  363. package/src/transcription/index.ts +154 -154
  364. package/test/integration/spec/journey.js +941 -941
  365. package/test/integration/spec/space-meeting.js +457 -457
  366. package/test/integration/spec/transcription.js +55 -55
  367. package/test/unit/spec/common/browser-detection.js +119 -119
  368. package/test/unit/spec/common/queue.js +69 -69
  369. package/test/unit/spec/controls-options-manager/index.js +123 -123
  370. package/test/unit/spec/controls-options-manager/util.js +65 -65
  371. package/test/unit/spec/fixture/locus.js +406 -406
  372. package/test/unit/spec/locus-info/controlsUtils.js +82 -82
  373. package/test/unit/spec/locus-info/embeddedAppsUtils.js +104 -104
  374. package/test/unit/spec/locus-info/index.js +1272 -1272
  375. package/test/unit/spec/locus-info/infoUtils.js +138 -138
  376. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +975 -975
  377. package/test/unit/spec/locus-info/lib/SeqCmp.json +522 -522
  378. package/test/unit/spec/locus-info/lib/selfConstant.js +286 -286
  379. package/test/unit/spec/locus-info/parser.js +298 -298
  380. package/test/unit/spec/locus-info/selfUtils.js +185 -185
  381. package/test/unit/spec/media/properties.ts +305 -305
  382. package/test/unit/spec/meeting/effectsState.js +281 -281
  383. package/test/unit/spec/meeting/in-meeting-actions.ts +90 -90
  384. package/test/unit/spec/meeting/index.js +5227 -5227
  385. package/test/unit/spec/meeting/muteState.js +430 -430
  386. package/test/unit/spec/meeting/request.js +317 -317
  387. package/test/unit/spec/meeting/utils.js +319 -319
  388. package/test/unit/spec/meeting-info/meetinginfov2.js +376 -376
  389. package/test/unit/spec/meeting-info/request.js +64 -64
  390. package/test/unit/spec/meeting-info/util.js +37 -37
  391. package/test/unit/spec/meeting-info/utilv2.js +330 -330
  392. package/test/unit/spec/meetings/collection.js +52 -52
  393. package/test/unit/spec/meetings/index.js +1375 -1375
  394. package/test/unit/spec/meetings/utils.js +66 -66
  395. package/test/unit/spec/member/index.js +47 -47
  396. package/test/unit/spec/member/util.js +80 -80
  397. package/test/unit/spec/members/index.js +364 -364
  398. package/test/unit/spec/members/request.js +200 -200
  399. package/test/unit/spec/members/utils.js +42 -42
  400. package/test/unit/spec/metrics/index.js +111 -111
  401. package/test/unit/spec/networkQualityMonitor/index.js +99 -99
  402. package/test/unit/spec/peerconnection-manager/index.js +218 -218
  403. package/test/unit/spec/peerconnection-manager/utils.js +49 -49
  404. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +388 -388
  405. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +29 -29
  406. package/test/unit/spec/reachability/index.ts +50 -50
  407. package/test/unit/spec/reconnection-manager/index.js +206 -206
  408. package/test/unit/spec/recording-controller/index.js +230 -230
  409. package/test/unit/spec/recording-controller/util.js +101 -101
  410. package/test/unit/spec/roap/index.ts +128 -128
  411. package/test/unit/spec/roap/turnDiscovery.ts +372 -372
  412. package/test/unit/spec/roap/util.js +30 -30
  413. package/test/unit/spec/stats-analyzer/index.js +287 -355
  414. package/test/utils/cmr.js +104 -104
  415. package/test/utils/testUtils.js +287 -287
  416. package/test/utils/webex-config.js +77 -77
  417. package/test/utils/webex-test-users.js +82 -82
  418. package/tsconfig.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"names":["_window","_interopRequireDefault","require","_sdpTransform","_metrics","_loggerProxy","_config","_constants","_constants2","_config2","_media","_parameter","_webexErrors","_browserDetection","_util","_createForOfIteratorHelper","o","allowArrayLike","it","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","_Array$from","test","arr","len","arr2","Array","_BrowserDetection","BrowserDetection","isBrowser","pc","insertBandwidthLimit","sdpLines","index","limit","periodicKeyFrame","search","AUDIO","StaticConfig","meetings","bandwidth","audio","video","SDP","PERIODIC_KEYFRAME","splice","concat","B_LINE","setRemoteVideoConstraints","sdp","level","arguments","undefined","QUALITY_LEVELS","HIGH","maxFs","REMOTE_VIDEO_CONSTRAINTS","MAX_FS","ParameterError","modifiedSdp","PeerConnectionUtils","adjustH264Profile","setStartBitrateOnRemoteSdp","startBitrate","replace","checkH264Support","videoPresent","match","h264Present","isSdpInvalid","parsedSdp","sdpTransform","parse","_iterator","media","_step","_mediaLine$candidates","mediaLine","candidates","LoggerProxy","logger","error","BAD_MEDIA_PORTS","includes","port","icePwd","iceUfrag","limitBandwidth","offerSdp","split","CARRIAGE_RETURN","M_LINE","join","setContentSlides","screenPc","A_CONTENT_SLIDES","iceCandidate","peerConnection","_ref","remoteQualityLevel","_promise","default","resolve","reject","now","_now","doneGatheringIceCandidate","miliseconds","_parseInt2","Math","abs","localDescription","convertCLineToIpv4","invalidSdpPresent","InvalidSdpError","log","iceGatheringState","COMPLETE","onIceGatheringStateChange","GATHERING","onicecandidate","evt","candidate","_evt$candidate","_evt$candidate2","_evt$candidate3","_evt$candidate4","type","protocol","address","onicecandidateerror","event","replaceTrack","track","senders","getSenders","forEach","sender","kind","addStream","stream","tracksPresent","find","getTracks","addTrack","setRemoteSessionDetails","typeStr","remoteSdp","meetingId","signalingState","Metrics","postEvent","eventType","REMOTE_SDP_RECEIVED","data","canProceed","errors","generateErrorPayload","MEDIA_ENGINE","HAVE_LOCAL_OFFER","STABLE","OFFER","enableExtmap","setRemoteDescription","window","RTCSessionDescription","then","catch","metricName","BEHAVIORAL_METRICS","PEERCONNECTION_FAILURE","correlation_id","reason","message","stack","metadata","sendBehavioralMetric","MediaError","createOffer","_ref2","enableRtx","description","setLocalDescription","LOCAL_SDP_GENERATED","INVALID_ICE_CANDIDATE","code","close","rollBackLocalDescription","ROLLBACK","updatePeerConnection","params","_ref3","createAnswer","peerconnection","_ref4","HAVE_REMOTE_OFFER","sdpConstraints","answer","connectionState","PEER_CONNECTION_STATE","CLOSED","setPeerConnectionEvents","meeting","mediaProperties","connectionFailed","reconnectionManager","iceState","reconnect","networkDisconnect","ICE_END","uploadLogs","file","function","CONNECTION_FAILURE","correlationId","locus_id","locusId","oniceconnectionstatechange","info","iceConnectionState","ICE_STATE","CHECKING","ICE_START","COMPLETED","CONNECTED","CONNECTION_SUCCESS","setNetworkStatus","NETWORK_STATUS","iceReconnected","DISCONNECTED","waitForIceReconnect","FAILED","onconnectionstatechange","CONNECTION_STATE","NEW","CONNECTING","_default","exports"],"sources":["index.ts"],"sourcesContent":["// We need to figure out how to pass a webex logger instance to these util files\n\n/* globals RTCSessionDescription */\n\nimport window from 'global/window';\nimport sdpTransform from 'sdp-transform'; // https://github.com/clux/sdp-transform\n\nimport Metrics from '../metrics';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport StaticConfig from '../common/config';\nimport {\n COMPLETE,\n GATHERING,\n AUDIO,\n SDP,\n ICE_STATE,\n CONNECTION_STATE,\n NETWORK_STATUS,\n PEER_CONNECTION_STATE,\n OFFER,\n QUALITY_LEVELS,\n REMOTE_VIDEO_CONSTRAINTS,\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport {error, eventType} from '../metrics/config';\nimport MediaError from '../common/errors/media';\nimport ParameterError from '../common/errors/parameter';\nimport {InvalidSdpError} from '../common/errors/webex-errors';\nimport BrowserDetection from '../common/browser-detection';\n\nimport PeerConnectionUtils from './util';\n\nconst {isBrowser} = BrowserDetection();\n\n/**\n * @export\n * @public\n */\nconst pc: any = {};\n\n/**\n * munges the bandwidth limit into the sdp\n * @param {String} sdpLines\n * @param {Number} index\n * @returns {String}\n */\nconst insertBandwidthLimit = (sdpLines: any, index: number) => {\n // eslint-disable-next-line no-warning-comments\n // TODO convert to sdp parser\n let limit;\n let periodicKeyFrame = '';\n\n if (sdpLines[index].search(AUDIO) !== -1) {\n limit = StaticConfig.meetings.bandwidth.audio;\n } else {\n limit = StaticConfig.meetings.bandwidth.video;\n periodicKeyFrame = SDP.PERIODIC_KEYFRAME;\n sdpLines.splice(index + 2, 0, periodicKeyFrame);\n }\n sdpLines.splice(index + 1, 0, `${SDP.B_LINE}:${limit}`);\n\n return sdpLines;\n};\n\n/**\n * needed for calliope max-fs\n * @param {String} sdp\n * @param {String} [level=QUALITY_LEVELS.HIGH] quality level for max-fs\n * @returns {String}\n */\nconst setRemoteVideoConstraints = (sdp: string, level: string = QUALITY_LEVELS.HIGH) => {\n const maxFs = REMOTE_VIDEO_CONSTRAINTS.MAX_FS[level];\n\n if (!maxFs) {\n throw new ParameterError(\n `setRemoteVideoConstraints: unable to set max framesize, value for level \"${level}\" is not defined`\n );\n }\n\n const modifiedSdp = PeerConnectionUtils.adjustH264Profile(sdp, maxFs);\n\n return modifiedSdp;\n};\n\nconst setStartBitrateOnRemoteSdp = (sdp) => {\n if (StaticConfig.meetings.bandwidth.startBitrate) {\n sdp = sdp.replace(\n /(\\na=fmtp:(\\d+).*profile-level-id=.*)/gi,\n `$1;x-google-start-bitrate=${StaticConfig.meetings.bandwidth.startBitrate}`\n );\n }\n\n return sdp;\n};\n\n/**\n * checks that sdp has h264 codec in it\n * @param {String} sdp\n * @returns {boolean}\n */\nconst checkH264Support = (sdp: string) => {\n // eslint-disable-next-line no-warning-comments\n // TODO convert to sdp parser to read rtp.codec\n const videoPresent = sdp.match(/\\nm=video.*/g);\n const h264Present = sdp.match(/\\na=rtpmap:\\d+\\sH264.*/g);\n\n if (videoPresent) {\n return !!h264Present;\n }\n\n return true;\n};\n\n/**\n * validates the sdp, checks port, candidates, and ice info\n * @param {String} sdp\n * @returns {String}\n */\nconst isSdpInvalid = (sdp: string) => {\n const parsedSdp = sdpTransform.parse(sdp);\n\n for (const mediaLine of parsedSdp.media) {\n if (!mediaLine.candidates || mediaLine.candidates?.length === 0) {\n LoggerProxy.logger.error(\n 'PeerConnectionManager:index#isSdpInvalid --> iceCandidate: Ice candidate never completed'\n );\n\n return 'iceCandidate: Ice gathering never completed';\n }\n\n if (SDP.BAD_MEDIA_PORTS.includes(mediaLine.port)) {\n LoggerProxy.logger.error(\n 'PeerConnectionManager:index#isSdpInvalid --> iceCandidate: Found invalid port number for the ice candidate'\n );\n\n return 'iceCandidate: Found invalid port number for the ice candidate';\n }\n if (!mediaLine.icePwd || !mediaLine.iceUfrag) {\n LoggerProxy.logger.error(\n 'PeerConnectionManager:index#isSdpInvalid --> iceCandidate: ice ufrag and password not found'\n );\n\n return 'iceCandidate: ice ufrag and password not found';\n }\n }\n\n return '';\n};\n\n/**\n * munges the bandwidth into the sdp\n * @param {String} sdp\n * @returns {String}\n */\nconst limitBandwidth = (sdp: string) => {\n // TODO convert to sdp parser\n let offerSdp = sdp;\n let sdpLines = offerSdp.split(SDP.CARRIAGE_RETURN);\n\n for (let i = 0; i < sdpLines.length; i += 1) {\n if (sdpLines[i].search(SDP.M_LINE) !== -1) {\n sdpLines = insertBandwidthLimit(sdpLines, i);\n }\n }\n offerSdp = sdpLines.join(SDP.CARRIAGE_RETURN);\n\n return offerSdp;\n};\n\n/**\n * makes sure the screen pc sdp has content:slides for server\n * @param {RTCPeerConnection} screenPc\n * @returns {RTCPeerConnection}\n */\npc.setContentSlides = (screenPc: any) => {\n if (screenPc && screenPc.sdp) {\n screenPc.sdp += `${SDP.A_CONTENT_SLIDES}${SDP.CARRIAGE_RETURN}`;\n }\n\n return screenPc;\n};\n\n/**\n * handles ice trickling and establishes ICE connection onto peer connection object\n * @param {Object} peerConnection\n * @param {Object} options\n * @param {String} options.remoteQualityLevel\n * @returns {Promise.RTCPeerConnection}\n */\npc.iceCandidate = (\n peerConnection: any,\n {\n remoteQualityLevel,\n }: {\n remoteQualityLevel: string;\n }\n) =>\n new Promise<void>((resolve, reject) => {\n const now = Date.now();\n const doneGatheringIceCandidate = () => {\n // @ts-ignore\n const miliseconds = parseInt(Math.abs(Date.now() - now), 4);\n\n peerConnection.sdp = limitBandwidth(peerConnection.localDescription.sdp);\n peerConnection.sdp = PeerConnectionUtils.convertCLineToIpv4(peerConnection.sdp);\n peerConnection.sdp = setRemoteVideoConstraints(peerConnection.sdp, remoteQualityLevel);\n\n const invalidSdpPresent = isSdpInvalid(peerConnection.sdp);\n\n if (invalidSdpPresent) {\n LoggerProxy.logger.error(\n 'PeerConnectionManager:index#iceCandidate --> SDP not valid after waiting.'\n );\n reject(new InvalidSdpError(invalidSdpPresent));\n }\n LoggerProxy.logger.log(\n `PeerConnectionManager:index#iceCandidate --> Time to gather ice candidate ${miliseconds} miliseconds`\n );\n\n resolve();\n };\n\n // If ice has already been gathered\n if (peerConnection.iceGatheringState === COMPLETE) {\n doneGatheringIceCandidate();\n }\n\n peerConnection.onIceGatheringStateChange = () => {\n if (peerConnection.iceGatheringState === COMPLETE) {\n // @ts-ignore\n doneGatheringIceCandidate(peerConnection);\n }\n if (peerConnection.iceGatheringState === GATHERING) {\n LoggerProxy.logger.log(\n 'PeerConnectionManager:index#onIceGatheringStateChange --> Ice state changed to gathering'\n );\n }\n };\n\n peerConnection.onicecandidate = (evt) => {\n if (evt.candidate === null) {\n // @ts-ignore\n doneGatheringIceCandidate(peerConnection);\n } else {\n LoggerProxy.logger.log(\n `PeerConnectionManager:index#onicecandidate --> Candidate ${evt.candidate?.type} ${evt.candidate?.protocol} ${evt.candidate?.address}:${evt.candidate?.port}`\n );\n }\n };\n\n peerConnection.onicecandidateerror = (event) => {\n // we can often get ICE candidate errors (for example when failing to communicate with a TURN server)\n // they don't mean that the whole ICE connection will fail, so it's OK to ignore them\n LoggerProxy.logger.error(\n 'PeerConnectionManager:index#onicecandidateerror --> ignoring ice error:',\n event\n );\n };\n });\n\n/**\n * swapping tracks\n * @param {Object} peerConnection\n * @param {Object} track\n * @returns {undefined}\n */\npc.replaceTrack = (peerConnection: any, track: any) => {\n try {\n const senders = peerConnection.getSenders();\n\n if (senders.length > 0) {\n senders.forEach((sender) => {\n if (sender.track && sender.track.kind === track.kind) {\n sender.replaceTrack(track);\n }\n });\n }\n } catch (err) {\n LoggerProxy.logger.error(\n `PeerConnectionManager:index#replaceTrack --> Error replacing track, ${err}`\n );\n }\n};\n\n/**\n * adding streams to peerConnection\n * @param {Object} peerConnection\n * @param {Object} stream\n * @returns {undefined}\n */\npc.addStream = (peerConnection: any, stream: any) => {\n try {\n if (stream && !isBrowser('edge')) {\n const tracksPresent =\n peerConnection.getSenders &&\n peerConnection.getSenders().find((sender) => sender.track != null);\n\n if (tracksPresent) {\n stream.getTracks().forEach((track) => {\n pc.replaceTrack(peerConnection, track);\n });\n\n return;\n }\n stream.getTracks().forEach((track) => {\n peerConnection.addTrack(track, stream);\n });\n // // TODO : may come back disable addTracks for chrome they are moving back to addStream\n // // https://bugs.chromium.org/p/chromium/issues/detail?id=764414\n // // https://bugs.chromium.org/p/chromium/issues/detail?id=738918#c7\n // peerConnection.addStream(stream);\n } else if (isBrowser('edge')) {\n peerConnection.addStream(stream);\n }\n } catch (err) {\n LoggerProxy.logger.error(\n `PeerConnectionManager:index#addStream --> Error adding stream, error: ${error}`\n );\n }\n};\n\n/**\n * setting the remote description\n * @param {Object} peerConnection\n * @param {String} typeStr\n * @param {String} remoteSdp\n * @param {String} meetingId\n * @returns {undefined}\n */\npc.setRemoteSessionDetails = (\n peerConnection: any,\n typeStr: string,\n remoteSdp: string,\n meetingId: string\n) => {\n LoggerProxy.logger.log(\n `PeerConnectionManager:index#setRemoteSessionDetails --> Setting the remote description type: ${typeStr}State: ${peerConnection.signalingState}`\n );\n let sdp = remoteSdp;\n\n // making sure that the remoteDescription is only set when there is a answer for offer\n // or there is a offer from the server\n\n if (!sdp) {\n Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(2001, true, error.name.MEDIA_ENGINE, 'missing remoteSdp'),\n ],\n },\n });\n }\n if (\n peerConnection.signalingState === SDP.HAVE_LOCAL_OFFER ||\n (peerConnection.signalingState === SDP.STABLE && typeStr === SDP.OFFER)\n ) {\n sdp = setStartBitrateOnRemoteSdp(sdp);\n\n if (!peerConnection.enableExtmap) {\n sdp = sdp.replace(/\\na=extmap.*/g, '');\n }\n\n // remove any xtls candidates\n sdp = sdp.replace(/^a=candidate:.*xTLS.*\\r\\n/gim, '');\n\n return (\n peerConnection\n .setRemoteDescription(\n new window.RTCSessionDescription({\n type: typeStr,\n sdp,\n })\n )\n .then(() => {\n if (peerConnection.signalingState === SDP.STABLE) {\n Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId,\n });\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-shadow\n .catch((error) => {\n LoggerProxy.logger.error(\n `Peer-connection-manager:index#setRemoteDescription --> ${error} missing remotesdp`\n );\n\n const metricName = BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;\n const data = {\n correlation_id: meetingId,\n reason: error.message,\n stack: error.stack,\n };\n const metadata = {\n type: error.name,\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n\n return Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(\n 2001,\n true,\n error.name.MEDIA_ENGINE,\n 'missing remoteSdp'\n ),\n ],\n },\n });\n })\n );\n }\n\n return Promise.reject(new MediaError('PeerConnection in wrong state'));\n};\n\n/**\n * Create offer with a valid parameter\n * @param {Object} peerConnection\n * @param {Object} meetingProperties\n * @param {string} meetingProperties.meetingId\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\n * @param {string} meetingProperties.enableRtx\n * @param {string} meetingProperties.enableExtmap\n * @returns {RTCPeerConnection}\n */\npc.createOffer = (\n peerConnection: any,\n {\n meetingId,\n remoteQualityLevel,\n enableRtx,\n enableExtmap,\n }: {\n meetingId: string;\n remoteQualityLevel: string;\n enableRtx: string;\n enableExtmap: string;\n }\n) => {\n LoggerProxy.logger.log('PeerConnectionManager:index#createOffer --> creating a new offer');\n\n // saving the extMap State to use in setRemoteDescription\n\n peerConnection.enableExtmap = enableExtmap;\n\n return (\n peerConnection\n .createOffer()\n .then((description) => {\n // bug https://bugs.chromium.org/p/chromium/issues/detail?id=1020642\n // chrome currently generates RTX line irrespective of whether the server side supports it\n // we are removing apt as well because its associated with rtx line\n\n if (!enableRtx) {\n description.sdp = description.sdp.replace(/\\r\\na=rtpmap:\\d+ rtx\\/\\d+/g, '');\n description.sdp = description.sdp.replace(/\\r\\na=fmtp:\\d+ apt=\\d+/g, '');\n }\n\n return peerConnection.setLocalDescription(description);\n })\n .then(() => pc.iceCandidate(peerConnection, {remoteQualityLevel}))\n .then(() => {\n if (!checkH264Support(peerConnection.sdp)) {\n throw new MediaError(\n 'openH264 is downloading please Wait. Upload logs if not working on second try'\n );\n }\n\n if (!enableExtmap) {\n peerConnection.sdp = peerConnection.sdp.replace(/\\na=extmap.*/g, '');\n }\n\n pc.setContentSlides(peerConnection);\n\n Metrics.postEvent({\n event: eventType.LOCAL_SDP_GENERATED,\n meetingId,\n });\n\n return peerConnection;\n })\n // eslint-disable-next-line @typescript-eslint/no-shadow\n .catch((error) => {\n LoggerProxy.logger.error(`Peer-connection-manager:index#createOffer --> ${error}`);\n if (error instanceof InvalidSdpError) {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.INVALID_ICE_CANDIDATE, {\n correlation_id: meetingId,\n code: error.code,\n reason: error.message,\n });\n } else {\n const metricName = BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;\n const data = {\n correlation_id: meetingId,\n reason: error.message,\n stack: error.stack,\n };\n const metadata = {\n type: error.name,\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n }\n\n Metrics.postEvent({\n event: eventType.LOCAL_SDP_GENERATED,\n meetingId,\n data: {\n canProceed: false,\n errors: [\n // @ts-ignore\n Metrics.generateErrorPayload(2001, true, error.name.MEDIA_ENGINE),\n ],\n },\n });\n pc.close(peerConnection);\n throw error;\n })\n );\n};\n\n/**\n * rollBack local description in peerconnection\n * @param {Object} peerConnection\n * @returns {Promise.RTCPeerConnection}\n */\npc.rollBackLocalDescription = (peerConnection: any) =>\n peerConnection\n // @ts-ignore\n .setLocalDescription(new RTCSessionDescription({type: SDP.ROLLBACK}))\n .then(() => peerConnection)\n .catch((err) => {\n LoggerProxy.logger.error(`Peer-connection-manager:index#setLocalDescription --> ${err} `);\n\n // @ts-ignore\n return Promise.error(err);\n });\n\n/**\n * @param {Object} params {\n * @param {Boolean} params.offerToReceiveAudio\n * @param {Boolean} params.offerToReceiveVideo\n * @param {string} params.offerSdp\n * @param {MediaStream} params.stream\n * @param {Object} meetingProperties\n * @param {string} meetingProperties.meetingId\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\n * @returns {Promise.<Array>} [MediaSDP, ScreenSDP]\n */\npc.updatePeerConnection = (\n params: {\n offerToReceiveAudio: boolean;\n offerToReceiveVideo: boolean;\n offerSdp: string;\n stream: MediaStream;\n peerConnection: any;\n },\n {\n meetingId,\n remoteQualityLevel,\n }: {\n meetingId: string;\n remoteQualityLevel: string;\n }\n) => {\n LoggerProxy.logger.log(\n `PeerConnectionManager:index#updatePeerConnection --> updating the peerConnection with params: ${params}`\n );\n\n const {peerConnection, offerSdp} = params;\n\n return pc\n .createAnswer(\n {\n peerConnection,\n offerSdp: offerSdp[0],\n },\n {meetingId, remoteQualityLevel}\n )\n .then((peerconnection) => {\n // The content slides should also be set when we are sending inactive\n pc.setContentSlides(peerconnection);\n\n return Promise.resolve([peerconnection.sdp]);\n });\n};\n\n/**\n * @param {Object} params\n * @param {Object} params.peerConnection\n * @param {Object} params.sdpConstraints\n * @param {Object} meetingProperties\n * @param {string} meetingProperties.meetingId\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\n * @returns {RTCPeerConnection} peerConnection\n */\npc.createAnswer = (\n params: {\n peerConnection: any;\n sdpConstraints: object;\n offerSdp: any;\n },\n {\n meetingId,\n remoteQualityLevel,\n }: {\n meetingId: string;\n remoteQualityLevel: string;\n }\n) => {\n const {peerConnection} = params;\n\n // TODO: Some times to many mercury event comes at the same time\n // Need to maintain state of peerconnection\n if (peerConnection.signalingState === SDP.HAVE_REMOTE_OFFER) {\n return Promise.resolve(peerConnection);\n }\n\n return (\n pc\n .setRemoteSessionDetails(peerConnection, OFFER, params.offerSdp, meetingId)\n .then(() => peerConnection.createAnswer(params.sdpConstraints))\n .then((answer) => peerConnection.setLocalDescription(answer))\n .then(() => pc.iceCandidate(peerConnection, {remoteQualityLevel}))\n .then(() => {\n peerConnection.sdp = limitBandwidth(peerConnection.localDescription.sdp);\n peerConnection.sdp = PeerConnectionUtils.convertCLineToIpv4(peerConnection.sdp);\n peerConnection.sdp = setRemoteVideoConstraints(peerConnection.sdp, remoteQualityLevel);\n\n if (!checkH264Support(peerConnection.sdp)) {\n throw new MediaError(\n 'openH264 is downloading please Wait. Upload logs if not working on second try'\n );\n }\n\n return peerConnection;\n })\n // eslint-disable-next-line @typescript-eslint/no-shadow\n .catch((error) => {\n if (error instanceof InvalidSdpError) {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.INVALID_ICE_CANDIDATE, {\n correlation_id: meetingId,\n });\n } else {\n const metricName = BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;\n const data = {\n correlation_id: meetingId,\n reason: error.message,\n stack: error.stack,\n };\n const metadata = {\n type: error.name,\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n }\n\n LoggerProxy.logger.error(\n `PeerConnectionManager:index#setRemoteSessionDetails --> Error creating remote session, error: ${error}`\n );\n })\n );\n};\n\n/**\n * shut down the peer connection\n * @param {Object} peerConnection\n * @returns {undefined}\n */\npc.close = (peerConnection: any) => {\n // peerConnection.close() fails on firefox on network changes and gives a Dom exception\n // To avoid this we have added a try catch block.\n // Please refer to https://bugzilla.mozilla.org/show_bug.cgi?id=1274407 for more information\n LoggerProxy.logger.log(\n 'PeerConnectionManager:index#close --> pc: close() -> attempting to close the peer connection'\n );\n\n if (peerConnection && peerConnection.connectionState === PEER_CONNECTION_STATE.CLOSED) {\n LoggerProxy.logger.log(\n 'PeerConnectionManager:index#close --> pc: close() -> connection already closed'\n );\n\n return Promise.resolve();\n }\n LoggerProxy.logger.log(\n 'PeerConnectionManager:index#close --> pc: close() -> closing the mediaPeerConnection'\n );\n\n return Promise.resolve().then(() => {\n if (peerConnection && peerConnection.close) {\n peerConnection.close();\n }\n });\n};\n\npc.setPeerConnectionEvents = (meeting) => {\n // In case ICE fail\n const {peerConnection} = meeting.mediaProperties;\n\n const connectionFailed = () => {\n if (meeting.reconnectionManager.iceState.resolve) {\n // DISCONNECTED state triggers first then it goes to FAILED STATE\n // sometimes the failed state can happen before 10 seconds (Which is the timer for the reconnect for ice disconnect)\n meeting.reconnectionManager.iceState.resolve();\n }\n\n meeting.reconnect({networkDisconnect: true});\n Metrics.postEvent({\n event: eventType.ICE_END,\n meeting,\n data: {\n canProceed: false,\n errors: [\n // @ts-ignore\n Metrics.generateErrorPayload(2004, false, error.name.MEDIA_ENGINE),\n ],\n },\n });\n\n meeting.uploadLogs({\n file: 'peer-connection-manager/index',\n function: 'connectionFailed',\n });\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.CONNECTION_FAILURE, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusId,\n });\n };\n\n peerConnection.oniceconnectionstatechange = () => {\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CHANGE.'\n );\n switch (peerConnection.iceConnectionState) {\n case ICE_STATE.CHECKING:\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CHECKING.'\n );\n Metrics.postEvent({event: eventType.ICE_START, meeting});\n break;\n case ICE_STATE.COMPLETED:\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE COMPLETED.'\n );\n break;\n case ICE_STATE.CONNECTED:\n // Ice connection state goes to connected when both client and server sends STUN packets and\n // Established connected between them. Firefox does not trigger COMPLETED and only trigger CONNECTED\n Metrics.postEvent({event: eventType.ICE_END, meeting});\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.CONNECTION_SUCCESS, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusId,\n });\n meeting.setNetworkStatus(NETWORK_STATUS.CONNECTED);\n meeting.reconnectionManager.iceReconnected();\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CONNECTED.'\n );\n break;\n case ICE_STATE.CLOSED:\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CLOSED.'\n );\n break;\n case ICE_STATE.DISCONNECTED:\n meeting.setNetworkStatus(NETWORK_STATUS.DISCONNECTED);\n meeting.reconnectionManager.waitForIceReconnect().catch(() => {\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE DISCONNECTED. Automatic Reconnection Timed Out.'\n );\n\n connectionFailed();\n });\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE DISCONNECTED.'\n );\n break;\n case ICE_STATE.FAILED:\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE FAILED.'\n );\n // notify of ice failure\n // Ice failure is the only indicator currently for identifying the actual connection drop\n // Firefox takes sometime 10-15 seconds to go to failed state\n connectionFailed();\n break;\n default:\n break;\n }\n };\n\n peerConnection.onconnectionstatechange = () => {\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CHANGE.'\n );\n switch (peerConnection.connectionState) {\n case CONNECTION_STATE.NEW:\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE NEW.'\n );\n break;\n case CONNECTION_STATE.CONNECTING:\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CONNECTING.'\n );\n break;\n case CONNECTION_STATE.CONNECTED:\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CONNECTED.'\n );\n break;\n case CONNECTION_STATE.CLOSED:\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CLOSED.'\n );\n break;\n case CONNECTION_STATE.DISCONNECTED:\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE DISCONNECTED.'\n );\n break;\n case CONNECTION_STATE.FAILED:\n LoggerProxy.logger.info(\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE FAILED.'\n );\n // Special case happens only on chrome where there is no ICE FAILED event\n // only CONNECTION FAILED event gets triggered\n\n connectionFailed();\n break;\n default:\n break;\n }\n };\n};\n\nexport default pc;\n"],"mappings":";;;;;;;;;;;;;;;AAIA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,QAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,YAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,OAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,UAAA,GAAAL,OAAA;AAaA,IAAAM,WAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,QAAA,GAAAP,OAAA;AACA,IAAAQ,MAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,UAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,YAAA,GAAAV,OAAA;AACA,IAAAW,iBAAA,GAAAZ,sBAAA,CAAAC,OAAA;AAEA,IAAAY,KAAA,GAAAb,sBAAA,CAAAC,OAAA;AAAyC,SAAAa,2BAAAC,CAAA,EAAAC,cAAA,QAAAC,EAAA,UAAAC,OAAA,oBAAAH,CAAA,CAAAI,gBAAA,KAAAJ,CAAA,qBAAAE,EAAA,QAAAG,cAAA,CAAAL,CAAA,MAAAE,EAAA,GAAAI,2BAAA,CAAAN,CAAA,MAAAC,cAAA,IAAAD,CAAA,WAAAA,CAAA,CAAAO,MAAA,qBAAAL,EAAA,EAAAF,CAAA,GAAAE,EAAA,MAAAM,CAAA,UAAAC,CAAA,YAAAA,EAAA,eAAAC,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAA,EAAA,QAAAH,CAAA,IAAAR,CAAA,CAAAO,MAAA,WAAAK,IAAA,mBAAAA,IAAA,SAAAC,KAAA,EAAAb,CAAA,CAAAQ,CAAA,UAAAM,CAAA,WAAAA,EAAAC,EAAA,UAAAA,EAAA,KAAAC,CAAA,EAAAP,CAAA,gBAAAQ,SAAA,iJAAAC,gBAAA,SAAAC,MAAA,UAAAC,GAAA,WAAAV,CAAA,WAAAA,EAAA,IAAAR,EAAA,GAAAA,EAAA,CAAAmB,IAAA,CAAArB,CAAA,MAAAW,CAAA,WAAAA,EAAA,QAAAW,IAAA,GAAApB,EAAA,CAAAqB,IAAA,IAAAL,gBAAA,GAAAI,IAAA,CAAAV,IAAA,SAAAU,IAAA,KAAAR,CAAA,WAAAA,EAAAU,GAAA,IAAAL,MAAA,SAAAC,GAAA,GAAAI,GAAA,KAAAR,CAAA,WAAAA,EAAA,eAAAE,gBAAA,IAAAhB,EAAA,CAAAuB,MAAA,UAAAvB,EAAA,CAAAuB,MAAA,oBAAAN,MAAA,QAAAC,GAAA;AAAA,SAAAd,4BAAAN,CAAA,EAAA0B,MAAA,SAAA1B,CAAA,qBAAAA,CAAA,sBAAA2B,iBAAA,CAAA3B,CAAA,EAAA0B,MAAA,OAAAf,CAAA,GAAAiB,MAAA,CAAAC,SAAA,CAAAC,QAAA,CAAAT,IAAA,CAAArB,CAAA,EAAA+B,KAAA,aAAApB,CAAA,iBAAAX,CAAA,CAAAgC,WAAA,EAAArB,CAAA,GAAAX,CAAA,CAAAgC,WAAA,CAAAC,IAAA,MAAAtB,CAAA,cAAAA,CAAA,mBAAAuB,WAAA,CAAAlC,CAAA,OAAAW,CAAA,+DAAAwB,IAAA,CAAAxB,CAAA,UAAAgB,iBAAA,CAAA3B,CAAA,EAAA0B,MAAA;AAAA,SAAAC,kBAAAS,GAAA,EAAAC,GAAA,QAAAA,GAAA,YAAAA,GAAA,GAAAD,GAAA,CAAA7B,MAAA,EAAA8B,GAAA,GAAAD,GAAA,CAAA7B,MAAA,WAAAC,CAAA,MAAA8B,IAAA,OAAAC,KAAA,CAAAF,GAAA,GAAA7B,CAAA,GAAA6B,GAAA,EAAA7B,CAAA,IAAA8B,IAAA,CAAA9B,CAAA,IAAA4B,GAAA,CAAA5B,CAAA,UAAA8B,IAAA;AAEzC,IAAAE,iBAAA,GAAoB,IAAAC,yBAAgB,GAAE;EAA/BC,SAAS,GAAAF,iBAAA,CAATE,SAAS;;AAEhB;AACA;AACA;AACA;AACA,IAAMC,EAAO,GAAG,CAAC,CAAC;;AAElB;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,oBAAoB,GAAG,SAAvBA,oBAAoBA,CAAIC,QAAa,EAAEC,KAAa,EAAK;EAC7D;EACA;EACA,IAAIC,KAAK;EACT,IAAIC,gBAAgB,GAAG,EAAE;EAEzB,IAAIH,QAAQ,CAACC,KAAK,CAAC,CAACG,MAAM,CAACC,gBAAK,CAAC,KAAK,CAAC,CAAC,EAAE;IACxCH,KAAK,GAAGI,eAAY,CAACC,QAAQ,CAACC,SAAS,CAACC,KAAK;EAC/C,CAAC,MAAM;IACLP,KAAK,GAAGI,eAAY,CAACC,QAAQ,CAACC,SAAS,CAACE,KAAK;IAC7CP,gBAAgB,GAAGQ,cAAG,CAACC,iBAAiB;IACxCZ,QAAQ,CAACa,MAAM,CAACZ,KAAK,GAAG,CAAC,EAAE,CAAC,EAAEE,gBAAgB,CAAC;EACjD;EACAH,QAAQ,CAACa,MAAM,CAACZ,KAAK,GAAG,CAAC,EAAE,CAAC,KAAAa,MAAA,CAAKH,cAAG,CAACI,MAAM,OAAAD,MAAA,CAAIZ,KAAK,EAAG;EAEvD,OAAOF,QAAQ;AACjB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,IAAMgB,yBAAyB,GAAG,SAA5BA,yBAAyBA,CAAIC,GAAW,EAA0C;EAAA,IAAxCC,KAAa,GAAAC,SAAA,CAAAzD,MAAA,QAAAyD,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAGE,yBAAc,CAACC,IAAI;EACjF,IAAMC,KAAK,GAAGC,mCAAwB,CAACC,MAAM,CAACP,KAAK,CAAC;EAEpD,IAAI,CAACK,KAAK,EAAE;IACV,MAAM,IAAIG,kBAAc,8EAAAZ,MAAA,CACsDI,KAAK,uBAClF;EACH;EAEA,IAAMS,WAAW,GAAGC,aAAmB,CAACC,iBAAiB,CAACZ,GAAG,EAAEM,KAAK,CAAC;EAErE,OAAOI,WAAW;AACpB,CAAC;AAED,IAAMG,0BAA0B,GAAG,SAA7BA,0BAA0BA,CAAIb,GAAG,EAAK;EAC1C,IAAIX,eAAY,CAACC,QAAQ,CAACC,SAAS,CAACuB,YAAY,EAAE;IAChDd,GAAG,GAAGA,GAAG,CAACe,OAAO,CACf,yCAAyC,+BAAAlB,MAAA,CACZR,eAAY,CAACC,QAAQ,CAACC,SAAS,CAACuB,YAAY,EAC1E;EACH;EAEA,OAAOd,GAAG;AACZ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,IAAMgB,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAIhB,GAAW,EAAK;EACxC;EACA;EACA,IAAMiB,YAAY,GAAGjB,GAAG,CAACkB,KAAK,CAAC,cAAc,CAAC;EAC9C,IAAMC,WAAW,GAAGnB,GAAG,CAACkB,KAAK,CAAC,yBAAyB,CAAC;EAExD,IAAID,YAAY,EAAE;IAChB,OAAO,CAAC,CAACE,WAAW;EACtB;EAEA,OAAO,IAAI;AACb,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,IAAMC,YAAY,GAAG,SAAfA,YAAYA,CAAIpB,GAAW,EAAK;EACpC,IAAMqB,SAAS,GAAGC,qBAAY,CAACC,KAAK,CAACvB,GAAG,CAAC;EAAC,IAAAwB,SAAA,GAAAvF,0BAAA,CAElBoF,SAAS,CAACI,KAAK;IAAAC,KAAA;EAAA;IAAvC,KAAAF,SAAA,CAAA5E,CAAA,MAAA8E,KAAA,GAAAF,SAAA,CAAA3E,CAAA,IAAAC,IAAA,GAAyC;MAAA,IAAA6E,qBAAA;MAAA,IAA9BC,SAAS,GAAAF,KAAA,CAAA3E,KAAA;MAClB,IAAI,CAAC6E,SAAS,CAACC,UAAU,IAAI,EAAAF,qBAAA,GAAAC,SAAS,CAACC,UAAU,cAAAF,qBAAA,uBAApBA,qBAAA,CAAsBlF,MAAM,MAAK,CAAC,EAAE;QAC/DqF,oBAAW,CAACC,MAAM,CAACC,KAAK,CACtB,0FAA0F,CAC3F;QAED,OAAO,6CAA6C;MACtD;MAEA,IAAItC,cAAG,CAACuC,eAAe,CAACC,QAAQ,CAACN,SAAS,CAACO,IAAI,CAAC,EAAE;QAChDL,oBAAW,CAACC,MAAM,CAACC,KAAK,CACtB,4GAA4G,CAC7G;QAED,OAAO,+DAA+D;MACxE;MACA,IAAI,CAACJ,SAAS,CAACQ,MAAM,IAAI,CAACR,SAAS,CAACS,QAAQ,EAAE;QAC5CP,oBAAW,CAACC,MAAM,CAACC,KAAK,CACtB,6FAA6F,CAC9F;QAED,OAAO,gDAAgD;MACzD;IACF;EAAC,SAAA1E,GAAA;IAAAkE,SAAA,CAAAxE,CAAA,CAAAM,GAAA;EAAA;IAAAkE,SAAA,CAAAtE,CAAA;EAAA;EAED,OAAO,EAAE;AACX,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,IAAMoF,cAAc,GAAG,SAAjBA,cAAcA,CAAItC,GAAW,EAAK;EACtC;EACA,IAAIuC,QAAQ,GAAGvC,GAAG;EAClB,IAAIjB,QAAQ,GAAGwD,QAAQ,CAACC,KAAK,CAAC9C,cAAG,CAAC+C,eAAe,CAAC;EAElD,KAAK,IAAI/F,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGqC,QAAQ,CAACtC,MAAM,EAAEC,CAAC,IAAI,CAAC,EAAE;IAC3C,IAAIqC,QAAQ,CAACrC,CAAC,CAAC,CAACyC,MAAM,CAACO,cAAG,CAACgD,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;MACzC3D,QAAQ,GAAGD,oBAAoB,CAACC,QAAQ,EAAErC,CAAC,CAAC;IAC9C;EACF;EACA6F,QAAQ,GAAGxD,QAAQ,CAAC4D,IAAI,CAACjD,cAAG,CAAC+C,eAAe,CAAC;EAE7C,OAAOF,QAAQ;AACjB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA1D,EAAE,CAAC+D,gBAAgB,GAAG,UAACC,QAAa,EAAK;EACvC,IAAIA,QAAQ,IAAIA,QAAQ,CAAC7C,GAAG,EAAE;IAC5B6C,QAAQ,CAAC7C,GAAG,OAAAH,MAAA,CAAOH,cAAG,CAACoD,gBAAgB,EAAAjD,MAAA,CAAGH,cAAG,CAAC+C,eAAe,CAAE;EACjE;EAEA,OAAOI,QAAQ;AACjB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACAhE,EAAE,CAACkE,YAAY,GAAG,UAChBC,cAAmB,EAAAC,IAAA;EAAA,IAEjBC,kBAAkB,GAAAD,IAAA,CAAlBC,kBAAkB;EAAA,OAKpB,IAAAC,QAAA,CAAAC,OAAA,CAAkB,UAACC,OAAO,EAAEC,MAAM,EAAK;IACrC,IAAMC,GAAG,GAAG,IAAAC,IAAA,CAAAJ,OAAA,GAAU;IACtB,IAAMK,yBAAyB,GAAG,SAA5BA,yBAAyBA,CAAA,EAAS;MACtC;MACA,IAAMC,WAAW,GAAG,IAAAC,UAAA,CAAAP,OAAA,EAASQ,IAAI,CAACC,GAAG,CAAC,IAAAL,IAAA,CAAAJ,OAAA,GAAU,GAAGG,GAAG,CAAC,EAAE,CAAC,CAAC;MAE3DP,cAAc,CAAChD,GAAG,GAAGsC,cAAc,CAACU,cAAc,CAACc,gBAAgB,CAAC9D,GAAG,CAAC;MACxEgD,cAAc,CAAChD,GAAG,GAAGW,aAAmB,CAACoD,kBAAkB,CAACf,cAAc,CAAChD,GAAG,CAAC;MAC/EgD,cAAc,CAAChD,GAAG,GAAGD,yBAAyB,CAACiD,cAAc,CAAChD,GAAG,EAAEkD,kBAAkB,CAAC;MAEtF,IAAMc,iBAAiB,GAAG5C,YAAY,CAAC4B,cAAc,CAAChD,GAAG,CAAC;MAE1D,IAAIgE,iBAAiB,EAAE;QACrBlC,oBAAW,CAACC,MAAM,CAACC,KAAK,CACtB,2EAA2E,CAC5E;QACDsB,MAAM,CAAC,IAAIW,4BAAe,CAACD,iBAAiB,CAAC,CAAC;MAChD;MACAlC,oBAAW,CAACC,MAAM,CAACmC,GAAG,8EAAArE,MAAA,CACyD6D,WAAW,kBACzF;MAEDL,OAAO,EAAE;IACX,CAAC;;IAED;IACA,IAAIL,cAAc,CAACmB,iBAAiB,KAAKC,mBAAQ,EAAE;MACjDX,yBAAyB,EAAE;IAC7B;IAEAT,cAAc,CAACqB,yBAAyB,GAAG,YAAM;MAC/C,IAAIrB,cAAc,CAACmB,iBAAiB,KAAKC,mBAAQ,EAAE;QACjD;QACAX,yBAAyB,CAACT,cAAc,CAAC;MAC3C;MACA,IAAIA,cAAc,CAACmB,iBAAiB,KAAKG,oBAAS,EAAE;QAClDxC,oBAAW,CAACC,MAAM,CAACmC,GAAG,CACpB,0FAA0F,CAC3F;MACH;IACF,CAAC;IAEDlB,cAAc,CAACuB,cAAc,GAAG,UAACC,GAAG,EAAK;MACvC,IAAIA,GAAG,CAACC,SAAS,KAAK,IAAI,EAAE;QAC1B;QACAhB,yBAAyB,CAACT,cAAc,CAAC;MAC3C,CAAC,MAAM;QAAA,IAAA0B,cAAA,EAAAC,eAAA,EAAAC,eAAA,EAAAC,eAAA;QACL/C,oBAAW,CAACC,MAAM,CAACmC,GAAG,6DAAArE,MAAA,EAAA6E,cAAA,GACwCF,GAAG,CAACC,SAAS,cAAAC,cAAA,uBAAbA,cAAA,CAAeI,IAAI,OAAAjF,MAAA,EAAA8E,eAAA,GAAIH,GAAG,CAACC,SAAS,cAAAE,eAAA,uBAAbA,eAAA,CAAeI,QAAQ,OAAAlF,MAAA,EAAA+E,eAAA,GAAIJ,GAAG,CAACC,SAAS,cAAAG,eAAA,uBAAbA,eAAA,CAAeI,OAAO,OAAAnF,MAAA,EAAAgF,eAAA,GAAIL,GAAG,CAACC,SAAS,cAAAI,eAAA,uBAAbA,eAAA,CAAe1C,IAAI,EAC5J;MACH;IACF,CAAC;IAEDa,cAAc,CAACiC,mBAAmB,GAAG,UAACC,KAAK,EAAK;MAC9C;MACA;MACApD,oBAAW,CAACC,MAAM,CAACC,KAAK,CACtB,yEAAyE,EACzEkD,KAAK,CACN;IACH,CAAC;EACH,CAAC,CAAC;AAAA;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACArG,EAAE,CAACsG,YAAY,GAAG,UAACnC,cAAmB,EAAEoC,KAAU,EAAK;EACrD,IAAI;IACF,IAAMC,OAAO,GAAGrC,cAAc,CAACsC,UAAU,EAAE;IAE3C,IAAID,OAAO,CAAC5I,MAAM,GAAG,CAAC,EAAE;MACtB4I,OAAO,CAACE,OAAO,CAAC,UAACC,MAAM,EAAK;QAC1B,IAAIA,MAAM,CAACJ,KAAK,IAAII,MAAM,CAACJ,KAAK,CAACK,IAAI,KAAKL,KAAK,CAACK,IAAI,EAAE;UACpDD,MAAM,CAACL,YAAY,CAACC,KAAK,CAAC;QAC5B;MACF,CAAC,CAAC;IACJ;EACF,CAAC,CAAC,OAAO9H,GAAG,EAAE;IACZwE,oBAAW,CAACC,MAAM,CAACC,KAAK,wEAAAnC,MAAA,CACiDvC,GAAG,EAC3E;EACH;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACAuB,EAAE,CAAC6G,SAAS,GAAG,UAAC1C,cAAmB,EAAE2C,MAAW,EAAK;EACnD,IAAI;IACF,IAAIA,MAAM,IAAI,CAAC/G,SAAS,CAAC,MAAM,CAAC,EAAE;MAChC,IAAMgH,aAAa,GACjB5C,cAAc,CAACsC,UAAU,IACzBtC,cAAc,CAACsC,UAAU,EAAE,CAACO,IAAI,CAAC,UAACL,MAAM;QAAA,OAAKA,MAAM,CAACJ,KAAK,IAAI,IAAI;MAAA,EAAC;MAEpE,IAAIQ,aAAa,EAAE;QACjBD,MAAM,CAACG,SAAS,EAAE,CAACP,OAAO,CAAC,UAACH,KAAK,EAAK;UACpCvG,EAAE,CAACsG,YAAY,CAACnC,cAAc,EAAEoC,KAAK,CAAC;QACxC,CAAC,CAAC;QAEF;MACF;MACAO,MAAM,CAACG,SAAS,EAAE,CAACP,OAAO,CAAC,UAACH,KAAK,EAAK;QACpCpC,cAAc,CAAC+C,QAAQ,CAACX,KAAK,EAAEO,MAAM,CAAC;MACxC,CAAC,CAAC;MACF;MACA;MACA;MACA;IACF,CAAC,MAAM,IAAI/G,SAAS,CAAC,MAAM,CAAC,EAAE;MAC5BoE,cAAc,CAAC0C,SAAS,CAACC,MAAM,CAAC;IAClC;EACF,CAAC,CAAC,OAAOrI,GAAG,EAAE;IACZwE,oBAAW,CAACC,MAAM,CAACC,KAAK,0EAAAnC,MAAA,CACmDmC,cAAK,EAC/E;EACH;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAnD,EAAE,CAACmH,uBAAuB,GAAG,UAC3BhD,cAAmB,EACnBiD,OAAe,EACfC,SAAiB,EACjBC,SAAiB,EACd;EACHrE,oBAAW,CAACC,MAAM,CAACmC,GAAG,iGAAArE,MAAA,CAC4EoG,OAAO,aAAApG,MAAA,CAAUmD,cAAc,CAACoD,cAAc,EAC/I;EACD,IAAIpG,GAAG,GAAGkG,SAAS;;EAEnB;EACA;;EAEA,IAAI,CAAClG,GAAG,EAAE;IACRqG,gBAAO,CAACC,SAAS,CAAC;MAChBpB,KAAK,EAAEqB,kBAAS,CAACC,mBAAmB;MACpCL,SAAS,EAATA,SAAS;MACTM,IAAI,EAAE;QACJC,UAAU,EAAE,KAAK;QACjBC,MAAM,EAAE,CACNN,gBAAO,CAACO,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE5E,cAAK,CAAC7D,IAAI,CAAC0I,YAAY,EAAE,mBAAmB,CAAC;MAE1F;IACF,CAAC,CAAC;EACJ;EACA,IACE7D,cAAc,CAACoD,cAAc,KAAK1G,cAAG,CAACoH,gBAAgB,IACrD9D,cAAc,CAACoD,cAAc,KAAK1G,cAAG,CAACqH,MAAM,IAAId,OAAO,KAAKvG,cAAG,CAACsH,KAAM,EACvE;IACAhH,GAAG,GAAGa,0BAA0B,CAACb,GAAG,CAAC;IAErC,IAAI,CAACgD,cAAc,CAACiE,YAAY,EAAE;MAChCjH,GAAG,GAAGA,GAAG,CAACe,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;IACxC;;IAEA;IACAf,GAAG,GAAGA,GAAG,CAACe,OAAO,CAAC,8BAA8B,EAAE,EAAE,CAAC;IAErD,OACEiC,cAAc,CACXkE,oBAAoB,CACnB,IAAIC,eAAM,CAACC,qBAAqB,CAAC;MAC/BtC,IAAI,EAAEmB,OAAO;MACbjG,GAAG,EAAHA;IACF,CAAC,CAAC,CACH,CACAqH,IAAI,CAAC,YAAM;MACV,IAAIrE,cAAc,CAACoD,cAAc,KAAK1G,cAAG,CAACqH,MAAM,EAAE;QAChDV,gBAAO,CAACC,SAAS,CAAC;UAChBpB,KAAK,EAAEqB,kBAAS,CAACC,mBAAmB;UACpCL,SAAS,EAATA;QACF,CAAC,CAAC;MACJ;IACF,CAAC;IACD;IAAA,CACCmB,KAAK,CAAC,UAACtF,KAAK,EAAK;MAChBF,oBAAW,CAACC,MAAM,CAACC,KAAK,2DAAAnC,MAAA,CACoCmC,KAAK,wBAChE;MAED,IAAMuF,UAAU,GAAGC,mBAAkB,CAACC,sBAAsB;MAC5D,IAAMhB,IAAI,GAAG;QACXiB,cAAc,EAAEvB,SAAS;QACzBwB,MAAM,EAAE3F,KAAK,CAAC4F,OAAO;QACrBC,KAAK,EAAE7F,KAAK,CAAC6F;MACf,CAAC;MACD,IAAMC,QAAQ,GAAG;QACfhD,IAAI,EAAE9C,KAAK,CAAC7D;MACd,CAAC;MAEDkI,gBAAO,CAAC0B,oBAAoB,CAACR,UAAU,EAAEd,IAAI,EAAEqB,QAAQ,CAAC;MAExD,OAAOzB,gBAAO,CAACC,SAAS,CAAC;QACvBpB,KAAK,EAAEqB,kBAAS,CAACC,mBAAmB;QACpCL,SAAS,EAATA,SAAS;QACTM,IAAI,EAAE;UACJC,UAAU,EAAE,KAAK;UACjBC,MAAM,EAAE,CACNN,gBAAO,CAACO,oBAAoB,CAC1B,IAAI,EACJ,IAAI,EACJ5E,KAAK,CAAC7D,IAAI,CAAC0I,YAAY,EACvB,mBAAmB,CACpB;QAEL;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EAER;EAEA,OAAO1D,QAAA,CAAAC,OAAA,CAAQE,MAAM,CAAC,IAAI0E,cAAU,CAAC,+BAA+B,CAAC,CAAC;AACxE,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAnJ,EAAE,CAACoJ,WAAW,GAAG,UACfjF,cAAmB,EAAAkF,KAAA,EAYhB;EAAA,IAVD/B,SAAS,GAAA+B,KAAA,CAAT/B,SAAS;IACTjD,kBAAkB,GAAAgF,KAAA,CAAlBhF,kBAAkB;IAClBiF,SAAS,GAAAD,KAAA,CAATC,SAAS;IACTlB,YAAY,GAAAiB,KAAA,CAAZjB,YAAY;EAQdnF,oBAAW,CAACC,MAAM,CAACmC,GAAG,CAAC,kEAAkE,CAAC;;EAE1F;;EAEAlB,cAAc,CAACiE,YAAY,GAAGA,YAAY;EAE1C,OACEjE,cAAc,CACXiF,WAAW,EAAE,CACbZ,IAAI,CAAC,UAACe,WAAW,EAAK;IACrB;IACA;IACA;;IAEA,IAAI,CAACD,SAAS,EAAE;MACdC,WAAW,CAACpI,GAAG,GAAGoI,WAAW,CAACpI,GAAG,CAACe,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC;MAC3EqH,WAAW,CAACpI,GAAG,GAAGoI,WAAW,CAACpI,GAAG,CAACe,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC;IAC1E;IAEA,OAAOiC,cAAc,CAACqF,mBAAmB,CAACD,WAAW,CAAC;EACxD,CAAC,CAAC,CACDf,IAAI,CAAC;IAAA,OAAMxI,EAAE,CAACkE,YAAY,CAACC,cAAc,EAAE;MAACE,kBAAkB,EAAlBA;IAAkB,CAAC,CAAC;EAAA,EAAC,CACjEmE,IAAI,CAAC,YAAM;IACV,IAAI,CAACrG,gBAAgB,CAACgC,cAAc,CAAChD,GAAG,CAAC,EAAE;MACzC,MAAM,IAAIgI,cAAU,CAClB,+EAA+E,CAChF;IACH;IAEA,IAAI,CAACf,YAAY,EAAE;MACjBjE,cAAc,CAAChD,GAAG,GAAGgD,cAAc,CAAChD,GAAG,CAACe,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;IACtE;IAEAlC,EAAE,CAAC+D,gBAAgB,CAACI,cAAc,CAAC;IAEnCqD,gBAAO,CAACC,SAAS,CAAC;MAChBpB,KAAK,EAAEqB,kBAAS,CAAC+B,mBAAmB;MACpCnC,SAAS,EAATA;IACF,CAAC,CAAC;IAEF,OAAOnD,cAAc;EACvB,CAAC;EACD;EAAA,CACCsE,KAAK,CAAC,UAACtF,KAAK,EAAK;IAChBF,oBAAW,CAACC,MAAM,CAACC,KAAK,kDAAAnC,MAAA,CAAkDmC,KAAK,EAAG;IAClF,IAAIA,KAAK,YAAYiC,4BAAe,EAAE;MACpCoC,gBAAO,CAAC0B,oBAAoB,CAACP,mBAAkB,CAACe,qBAAqB,EAAE;QACrEb,cAAc,EAAEvB,SAAS;QACzBqC,IAAI,EAAExG,KAAK,CAACwG,IAAI;QAChBb,MAAM,EAAE3F,KAAK,CAAC4F;MAChB,CAAC,CAAC;IACJ,CAAC,MAAM;MACL,IAAML,UAAU,GAAGC,mBAAkB,CAACC,sBAAsB;MAC5D,IAAMhB,IAAI,GAAG;QACXiB,cAAc,EAAEvB,SAAS;QACzBwB,MAAM,EAAE3F,KAAK,CAAC4F,OAAO;QACrBC,KAAK,EAAE7F,KAAK,CAAC6F;MACf,CAAC;MACD,IAAMC,QAAQ,GAAG;QACfhD,IAAI,EAAE9C,KAAK,CAAC7D;MACd,CAAC;MAEDkI,gBAAO,CAAC0B,oBAAoB,CAACR,UAAU,EAAEd,IAAI,EAAEqB,QAAQ,CAAC;IAC1D;IAEAzB,gBAAO,CAACC,SAAS,CAAC;MAChBpB,KAAK,EAAEqB,kBAAS,CAAC+B,mBAAmB;MACpCnC,SAAS,EAATA,SAAS;MACTM,IAAI,EAAE;QACJC,UAAU,EAAE,KAAK;QACjBC,MAAM,EAAE;QACN;QACAN,gBAAO,CAACO,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE5E,KAAK,CAAC7D,IAAI,CAAC0I,YAAY,CAAC;MAErE;IACF,CAAC,CAAC;IACFhI,EAAE,CAAC4J,KAAK,CAACzF,cAAc,CAAC;IACxB,MAAMhB,KAAK;EACb,CAAC,CAAC;AAER,CAAC;;AAED;AACA;AACA;AACA;AACA;AACAnD,EAAE,CAAC6J,wBAAwB,GAAG,UAAC1F,cAAmB;EAAA,OAChDA;EACE;EAAA,CACCqF,mBAAmB,CAAC,IAAIjB,qBAAqB,CAAC;IAACtC,IAAI,EAAEpF,cAAG,CAACiJ;EAAQ,CAAC,CAAC,CAAC,CACpEtB,IAAI,CAAC;IAAA,OAAMrE,cAAc;EAAA,EAAC,CAC1BsE,KAAK,CAAC,UAAChK,GAAG,EAAK;IACdwE,oBAAW,CAACC,MAAM,CAACC,KAAK,0DAAAnC,MAAA,CAA0DvC,GAAG,OAAI;;IAEzF;IACA,OAAO6F,QAAA,CAAAC,OAAA,CAAQpB,KAAK,CAAC1E,GAAG,CAAC;EAC3B,CAAC,CAAC;AAAA;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAuB,EAAE,CAAC+J,oBAAoB,GAAG,UACxBC,MAMC,EAAAC,KAAA,EAQE;EAAA,IAND3C,SAAS,GAAA2C,KAAA,CAAT3C,SAAS;IACTjD,kBAAkB,GAAA4F,KAAA,CAAlB5F,kBAAkB;EAMpBpB,oBAAW,CAACC,MAAM,CAACmC,GAAG,kGAAArE,MAAA,CAC6EgJ,MAAM,EACxG;EAED,IAAO7F,cAAc,GAAc6F,MAAM,CAAlC7F,cAAc;IAAET,QAAQ,GAAIsG,MAAM,CAAlBtG,QAAQ;EAE/B,OAAO1D,EAAE,CACNkK,YAAY,CACX;IACE/F,cAAc,EAAdA,cAAc;IACdT,QAAQ,EAAEA,QAAQ,CAAC,CAAC;EACtB,CAAC,EACD;IAAC4D,SAAS,EAATA,SAAS;IAAEjD,kBAAkB,EAAlBA;EAAkB,CAAC,CAChC,CACAmE,IAAI,CAAC,UAAC2B,cAAc,EAAK;IACxB;IACAnK,EAAE,CAAC+D,gBAAgB,CAACoG,cAAc,CAAC;IAEnC,OAAO7F,QAAA,CAAAC,OAAA,CAAQC,OAAO,CAAC,CAAC2F,cAAc,CAAChJ,GAAG,CAAC,CAAC;EAC9C,CAAC,CAAC;AACN,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAnB,EAAE,CAACkK,YAAY,GAAG,UAChBF,MAIC,EAAAI,KAAA,EAQE;EAAA,IAND9C,SAAS,GAAA8C,KAAA,CAAT9C,SAAS;IACTjD,kBAAkB,GAAA+F,KAAA,CAAlB/F,kBAAkB;EAMpB,IAAOF,cAAc,GAAI6F,MAAM,CAAxB7F,cAAc;;EAErB;EACA;EACA,IAAIA,cAAc,CAACoD,cAAc,KAAK1G,cAAG,CAACwJ,iBAAiB,EAAE;IAC3D,OAAO/F,QAAA,CAAAC,OAAA,CAAQC,OAAO,CAACL,cAAc,CAAC;EACxC;EAEA,OACEnE,EAAE,CACCmH,uBAAuB,CAAChD,cAAc,EAAEgE,gBAAK,EAAE6B,MAAM,CAACtG,QAAQ,EAAE4D,SAAS,CAAC,CAC1EkB,IAAI,CAAC;IAAA,OAAMrE,cAAc,CAAC+F,YAAY,CAACF,MAAM,CAACM,cAAc,CAAC;EAAA,EAAC,CAC9D9B,IAAI,CAAC,UAAC+B,MAAM;IAAA,OAAKpG,cAAc,CAACqF,mBAAmB,CAACe,MAAM,CAAC;EAAA,EAAC,CAC5D/B,IAAI,CAAC;IAAA,OAAMxI,EAAE,CAACkE,YAAY,CAACC,cAAc,EAAE;MAACE,kBAAkB,EAAlBA;IAAkB,CAAC,CAAC;EAAA,EAAC,CACjEmE,IAAI,CAAC,YAAM;IACVrE,cAAc,CAAChD,GAAG,GAAGsC,cAAc,CAACU,cAAc,CAACc,gBAAgB,CAAC9D,GAAG,CAAC;IACxEgD,cAAc,CAAChD,GAAG,GAAGW,aAAmB,CAACoD,kBAAkB,CAACf,cAAc,CAAChD,GAAG,CAAC;IAC/EgD,cAAc,CAAChD,GAAG,GAAGD,yBAAyB,CAACiD,cAAc,CAAChD,GAAG,EAAEkD,kBAAkB,CAAC;IAEtF,IAAI,CAAClC,gBAAgB,CAACgC,cAAc,CAAChD,GAAG,CAAC,EAAE;MACzC,MAAM,IAAIgI,cAAU,CAClB,+EAA+E,CAChF;IACH;IAEA,OAAOhF,cAAc;EACvB,CAAC;EACD;EAAA,CACCsE,KAAK,CAAC,UAACtF,KAAK,EAAK;IAChB,IAAIA,KAAK,YAAYiC,4BAAe,EAAE;MACpCoC,gBAAO,CAAC0B,oBAAoB,CAACP,mBAAkB,CAACe,qBAAqB,EAAE;QACrEb,cAAc,EAAEvB;MAClB,CAAC,CAAC;IACJ,CAAC,MAAM;MACL,IAAMoB,UAAU,GAAGC,mBAAkB,CAACC,sBAAsB;MAC5D,IAAMhB,IAAI,GAAG;QACXiB,cAAc,EAAEvB,SAAS;QACzBwB,MAAM,EAAE3F,KAAK,CAAC4F,OAAO;QACrBC,KAAK,EAAE7F,KAAK,CAAC6F;MACf,CAAC;MACD,IAAMC,QAAQ,GAAG;QACfhD,IAAI,EAAE9C,KAAK,CAAC7D;MACd,CAAC;MAEDkI,gBAAO,CAAC0B,oBAAoB,CAACR,UAAU,EAAEd,IAAI,EAAEqB,QAAQ,CAAC;IAC1D;IAEAhG,oBAAW,CAACC,MAAM,CAACC,KAAK,kGAAAnC,MAAA,CAC2EmC,KAAK,EACvG;EACH,CAAC,CAAC;AAER,CAAC;;AAED;AACA;AACA;AACA;AACA;AACAnD,EAAE,CAAC4J,KAAK,GAAG,UAACzF,cAAmB,EAAK;EAClC;EACA;EACA;EACAlB,oBAAW,CAACC,MAAM,CAACmC,GAAG,CACpB,8FAA8F,CAC/F;EAED,IAAIlB,cAAc,IAAIA,cAAc,CAACqG,eAAe,KAAKC,gCAAqB,CAACC,MAAM,EAAE;IACrFzH,oBAAW,CAACC,MAAM,CAACmC,GAAG,CACpB,gFAAgF,CACjF;IAED,OAAOf,QAAA,CAAAC,OAAA,CAAQC,OAAO,EAAE;EAC1B;EACAvB,oBAAW,CAACC,MAAM,CAACmC,GAAG,CACpB,sFAAsF,CACvF;EAED,OAAOf,QAAA,CAAAC,OAAA,CAAQC,OAAO,EAAE,CAACgE,IAAI,CAAC,YAAM;IAClC,IAAIrE,cAAc,IAAIA,cAAc,CAACyF,KAAK,EAAE;MAC1CzF,cAAc,CAACyF,KAAK,EAAE;IACxB;EACF,CAAC,CAAC;AACJ,CAAC;AAED5J,EAAE,CAAC2K,uBAAuB,GAAG,UAACC,OAAO,EAAK;EACxC;EACA,IAAOzG,cAAc,GAAIyG,OAAO,CAACC,eAAe,CAAzC1G,cAAc;EAErB,IAAM2G,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAA,EAAS;IAC7B,IAAIF,OAAO,CAACG,mBAAmB,CAACC,QAAQ,CAACxG,OAAO,EAAE;MAChD;MACA;MACAoG,OAAO,CAACG,mBAAmB,CAACC,QAAQ,CAACxG,OAAO,EAAE;IAChD;IAEAoG,OAAO,CAACK,SAAS,CAAC;MAACC,iBAAiB,EAAE;IAAI,CAAC,CAAC;IAC5C1D,gBAAO,CAACC,SAAS,CAAC;MAChBpB,KAAK,EAAEqB,kBAAS,CAACyD,OAAO;MACxBP,OAAO,EAAPA,OAAO;MACPhD,IAAI,EAAE;QACJC,UAAU,EAAE,KAAK;QACjBC,MAAM,EAAE;QACN;QACAN,gBAAO,CAACO,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE5E,cAAK,CAAC7D,IAAI,CAAC0I,YAAY,CAAC;MAEtE;IACF,CAAC,CAAC;IAEF4C,OAAO,CAACQ,UAAU,CAAC;MACjBC,IAAI,EAAE,+BAA+B;MACrCC,QAAQ,EAAE;IACZ,CAAC,CAAC;IAEF9D,gBAAO,CAAC0B,oBAAoB,CAACP,mBAAkB,CAAC4C,kBAAkB,EAAE;MAClE1C,cAAc,EAAE+B,OAAO,CAACY,aAAa;MACrCC,QAAQ,EAAEb,OAAO,CAACc;IACpB,CAAC,CAAC;EACJ,CAAC;EAEDvH,cAAc,CAACwH,0BAA0B,GAAG,YAAM;IAChD1I,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,2EAA2E,CAC5E;IACD,QAAQzH,cAAc,CAAC0H,kBAAkB;MACvC,KAAKC,oBAAS,CAACC,QAAQ;QACrB9I,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,6EAA6E,CAC9E;QACDpE,gBAAO,CAACC,SAAS,CAAC;UAACpB,KAAK,EAAEqB,kBAAS,CAACsE,SAAS;UAAEpB,OAAO,EAAPA;QAAO,CAAC,CAAC;QACxD;MACF,KAAKkB,oBAAS,CAACG,SAAS;QACtBhJ,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,8EAA8E,CAC/E;QACD;MACF,KAAKE,oBAAS,CAACI,SAAS;QACtB;QACA;QACA1E,gBAAO,CAACC,SAAS,CAAC;UAACpB,KAAK,EAAEqB,kBAAS,CAACyD,OAAO;UAAEP,OAAO,EAAPA;QAAO,CAAC,CAAC;QACtDpD,gBAAO,CAAC0B,oBAAoB,CAACP,mBAAkB,CAACwD,kBAAkB,EAAE;UAClEtD,cAAc,EAAE+B,OAAO,CAACY,aAAa;UACrCC,QAAQ,EAAEb,OAAO,CAACc;QACpB,CAAC,CAAC;QACFd,OAAO,CAACwB,gBAAgB,CAACC,yBAAc,CAACH,SAAS,CAAC;QAClDtB,OAAO,CAACG,mBAAmB,CAACuB,cAAc,EAAE;QAC5CrJ,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,8EAA8E,CAC/E;QACD;MACF,KAAKE,oBAAS,CAACpB,MAAM;QACnBzH,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,2EAA2E,CAC5E;QACD;MACF,KAAKE,oBAAS,CAACS,YAAY;QACzB3B,OAAO,CAACwB,gBAAgB,CAACC,yBAAc,CAACE,YAAY,CAAC;QACrD3B,OAAO,CAACG,mBAAmB,CAACyB,mBAAmB,EAAE,CAAC/D,KAAK,CAAC,YAAM;UAC5DxF,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,mHAAmH,CACpH;UAEDd,gBAAgB,EAAE;QACpB,CAAC,CAAC;QACF7H,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,iFAAiF,CAClF;QACD;MACF,KAAKE,oBAAS,CAACW,MAAM;QACnBxJ,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,2EAA2E,CAC5E;QACD;QACA;QACA;QACAd,gBAAgB,EAAE;QAClB;MACF;QACE;IAAM;EAEZ,CAAC;EAED3G,cAAc,CAACuI,uBAAuB,GAAG,YAAM;IAC7CzJ,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,kFAAkF,CACnF;IACD,QAAQzH,cAAc,CAACqG,eAAe;MACpC,KAAKmC,2BAAgB,CAACC,GAAG;QACvB3J,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,+EAA+E,CAChF;QACD;MACF,KAAKe,2BAAgB,CAACE,UAAU;QAC9B5J,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,sFAAsF,CACvF;QACD;MACF,KAAKe,2BAAgB,CAACT,SAAS;QAC7BjJ,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,qFAAqF,CACtF;QACD;MACF,KAAKe,2BAAgB,CAACjC,MAAM;QAC1BzH,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,kFAAkF,CACnF;QACD;MACF,KAAKe,2BAAgB,CAACJ,YAAY;QAChCtJ,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,wFAAwF,CACzF;QACD;MACF,KAAKe,2BAAgB,CAACF,MAAM;QAC1BxJ,oBAAW,CAACC,MAAM,CAAC0I,IAAI,CACrB,kFAAkF,CACnF;QACD;QACA;;QAEAd,gBAAgB,EAAE;QAClB;MACF;QACE;IAAM;EAEZ,CAAC;AACH,CAAC;AAAC,IAAAgC,QAAA,GAEa9M,EAAE;AAAA+M,OAAA,CAAAxI,OAAA,GAAAuI,QAAA"}
1
+ {"version":3,"names":["_window","_interopRequireDefault","require","_sdpTransform","_metrics","_loggerProxy","_config","_constants","_constants2","_config2","_media","_parameter","_webexErrors","_browserDetection","_util","_createForOfIteratorHelper","o","allowArrayLike","it","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","_Array$from","test","arr","len","arr2","Array","_BrowserDetection","BrowserDetection","isBrowser","pc","insertBandwidthLimit","sdpLines","index","limit","periodicKeyFrame","search","AUDIO","StaticConfig","meetings","bandwidth","audio","video","SDP","PERIODIC_KEYFRAME","splice","concat","B_LINE","setRemoteVideoConstraints","sdp","level","arguments","undefined","QUALITY_LEVELS","HIGH","maxFs","REMOTE_VIDEO_CONSTRAINTS","MAX_FS","ParameterError","modifiedSdp","PeerConnectionUtils","adjustH264Profile","setStartBitrateOnRemoteSdp","startBitrate","replace","checkH264Support","videoPresent","match","h264Present","isSdpInvalid","parsedSdp","sdpTransform","parse","_iterator","media","_step","_mediaLine$candidates","mediaLine","candidates","LoggerProxy","logger","error","BAD_MEDIA_PORTS","includes","port","icePwd","iceUfrag","limitBandwidth","offerSdp","split","CARRIAGE_RETURN","M_LINE","join","setContentSlides","screenPc","A_CONTENT_SLIDES","iceCandidate","peerConnection","_ref","remoteQualityLevel","_promise","default","resolve","reject","now","_now","doneGatheringIceCandidate","miliseconds","_parseInt2","Math","abs","localDescription","convertCLineToIpv4","invalidSdpPresent","InvalidSdpError","log","iceGatheringState","COMPLETE","onIceGatheringStateChange","GATHERING","onicecandidate","evt","candidate","_evt$candidate","_evt$candidate2","_evt$candidate3","_evt$candidate4","type","protocol","address","onicecandidateerror","event","replaceTrack","track","senders","getSenders","forEach","sender","kind","addStream","stream","tracksPresent","find","getTracks","addTrack","setRemoteSessionDetails","typeStr","remoteSdp","meetingId","signalingState","Metrics","postEvent","eventType","REMOTE_SDP_RECEIVED","data","canProceed","errors","generateErrorPayload","MEDIA_ENGINE","HAVE_LOCAL_OFFER","STABLE","OFFER","enableExtmap","setRemoteDescription","window","RTCSessionDescription","then","catch","metricName","BEHAVIORAL_METRICS","PEERCONNECTION_FAILURE","correlation_id","reason","message","stack","metadata","sendBehavioralMetric","MediaError","createOffer","_ref2","enableRtx","description","setLocalDescription","LOCAL_SDP_GENERATED","INVALID_ICE_CANDIDATE","code","close","rollBackLocalDescription","ROLLBACK","updatePeerConnection","params","_ref3","createAnswer","peerconnection","_ref4","HAVE_REMOTE_OFFER","sdpConstraints","answer","connectionState","PEER_CONNECTION_STATE","CLOSED","setPeerConnectionEvents","meeting","mediaProperties","connectionFailed","reconnectionManager","iceState","reconnect","networkDisconnect","ICE_END","uploadLogs","file","function","CONNECTION_FAILURE","correlationId","locus_id","locusId","oniceconnectionstatechange","info","iceConnectionState","ICE_STATE","CHECKING","ICE_START","COMPLETED","CONNECTED","CONNECTION_SUCCESS","setNetworkStatus","NETWORK_STATUS","iceReconnected","DISCONNECTED","waitForIceReconnect","FAILED","onconnectionstatechange","CONNECTION_STATE","NEW","CONNECTING","_default","exports"],"sources":["index.ts"],"sourcesContent":["// We need to figure out how to pass a webex logger instance to these util files\r\n\r\n/* globals RTCSessionDescription */\r\n\r\nimport window from 'global/window';\r\nimport sdpTransform from 'sdp-transform'; // https://github.com/clux/sdp-transform\r\n\r\nimport Metrics from '../metrics';\r\nimport LoggerProxy from '../common/logs/logger-proxy';\r\nimport StaticConfig from '../common/config';\r\nimport {\r\n COMPLETE,\r\n GATHERING,\r\n AUDIO,\r\n SDP,\r\n ICE_STATE,\r\n CONNECTION_STATE,\r\n NETWORK_STATUS,\r\n PEER_CONNECTION_STATE,\r\n OFFER,\r\n QUALITY_LEVELS,\r\n REMOTE_VIDEO_CONSTRAINTS,\r\n} from '../constants';\r\nimport BEHAVIORAL_METRICS from '../metrics/constants';\r\nimport {error, eventType} from '../metrics/config';\r\nimport MediaError from '../common/errors/media';\r\nimport ParameterError from '../common/errors/parameter';\r\nimport {InvalidSdpError} from '../common/errors/webex-errors';\r\nimport BrowserDetection from '../common/browser-detection';\r\n\r\nimport PeerConnectionUtils from './util';\r\n\r\nconst {isBrowser} = BrowserDetection();\r\n\r\n/**\r\n * @export\r\n * @public\r\n */\r\nconst pc: any = {};\r\n\r\n/**\r\n * munges the bandwidth limit into the sdp\r\n * @param {String} sdpLines\r\n * @param {Number} index\r\n * @returns {String}\r\n */\r\nconst insertBandwidthLimit = (sdpLines: any, index: number) => {\r\n // eslint-disable-next-line no-warning-comments\r\n // TODO convert to sdp parser\r\n let limit;\r\n let periodicKeyFrame = '';\r\n\r\n if (sdpLines[index].search(AUDIO) !== -1) {\r\n limit = StaticConfig.meetings.bandwidth.audio;\r\n } else {\r\n limit = StaticConfig.meetings.bandwidth.video;\r\n periodicKeyFrame = SDP.PERIODIC_KEYFRAME;\r\n sdpLines.splice(index + 2, 0, periodicKeyFrame);\r\n }\r\n sdpLines.splice(index + 1, 0, `${SDP.B_LINE}:${limit}`);\r\n\r\n return sdpLines;\r\n};\r\n\r\n/**\r\n * needed for calliope max-fs\r\n * @param {String} sdp\r\n * @param {String} [level=QUALITY_LEVELS.HIGH] quality level for max-fs\r\n * @returns {String}\r\n */\r\nconst setRemoteVideoConstraints = (sdp: string, level: string = QUALITY_LEVELS.HIGH) => {\r\n const maxFs = REMOTE_VIDEO_CONSTRAINTS.MAX_FS[level];\r\n\r\n if (!maxFs) {\r\n throw new ParameterError(\r\n `setRemoteVideoConstraints: unable to set max framesize, value for level \"${level}\" is not defined`\r\n );\r\n }\r\n\r\n const modifiedSdp = PeerConnectionUtils.adjustH264Profile(sdp, maxFs);\r\n\r\n return modifiedSdp;\r\n};\r\n\r\nconst setStartBitrateOnRemoteSdp = (sdp) => {\r\n if (StaticConfig.meetings.bandwidth.startBitrate) {\r\n sdp = sdp.replace(\r\n /(\\na=fmtp:(\\d+).*profile-level-id=.*)/gi,\r\n `$1;x-google-start-bitrate=${StaticConfig.meetings.bandwidth.startBitrate}`\r\n );\r\n }\r\n\r\n return sdp;\r\n};\r\n\r\n/**\r\n * checks that sdp has h264 codec in it\r\n * @param {String} sdp\r\n * @returns {boolean}\r\n */\r\nconst checkH264Support = (sdp: string) => {\r\n // eslint-disable-next-line no-warning-comments\r\n // TODO convert to sdp parser to read rtp.codec\r\n const videoPresent = sdp.match(/\\nm=video.*/g);\r\n const h264Present = sdp.match(/\\na=rtpmap:\\d+\\sH264.*/g);\r\n\r\n if (videoPresent) {\r\n return !!h264Present;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n/**\r\n * validates the sdp, checks port, candidates, and ice info\r\n * @param {String} sdp\r\n * @returns {String}\r\n */\r\nconst isSdpInvalid = (sdp: string) => {\r\n const parsedSdp = sdpTransform.parse(sdp);\r\n\r\n for (const mediaLine of parsedSdp.media) {\r\n if (!mediaLine.candidates || mediaLine.candidates?.length === 0) {\r\n LoggerProxy.logger.error(\r\n 'PeerConnectionManager:index#isSdpInvalid --> iceCandidate: Ice candidate never completed'\r\n );\r\n\r\n return 'iceCandidate: Ice gathering never completed';\r\n }\r\n\r\n if (SDP.BAD_MEDIA_PORTS.includes(mediaLine.port)) {\r\n LoggerProxy.logger.error(\r\n 'PeerConnectionManager:index#isSdpInvalid --> iceCandidate: Found invalid port number for the ice candidate'\r\n );\r\n\r\n return 'iceCandidate: Found invalid port number for the ice candidate';\r\n }\r\n if (!mediaLine.icePwd || !mediaLine.iceUfrag) {\r\n LoggerProxy.logger.error(\r\n 'PeerConnectionManager:index#isSdpInvalid --> iceCandidate: ice ufrag and password not found'\r\n );\r\n\r\n return 'iceCandidate: ice ufrag and password not found';\r\n }\r\n }\r\n\r\n return '';\r\n};\r\n\r\n/**\r\n * munges the bandwidth into the sdp\r\n * @param {String} sdp\r\n * @returns {String}\r\n */\r\nconst limitBandwidth = (sdp: string) => {\r\n // TODO convert to sdp parser\r\n let offerSdp = sdp;\r\n let sdpLines = offerSdp.split(SDP.CARRIAGE_RETURN);\r\n\r\n for (let i = 0; i < sdpLines.length; i += 1) {\r\n if (sdpLines[i].search(SDP.M_LINE) !== -1) {\r\n sdpLines = insertBandwidthLimit(sdpLines, i);\r\n }\r\n }\r\n offerSdp = sdpLines.join(SDP.CARRIAGE_RETURN);\r\n\r\n return offerSdp;\r\n};\r\n\r\n/**\r\n * makes sure the screen pc sdp has content:slides for server\r\n * @param {RTCPeerConnection} screenPc\r\n * @returns {RTCPeerConnection}\r\n */\r\npc.setContentSlides = (screenPc: any) => {\r\n if (screenPc && screenPc.sdp) {\r\n screenPc.sdp += `${SDP.A_CONTENT_SLIDES}${SDP.CARRIAGE_RETURN}`;\r\n }\r\n\r\n return screenPc;\r\n};\r\n\r\n/**\r\n * handles ice trickling and establishes ICE connection onto peer connection object\r\n * @param {Object} peerConnection\r\n * @param {Object} options\r\n * @param {String} options.remoteQualityLevel\r\n * @returns {Promise.RTCPeerConnection}\r\n */\r\npc.iceCandidate = (\r\n peerConnection: any,\r\n {\r\n remoteQualityLevel,\r\n }: {\r\n remoteQualityLevel: string;\r\n }\r\n) =>\r\n new Promise<void>((resolve, reject) => {\r\n const now = Date.now();\r\n const doneGatheringIceCandidate = () => {\r\n // @ts-ignore\r\n const miliseconds = parseInt(Math.abs(Date.now() - now), 4);\r\n\r\n peerConnection.sdp = limitBandwidth(peerConnection.localDescription.sdp);\r\n peerConnection.sdp = PeerConnectionUtils.convertCLineToIpv4(peerConnection.sdp);\r\n peerConnection.sdp = setRemoteVideoConstraints(peerConnection.sdp, remoteQualityLevel);\r\n\r\n const invalidSdpPresent = isSdpInvalid(peerConnection.sdp);\r\n\r\n if (invalidSdpPresent) {\r\n LoggerProxy.logger.error(\r\n 'PeerConnectionManager:index#iceCandidate --> SDP not valid after waiting.'\r\n );\r\n reject(new InvalidSdpError(invalidSdpPresent));\r\n }\r\n LoggerProxy.logger.log(\r\n `PeerConnectionManager:index#iceCandidate --> Time to gather ice candidate ${miliseconds} miliseconds`\r\n );\r\n\r\n resolve();\r\n };\r\n\r\n // If ice has already been gathered\r\n if (peerConnection.iceGatheringState === COMPLETE) {\r\n doneGatheringIceCandidate();\r\n }\r\n\r\n peerConnection.onIceGatheringStateChange = () => {\r\n if (peerConnection.iceGatheringState === COMPLETE) {\r\n // @ts-ignore\r\n doneGatheringIceCandidate(peerConnection);\r\n }\r\n if (peerConnection.iceGatheringState === GATHERING) {\r\n LoggerProxy.logger.log(\r\n 'PeerConnectionManager:index#onIceGatheringStateChange --> Ice state changed to gathering'\r\n );\r\n }\r\n };\r\n\r\n peerConnection.onicecandidate = (evt) => {\r\n if (evt.candidate === null) {\r\n // @ts-ignore\r\n doneGatheringIceCandidate(peerConnection);\r\n } else {\r\n LoggerProxy.logger.log(\r\n `PeerConnectionManager:index#onicecandidate --> Candidate ${evt.candidate?.type} ${evt.candidate?.protocol} ${evt.candidate?.address}:${evt.candidate?.port}`\r\n );\r\n }\r\n };\r\n\r\n peerConnection.onicecandidateerror = (event) => {\r\n // we can often get ICE candidate errors (for example when failing to communicate with a TURN server)\r\n // they don't mean that the whole ICE connection will fail, so it's OK to ignore them\r\n LoggerProxy.logger.error(\r\n 'PeerConnectionManager:index#onicecandidateerror --> ignoring ice error:',\r\n event\r\n );\r\n };\r\n });\r\n\r\n/**\r\n * swapping tracks\r\n * @param {Object} peerConnection\r\n * @param {Object} track\r\n * @returns {undefined}\r\n */\r\npc.replaceTrack = (peerConnection: any, track: any) => {\r\n try {\r\n const senders = peerConnection.getSenders();\r\n\r\n if (senders.length > 0) {\r\n senders.forEach((sender) => {\r\n if (sender.track && sender.track.kind === track.kind) {\r\n sender.replaceTrack(track);\r\n }\r\n });\r\n }\r\n } catch (err) {\r\n LoggerProxy.logger.error(\r\n `PeerConnectionManager:index#replaceTrack --> Error replacing track, ${err}`\r\n );\r\n }\r\n};\r\n\r\n/**\r\n * adding streams to peerConnection\r\n * @param {Object} peerConnection\r\n * @param {Object} stream\r\n * @returns {undefined}\r\n */\r\npc.addStream = (peerConnection: any, stream: any) => {\r\n try {\r\n if (stream && !isBrowser('edge')) {\r\n const tracksPresent =\r\n peerConnection.getSenders &&\r\n peerConnection.getSenders().find((sender) => sender.track != null);\r\n\r\n if (tracksPresent) {\r\n stream.getTracks().forEach((track) => {\r\n pc.replaceTrack(peerConnection, track);\r\n });\r\n\r\n return;\r\n }\r\n stream.getTracks().forEach((track) => {\r\n peerConnection.addTrack(track, stream);\r\n });\r\n // // TODO : may come back disable addTracks for chrome they are moving back to addStream\r\n // // https://bugs.chromium.org/p/chromium/issues/detail?id=764414\r\n // // https://bugs.chromium.org/p/chromium/issues/detail?id=738918#c7\r\n // peerConnection.addStream(stream);\r\n } else if (isBrowser('edge')) {\r\n peerConnection.addStream(stream);\r\n }\r\n } catch (err) {\r\n LoggerProxy.logger.error(\r\n `PeerConnectionManager:index#addStream --> Error adding stream, error: ${error}`\r\n );\r\n }\r\n};\r\n\r\n/**\r\n * setting the remote description\r\n * @param {Object} peerConnection\r\n * @param {String} typeStr\r\n * @param {String} remoteSdp\r\n * @param {String} meetingId\r\n * @returns {undefined}\r\n */\r\npc.setRemoteSessionDetails = (\r\n peerConnection: any,\r\n typeStr: string,\r\n remoteSdp: string,\r\n meetingId: string\r\n) => {\r\n LoggerProxy.logger.log(\r\n `PeerConnectionManager:index#setRemoteSessionDetails --> Setting the remote description type: ${typeStr}State: ${peerConnection.signalingState}`\r\n );\r\n let sdp = remoteSdp;\r\n\r\n // making sure that the remoteDescription is only set when there is a answer for offer\r\n // or there is a offer from the server\r\n\r\n if (!sdp) {\r\n Metrics.postEvent({\r\n event: eventType.REMOTE_SDP_RECEIVED,\r\n meetingId,\r\n data: {\r\n canProceed: false,\r\n errors: [\r\n Metrics.generateErrorPayload(2001, true, error.name.MEDIA_ENGINE, 'missing remoteSdp'),\r\n ],\r\n },\r\n });\r\n }\r\n if (\r\n peerConnection.signalingState === SDP.HAVE_LOCAL_OFFER ||\r\n (peerConnection.signalingState === SDP.STABLE && typeStr === SDP.OFFER)\r\n ) {\r\n sdp = setStartBitrateOnRemoteSdp(sdp);\r\n\r\n if (!peerConnection.enableExtmap) {\r\n sdp = sdp.replace(/\\na=extmap.*/g, '');\r\n }\r\n\r\n // remove any xtls candidates\r\n sdp = sdp.replace(/^a=candidate:.*xTLS.*\\r\\n/gim, '');\r\n\r\n return (\r\n peerConnection\r\n .setRemoteDescription(\r\n new window.RTCSessionDescription({\r\n type: typeStr,\r\n sdp,\r\n })\r\n )\r\n .then(() => {\r\n if (peerConnection.signalingState === SDP.STABLE) {\r\n Metrics.postEvent({\r\n event: eventType.REMOTE_SDP_RECEIVED,\r\n meetingId,\r\n });\r\n }\r\n })\r\n // eslint-disable-next-line @typescript-eslint/no-shadow\r\n .catch((error) => {\r\n LoggerProxy.logger.error(\r\n `Peer-connection-manager:index#setRemoteDescription --> ${error} missing remotesdp`\r\n );\r\n\r\n const metricName = BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;\r\n const data = {\r\n correlation_id: meetingId,\r\n reason: error.message,\r\n stack: error.stack,\r\n };\r\n const metadata = {\r\n type: error.name,\r\n };\r\n\r\n Metrics.sendBehavioralMetric(metricName, data, metadata);\r\n\r\n return Metrics.postEvent({\r\n event: eventType.REMOTE_SDP_RECEIVED,\r\n meetingId,\r\n data: {\r\n canProceed: false,\r\n errors: [\r\n Metrics.generateErrorPayload(\r\n 2001,\r\n true,\r\n error.name.MEDIA_ENGINE,\r\n 'missing remoteSdp'\r\n ),\r\n ],\r\n },\r\n });\r\n })\r\n );\r\n }\r\n\r\n return Promise.reject(new MediaError('PeerConnection in wrong state'));\r\n};\r\n\r\n/**\r\n * Create offer with a valid parameter\r\n * @param {Object} peerConnection\r\n * @param {Object} meetingProperties\r\n * @param {string} meetingProperties.meetingId\r\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\r\n * @param {string} meetingProperties.enableRtx\r\n * @param {string} meetingProperties.enableExtmap\r\n * @returns {RTCPeerConnection}\r\n */\r\npc.createOffer = (\r\n peerConnection: any,\r\n {\r\n meetingId,\r\n remoteQualityLevel,\r\n enableRtx,\r\n enableExtmap,\r\n }: {\r\n meetingId: string;\r\n remoteQualityLevel: string;\r\n enableRtx: string;\r\n enableExtmap: string;\r\n }\r\n) => {\r\n LoggerProxy.logger.log('PeerConnectionManager:index#createOffer --> creating a new offer');\r\n\r\n // saving the extMap State to use in setRemoteDescription\r\n\r\n peerConnection.enableExtmap = enableExtmap;\r\n\r\n return (\r\n peerConnection\r\n .createOffer()\r\n .then((description) => {\r\n // bug https://bugs.chromium.org/p/chromium/issues/detail?id=1020642\r\n // chrome currently generates RTX line irrespective of whether the server side supports it\r\n // we are removing apt as well because its associated with rtx line\r\n\r\n if (!enableRtx) {\r\n description.sdp = description.sdp.replace(/\\r\\na=rtpmap:\\d+ rtx\\/\\d+/g, '');\r\n description.sdp = description.sdp.replace(/\\r\\na=fmtp:\\d+ apt=\\d+/g, '');\r\n }\r\n\r\n return peerConnection.setLocalDescription(description);\r\n })\r\n .then(() => pc.iceCandidate(peerConnection, {remoteQualityLevel}))\r\n .then(() => {\r\n if (!checkH264Support(peerConnection.sdp)) {\r\n throw new MediaError(\r\n 'openH264 is downloading please Wait. Upload logs if not working on second try'\r\n );\r\n }\r\n\r\n if (!enableExtmap) {\r\n peerConnection.sdp = peerConnection.sdp.replace(/\\na=extmap.*/g, '');\r\n }\r\n\r\n pc.setContentSlides(peerConnection);\r\n\r\n Metrics.postEvent({\r\n event: eventType.LOCAL_SDP_GENERATED,\r\n meetingId,\r\n });\r\n\r\n return peerConnection;\r\n })\r\n // eslint-disable-next-line @typescript-eslint/no-shadow\r\n .catch((error) => {\r\n LoggerProxy.logger.error(`Peer-connection-manager:index#createOffer --> ${error}`);\r\n if (error instanceof InvalidSdpError) {\r\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.INVALID_ICE_CANDIDATE, {\r\n correlation_id: meetingId,\r\n code: error.code,\r\n reason: error.message,\r\n });\r\n } else {\r\n const metricName = BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;\r\n const data = {\r\n correlation_id: meetingId,\r\n reason: error.message,\r\n stack: error.stack,\r\n };\r\n const metadata = {\r\n type: error.name,\r\n };\r\n\r\n Metrics.sendBehavioralMetric(metricName, data, metadata);\r\n }\r\n\r\n Metrics.postEvent({\r\n event: eventType.LOCAL_SDP_GENERATED,\r\n meetingId,\r\n data: {\r\n canProceed: false,\r\n errors: [\r\n // @ts-ignore\r\n Metrics.generateErrorPayload(2001, true, error.name.MEDIA_ENGINE),\r\n ],\r\n },\r\n });\r\n pc.close(peerConnection);\r\n throw error;\r\n })\r\n );\r\n};\r\n\r\n/**\r\n * rollBack local description in peerconnection\r\n * @param {Object} peerConnection\r\n * @returns {Promise.RTCPeerConnection}\r\n */\r\npc.rollBackLocalDescription = (peerConnection: any) =>\r\n peerConnection\r\n // @ts-ignore\r\n .setLocalDescription(new RTCSessionDescription({type: SDP.ROLLBACK}))\r\n .then(() => peerConnection)\r\n .catch((err) => {\r\n LoggerProxy.logger.error(`Peer-connection-manager:index#setLocalDescription --> ${err} `);\r\n\r\n // @ts-ignore\r\n return Promise.error(err);\r\n });\r\n\r\n/**\r\n * @param {Object} params {\r\n * @param {Boolean} params.offerToReceiveAudio\r\n * @param {Boolean} params.offerToReceiveVideo\r\n * @param {string} params.offerSdp\r\n * @param {MediaStream} params.stream\r\n * @param {Object} meetingProperties\r\n * @param {string} meetingProperties.meetingId\r\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\r\n * @returns {Promise.<Array>} [MediaSDP, ScreenSDP]\r\n */\r\npc.updatePeerConnection = (\r\n params: {\r\n offerToReceiveAudio: boolean;\r\n offerToReceiveVideo: boolean;\r\n offerSdp: string;\r\n stream: MediaStream;\r\n peerConnection: any;\r\n },\r\n {\r\n meetingId,\r\n remoteQualityLevel,\r\n }: {\r\n meetingId: string;\r\n remoteQualityLevel: string;\r\n }\r\n) => {\r\n LoggerProxy.logger.log(\r\n `PeerConnectionManager:index#updatePeerConnection --> updating the peerConnection with params: ${params}`\r\n );\r\n\r\n const {peerConnection, offerSdp} = params;\r\n\r\n return pc\r\n .createAnswer(\r\n {\r\n peerConnection,\r\n offerSdp: offerSdp[0],\r\n },\r\n {meetingId, remoteQualityLevel}\r\n )\r\n .then((peerconnection) => {\r\n // The content slides should also be set when we are sending inactive\r\n pc.setContentSlides(peerconnection);\r\n\r\n return Promise.resolve([peerconnection.sdp]);\r\n });\r\n};\r\n\r\n/**\r\n * @param {Object} params\r\n * @param {Object} params.peerConnection\r\n * @param {Object} params.sdpConstraints\r\n * @param {Object} meetingProperties\r\n * @param {string} meetingProperties.meetingId\r\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\r\n * @returns {RTCPeerConnection} peerConnection\r\n */\r\npc.createAnswer = (\r\n params: {\r\n peerConnection: any;\r\n sdpConstraints: object;\r\n offerSdp: any;\r\n },\r\n {\r\n meetingId,\r\n remoteQualityLevel,\r\n }: {\r\n meetingId: string;\r\n remoteQualityLevel: string;\r\n }\r\n) => {\r\n const {peerConnection} = params;\r\n\r\n // TODO: Some times to many mercury event comes at the same time\r\n // Need to maintain state of peerconnection\r\n if (peerConnection.signalingState === SDP.HAVE_REMOTE_OFFER) {\r\n return Promise.resolve(peerConnection);\r\n }\r\n\r\n return (\r\n pc\r\n .setRemoteSessionDetails(peerConnection, OFFER, params.offerSdp, meetingId)\r\n .then(() => peerConnection.createAnswer(params.sdpConstraints))\r\n .then((answer) => peerConnection.setLocalDescription(answer))\r\n .then(() => pc.iceCandidate(peerConnection, {remoteQualityLevel}))\r\n .then(() => {\r\n peerConnection.sdp = limitBandwidth(peerConnection.localDescription.sdp);\r\n peerConnection.sdp = PeerConnectionUtils.convertCLineToIpv4(peerConnection.sdp);\r\n peerConnection.sdp = setRemoteVideoConstraints(peerConnection.sdp, remoteQualityLevel);\r\n\r\n if (!checkH264Support(peerConnection.sdp)) {\r\n throw new MediaError(\r\n 'openH264 is downloading please Wait. Upload logs if not working on second try'\r\n );\r\n }\r\n\r\n return peerConnection;\r\n })\r\n // eslint-disable-next-line @typescript-eslint/no-shadow\r\n .catch((error) => {\r\n if (error instanceof InvalidSdpError) {\r\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.INVALID_ICE_CANDIDATE, {\r\n correlation_id: meetingId,\r\n });\r\n } else {\r\n const metricName = BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;\r\n const data = {\r\n correlation_id: meetingId,\r\n reason: error.message,\r\n stack: error.stack,\r\n };\r\n const metadata = {\r\n type: error.name,\r\n };\r\n\r\n Metrics.sendBehavioralMetric(metricName, data, metadata);\r\n }\r\n\r\n LoggerProxy.logger.error(\r\n `PeerConnectionManager:index#setRemoteSessionDetails --> Error creating remote session, error: ${error}`\r\n );\r\n })\r\n );\r\n};\r\n\r\n/**\r\n * shut down the peer connection\r\n * @param {Object} peerConnection\r\n * @returns {undefined}\r\n */\r\npc.close = (peerConnection: any) => {\r\n // peerConnection.close() fails on firefox on network changes and gives a Dom exception\r\n // To avoid this we have added a try catch block.\r\n // Please refer to https://bugzilla.mozilla.org/show_bug.cgi?id=1274407 for more information\r\n LoggerProxy.logger.log(\r\n 'PeerConnectionManager:index#close --> pc: close() -> attempting to close the peer connection'\r\n );\r\n\r\n if (peerConnection && peerConnection.connectionState === PEER_CONNECTION_STATE.CLOSED) {\r\n LoggerProxy.logger.log(\r\n 'PeerConnectionManager:index#close --> pc: close() -> connection already closed'\r\n );\r\n\r\n return Promise.resolve();\r\n }\r\n LoggerProxy.logger.log(\r\n 'PeerConnectionManager:index#close --> pc: close() -> closing the mediaPeerConnection'\r\n );\r\n\r\n return Promise.resolve().then(() => {\r\n if (peerConnection && peerConnection.close) {\r\n peerConnection.close();\r\n }\r\n });\r\n};\r\n\r\npc.setPeerConnectionEvents = (meeting) => {\r\n // In case ICE fail\r\n const {peerConnection} = meeting.mediaProperties;\r\n\r\n const connectionFailed = () => {\r\n if (meeting.reconnectionManager.iceState.resolve) {\r\n // DISCONNECTED state triggers first then it goes to FAILED STATE\r\n // sometimes the failed state can happen before 10 seconds (Which is the timer for the reconnect for ice disconnect)\r\n meeting.reconnectionManager.iceState.resolve();\r\n }\r\n\r\n meeting.reconnect({networkDisconnect: true});\r\n Metrics.postEvent({\r\n event: eventType.ICE_END,\r\n meeting,\r\n data: {\r\n canProceed: false,\r\n errors: [\r\n // @ts-ignore\r\n Metrics.generateErrorPayload(2004, false, error.name.MEDIA_ENGINE),\r\n ],\r\n },\r\n });\r\n\r\n meeting.uploadLogs({\r\n file: 'peer-connection-manager/index',\r\n function: 'connectionFailed',\r\n });\r\n\r\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.CONNECTION_FAILURE, {\r\n correlation_id: meeting.correlationId,\r\n locus_id: meeting.locusId,\r\n });\r\n };\r\n\r\n peerConnection.oniceconnectionstatechange = () => {\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CHANGE.'\r\n );\r\n switch (peerConnection.iceConnectionState) {\r\n case ICE_STATE.CHECKING:\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CHECKING.'\r\n );\r\n Metrics.postEvent({event: eventType.ICE_START, meeting});\r\n break;\r\n case ICE_STATE.COMPLETED:\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE COMPLETED.'\r\n );\r\n break;\r\n case ICE_STATE.CONNECTED:\r\n // Ice connection state goes to connected when both client and server sends STUN packets and\r\n // Established connected between them. Firefox does not trigger COMPLETED and only trigger CONNECTED\r\n Metrics.postEvent({event: eventType.ICE_END, meeting});\r\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.CONNECTION_SUCCESS, {\r\n correlation_id: meeting.correlationId,\r\n locus_id: meeting.locusId,\r\n });\r\n meeting.setNetworkStatus(NETWORK_STATUS.CONNECTED);\r\n meeting.reconnectionManager.iceReconnected();\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CONNECTED.'\r\n );\r\n break;\r\n case ICE_STATE.CLOSED:\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CLOSED.'\r\n );\r\n break;\r\n case ICE_STATE.DISCONNECTED:\r\n meeting.setNetworkStatus(NETWORK_STATUS.DISCONNECTED);\r\n meeting.reconnectionManager.waitForIceReconnect().catch(() => {\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE DISCONNECTED. Automatic Reconnection Timed Out.'\r\n );\r\n\r\n connectionFailed();\r\n });\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE DISCONNECTED.'\r\n );\r\n break;\r\n case ICE_STATE.FAILED:\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE FAILED.'\r\n );\r\n // notify of ice failure\r\n // Ice failure is the only indicator currently for identifying the actual connection drop\r\n // Firefox takes sometime 10-15 seconds to go to failed state\r\n connectionFailed();\r\n break;\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n peerConnection.onconnectionstatechange = () => {\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CHANGE.'\r\n );\r\n switch (peerConnection.connectionState) {\r\n case CONNECTION_STATE.NEW:\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE NEW.'\r\n );\r\n break;\r\n case CONNECTION_STATE.CONNECTING:\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CONNECTING.'\r\n );\r\n break;\r\n case CONNECTION_STATE.CONNECTED:\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CONNECTED.'\r\n );\r\n break;\r\n case CONNECTION_STATE.CLOSED:\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CLOSED.'\r\n );\r\n break;\r\n case CONNECTION_STATE.DISCONNECTED:\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE DISCONNECTED.'\r\n );\r\n break;\r\n case CONNECTION_STATE.FAILED:\r\n LoggerProxy.logger.info(\r\n 'PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE FAILED.'\r\n );\r\n // Special case happens only on chrome where there is no ICE FAILED event\r\n // only CONNECTION FAILED event gets triggered\r\n\r\n connectionFailed();\r\n break;\r\n default:\r\n break;\r\n }\r\n };\r\n};\r\n\r\nexport default pc;\r\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- interface IPeerConnectionUtils {
2
- convertCLineToIpv4: (sdp: string) => string;
3
- adjustH264Profile: (sdp: string, maxFsValue: number) => string;
4
- }
5
- declare const PeerConnectionUtils: IPeerConnectionUtils;
6
- export default PeerConnectionUtils;
1
+ interface IPeerConnectionUtils {
2
+ convertCLineToIpv4: (sdp: string) => string;
3
+ adjustH264Profile: (sdp: string, maxFsValue: number) => string;
4
+ }
5
+ declare const PeerConnectionUtils: IPeerConnectionUtils;
6
+ export default PeerConnectionUtils;
@@ -35,10 +35,10 @@ var maxFsForProfileLevel = {
35
35
  };
36
36
  var framesPerSecond = 30;
37
37
 
38
- /**
39
- * Convert C line to IPv4
40
- * @param {string} sdp
41
- * @returns {string}
38
+ /**
39
+ * Convert C line to IPv4
40
+ * @param {string} sdp
41
+ * @returns {string}
42
42
  */
43
43
  PeerConnectionUtils.convertCLineToIpv4 = function (sdp) {
44
44
  var replaceSdp = sdp;
@@ -50,11 +50,11 @@ PeerConnectionUtils.convertCLineToIpv4 = function (sdp) {
50
50
  return replaceSdp;
51
51
  };
52
52
 
53
- /**
54
- * estimate profile levels for max-fs & max-mbps values
55
- * @param {string} sdp
56
- * @param {number} maxFsValue
57
- * @returns {string}
53
+ /**
54
+ * estimate profile levels for max-fs & max-mbps values
55
+ * @param {string} sdp
56
+ * @param {number} maxFsValue
57
+ * @returns {string}
58
58
  */
59
59
  PeerConnectionUtils.adjustH264Profile = function (sdp, maxFsValue) {
60
60
  // converting with ts-sdp parser, no munging
@@ -1 +1 @@
1
- {"version":3,"names":["_tsSdp","require","PeerConnectionUtils","maxFsForProfileLevel","framesPerSecond","convertCLineToIpv4","sdp","replaceSdp","replace","adjustH264Profile","maxFsValue","parsedSdp","parse","avMedia","forEach","media","type","codecs","codec","_codec$name","name","toUpperCase","fmtParams","map","fmtp","parsedRegex","match","length","stuffBeforeProfileLevelId","profile","toLowerCase","levelId","_parseInt2","default","stuffAfterProfileLevelId","Error","concat","newLevelId","_keys","reverse","find","key","newLevelIdHex","toString","_default","exports"],"sources":["util.ts"],"sourcesContent":["import {parse} from '@webex/ts-sdp';\n\ninterface IPeerConnectionUtils {\n convertCLineToIpv4: (sdp: string) => string;\n adjustH264Profile: (sdp: string, maxFsValue: number) => string;\n}\n\nconst PeerConnectionUtils = {} as IPeerConnectionUtils;\n\n// max-fs values for all H264 profile levels\nconst maxFsForProfileLevel = {\n 10: 99,\n 11: 396,\n 12: 396,\n 13: 396,\n 20: 396,\n 21: 792,\n 22: 1620,\n 30: 1620,\n 31: 3600,\n 32: 5120,\n 40: 8192,\n 41: 8192,\n 42: 8704,\n 50: 22080,\n 51: 36864,\n 52: 36864,\n 60: 139264,\n 61: 139264,\n 62: 139264,\n};\n\nconst framesPerSecond = 30;\n\n/**\n * Convert C line to IPv4\n * @param {string} sdp\n * @returns {string}\n */\nPeerConnectionUtils.convertCLineToIpv4 = (sdp: string) => {\n let replaceSdp = sdp;\n\n // TODO: remove this once linus supports Ipv6 c line.currently linus rejects SDP with c line having ipv6 candidates we are\n // mocking ipv6 to ipv4 candidates\n // https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-299232\n replaceSdp = replaceSdp.replace(/c=IN IP6 .*/gi, 'c=IN IP4 0.0.0.0');\n\n return replaceSdp;\n};\n\n/**\n * estimate profile levels for max-fs & max-mbps values\n * @param {string} sdp\n * @param {number} maxFsValue\n * @returns {string}\n */\nPeerConnectionUtils.adjustH264Profile = (sdp: string, maxFsValue: number) => {\n // converting with ts-sdp parser, no munging\n const parsedSdp = parse(sdp);\n\n parsedSdp.avMedia.forEach((media) => {\n if (media.type === 'video') {\n media.codecs.forEach((codec) => {\n if (codec.name?.toUpperCase() === 'H264') {\n // there should really be just 1 fmtp line, but just in case, we process all of them\n codec.fmtParams = codec.fmtParams.map((fmtp) => {\n const parsedRegex = fmtp.match(/(.*)profile-level-id=(\\w{4})(\\w{2})(.*)/);\n\n if (parsedRegex && parsedRegex.length === 5) {\n const stuffBeforeProfileLevelId = parsedRegex[1];\n const profile = parsedRegex[2].toLowerCase();\n const levelId = parseInt(parsedRegex[3], 16);\n const stuffAfterProfileLevelId = parsedRegex[4];\n\n if (!maxFsForProfileLevel[levelId]) {\n throw new Error(\n `found unsupported h264 profile level id value in the SDP: ${levelId}`\n );\n }\n\n if (maxFsForProfileLevel[levelId] === maxFsValue) {\n // profile level already matches our desired max-fs value, so we don't need to do anything\n return fmtp;\n }\n if (maxFsForProfileLevel[levelId] < maxFsValue) {\n // profile level has too low max-fs, so we need to override it (this is upgrading)\n return `${fmtp};max-fs=${maxFsValue};max-mbps=${maxFsValue * framesPerSecond}`;\n }\n\n // profile level has too high max-fs value, so we need to use a lower level\n\n // find highest level that has the matching maxFs\n const newLevelId = Object.keys(maxFsForProfileLevel)\n .reverse()\n .find((key) => maxFsForProfileLevel[key] === maxFsValue);\n\n if (newLevelId) {\n // Object.keys returns keys as strings, so we need to parse it to an int again and then convert to hex\n const newLevelIdHex = parseInt(newLevelId, 10).toString(16);\n\n return `${stuffBeforeProfileLevelId}profile-level-id=${profile}${newLevelIdHex};max-mbps=${\n maxFsValue * framesPerSecond\n }${stuffAfterProfileLevelId}`;\n }\n\n throw new Error(`unsupported maxFsValue: ${maxFsValue}`);\n }\n\n return fmtp;\n });\n }\n });\n }\n });\n\n return parsedSdp.toString();\n};\n\nexport default PeerConnectionUtils;\n"],"mappings":"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"}
1
+ {"version":3,"names":["_tsSdp","require","PeerConnectionUtils","maxFsForProfileLevel","framesPerSecond","convertCLineToIpv4","sdp","replaceSdp","replace","adjustH264Profile","maxFsValue","parsedSdp","parse","avMedia","forEach","media","type","codecs","codec","_codec$name","name","toUpperCase","fmtParams","map","fmtp","parsedRegex","match","length","stuffBeforeProfileLevelId","profile","toLowerCase","levelId","_parseInt2","default","stuffAfterProfileLevelId","Error","concat","newLevelId","_keys","reverse","find","key","newLevelIdHex","toString","_default","exports"],"sources":["util.ts"],"sourcesContent":["import {parse} from '@webex/ts-sdp';\r\n\r\ninterface IPeerConnectionUtils {\r\n convertCLineToIpv4: (sdp: string) => string;\r\n adjustH264Profile: (sdp: string, maxFsValue: number) => string;\r\n}\r\n\r\nconst PeerConnectionUtils = {} as IPeerConnectionUtils;\r\n\r\n// max-fs values for all H264 profile levels\r\nconst maxFsForProfileLevel = {\r\n 10: 99,\r\n 11: 396,\r\n 12: 396,\r\n 13: 396,\r\n 20: 396,\r\n 21: 792,\r\n 22: 1620,\r\n 30: 1620,\r\n 31: 3600,\r\n 32: 5120,\r\n 40: 8192,\r\n 41: 8192,\r\n 42: 8704,\r\n 50: 22080,\r\n 51: 36864,\r\n 52: 36864,\r\n 60: 139264,\r\n 61: 139264,\r\n 62: 139264,\r\n};\r\n\r\nconst framesPerSecond = 30;\r\n\r\n/**\r\n * Convert C line to IPv4\r\n * @param {string} sdp\r\n * @returns {string}\r\n */\r\nPeerConnectionUtils.convertCLineToIpv4 = (sdp: string) => {\r\n let replaceSdp = sdp;\r\n\r\n // TODO: remove this once linus supports Ipv6 c line.currently linus rejects SDP with c line having ipv6 candidates we are\r\n // mocking ipv6 to ipv4 candidates\r\n // https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-299232\r\n replaceSdp = replaceSdp.replace(/c=IN IP6 .*/gi, 'c=IN IP4 0.0.0.0');\r\n\r\n return replaceSdp;\r\n};\r\n\r\n/**\r\n * estimate profile levels for max-fs & max-mbps values\r\n * @param {string} sdp\r\n * @param {number} maxFsValue\r\n * @returns {string}\r\n */\r\nPeerConnectionUtils.adjustH264Profile = (sdp: string, maxFsValue: number) => {\r\n // converting with ts-sdp parser, no munging\r\n const parsedSdp = parse(sdp);\r\n\r\n parsedSdp.avMedia.forEach((media) => {\r\n if (media.type === 'video') {\r\n media.codecs.forEach((codec) => {\r\n if (codec.name?.toUpperCase() === 'H264') {\r\n // there should really be just 1 fmtp line, but just in case, we process all of them\r\n codec.fmtParams = codec.fmtParams.map((fmtp) => {\r\n const parsedRegex = fmtp.match(/(.*)profile-level-id=(\\w{4})(\\w{2})(.*)/);\r\n\r\n if (parsedRegex && parsedRegex.length === 5) {\r\n const stuffBeforeProfileLevelId = parsedRegex[1];\r\n const profile = parsedRegex[2].toLowerCase();\r\n const levelId = parseInt(parsedRegex[3], 16);\r\n const stuffAfterProfileLevelId = parsedRegex[4];\r\n\r\n if (!maxFsForProfileLevel[levelId]) {\r\n throw new Error(\r\n `found unsupported h264 profile level id value in the SDP: ${levelId}`\r\n );\r\n }\r\n\r\n if (maxFsForProfileLevel[levelId] === maxFsValue) {\r\n // profile level already matches our desired max-fs value, so we don't need to do anything\r\n return fmtp;\r\n }\r\n if (maxFsForProfileLevel[levelId] < maxFsValue) {\r\n // profile level has too low max-fs, so we need to override it (this is upgrading)\r\n return `${fmtp};max-fs=${maxFsValue};max-mbps=${maxFsValue * framesPerSecond}`;\r\n }\r\n\r\n // profile level has too high max-fs value, so we need to use a lower level\r\n\r\n // find highest level that has the matching maxFs\r\n const newLevelId = Object.keys(maxFsForProfileLevel)\r\n .reverse()\r\n .find((key) => maxFsForProfileLevel[key] === maxFsValue);\r\n\r\n if (newLevelId) {\r\n // Object.keys returns keys as strings, so we need to parse it to an int again and then convert to hex\r\n const newLevelIdHex = parseInt(newLevelId, 10).toString(16);\r\n\r\n return `${stuffBeforeProfileLevelId}profile-level-id=${profile}${newLevelIdHex};max-mbps=${\r\n maxFsValue * framesPerSecond\r\n }${stuffAfterProfileLevelId}`;\r\n }\r\n\r\n throw new Error(`unsupported maxFsValue: ${maxFsValue}`);\r\n }\r\n\r\n return fmtp;\r\n });\r\n }\r\n });\r\n }\r\n });\r\n\r\n return parsedSdp.toString();\r\n};\r\n\r\nexport default PeerConnectionUtils;\r\n"],"mappings":"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"}
@@ -1,47 +1,47 @@
1
- import { StatelessWebexPlugin } from '@webex/webex-core';
2
- /**
3
- * @class PersonalMeetingRoom
4
- */
5
- export default class PersonalMeetingRoom extends StatelessWebexPlugin {
6
- link: any;
7
- meetingInfo: any;
8
- name: any;
9
- personalMeetingRoomRequest: any;
10
- pmr: any;
11
- sipUri: any;
12
- userId: any;
13
- meetingLink: any;
14
- number: any;
15
- namespace: string;
16
- /**
17
- *
18
- * @param {Object} attrs
19
- * @param {Object} options
20
- */
21
- constructor(attrs: any, options: any);
22
- /**
23
- * claims a pmr and updates the cached PMR values
24
- * @param {String} link
25
- * @param {String} pin
26
- * @param {Boolean} [preferred] defaults to true to set this claimed PMR as the preferred
27
- * @returns {Promise}
28
- * @public
29
- * @memberof PersonalMeetingRoom
30
- */
31
- claim(link: string, pin: string, preferred?: boolean): any;
32
- /**
33
- * @param {Object} body the response body from meeting info request
34
- * @returns {undefined}
35
- * @private
36
- * @memberof PersonalMeetingRoom
37
- */
38
- private set;
39
- /**
40
- * TODO: implement TTL for syncing and caching so to not request again and again
41
- * @param {Object} options
42
- * @returns {Promise}
43
- * @public
44
- * @memberof PersonalMeetingRoom
45
- */
46
- get(): any;
47
- }
1
+ import { StatelessWebexPlugin } from '@webex/webex-core';
2
+ /**
3
+ * @class PersonalMeetingRoom
4
+ */
5
+ export default class PersonalMeetingRoom extends StatelessWebexPlugin {
6
+ link: any;
7
+ meetingInfo: any;
8
+ name: any;
9
+ personalMeetingRoomRequest: any;
10
+ pmr: any;
11
+ sipUri: any;
12
+ userId: any;
13
+ meetingLink: any;
14
+ number: any;
15
+ namespace: string;
16
+ /**
17
+ *
18
+ * @param {Object} attrs
19
+ * @param {Object} options
20
+ */
21
+ constructor(attrs: any, options: any);
22
+ /**
23
+ * claims a pmr and updates the cached PMR values
24
+ * @param {String} link
25
+ * @param {String} pin
26
+ * @param {Boolean} [preferred] defaults to true to set this claimed PMR as the preferred
27
+ * @returns {Promise}
28
+ * @public
29
+ * @memberof PersonalMeetingRoom
30
+ */
31
+ claim(link: string, pin: string, preferred?: boolean): any;
32
+ /**
33
+ * @param {Object} body the response body from meeting info request
34
+ * @returns {undefined}
35
+ * @private
36
+ * @memberof PersonalMeetingRoom
37
+ */
38
+ private set;
39
+ /**
40
+ * TODO: implement TTL for syncing and caching so to not request again and again
41
+ * @param {Object} options
42
+ * @returns {Promise}
43
+ * @public
44
+ * @memberof PersonalMeetingRoom
45
+ */
46
+ get(): any;
47
+ }
@@ -21,27 +21,27 @@ var _parameter = _interopRequireDefault(require("../common/errors/parameter"));
21
21
  var _request = _interopRequireDefault(require("./request"));
22
22
  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); }; }
23
23
  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; } }
24
- /**
25
- * @class PersonalMeetingRoom
24
+ /**
25
+ * @class PersonalMeetingRoom
26
26
  */
27
27
  var PersonalMeetingRoom = /*#__PURE__*/function (_StatelessWebexPlugin) {
28
28
  (0, _inherits2.default)(PersonalMeetingRoom, _StatelessWebexPlugin);
29
29
  var _super = _createSuper(PersonalMeetingRoom);
30
- /**
31
- *
32
- * @param {Object} attrs
33
- * @param {Object} options
30
+ /**
31
+ *
32
+ * @param {Object} attrs
33
+ * @param {Object} options
34
34
  */
35
35
  function PersonalMeetingRoom(attrs, options) {
36
36
  var _this;
37
37
  (0, _classCallCheck2.default)(this, PersonalMeetingRoom);
38
38
  _this = _super.call(this, {}, options);
39
- /**
40
- * The pmr server object
41
- * @instance
42
- * @type {Object}
43
- * @public
44
- * @memberof PersonalMeetingRoom
39
+ /**
40
+ * The pmr server object
41
+ * @instance
42
+ * @type {Object}
43
+ * @public
44
+ * @memberof PersonalMeetingRoom
45
45
  */
46
46
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "link", void 0);
47
47
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "meetingInfo", void 0);
@@ -54,66 +54,66 @@ var PersonalMeetingRoom = /*#__PURE__*/function (_StatelessWebexPlugin) {
54
54
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "number", void 0);
55
55
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "namespace", _constants.MEETINGS);
56
56
  _this.pmr = null;
57
- /**
58
- * The pmr sip Uri
59
- * @instance
60
- * @type {String}
61
- * @public
62
- * @memberof PersonalMeetingRoom
57
+ /**
58
+ * The pmr sip Uri
59
+ * @instance
60
+ * @type {String}
61
+ * @public
62
+ * @memberof PersonalMeetingRoom
63
63
  */
64
64
  _this.sipUri = null;
65
- /**
66
- * The pmr link
67
- * @instance
68
- * @type {String}
69
- * @public
70
- * @memberof PersonalMeetingRoom
65
+ /**
66
+ * The pmr link
67
+ * @instance
68
+ * @type {String}
69
+ * @public
70
+ * @memberof PersonalMeetingRoom
71
71
  */
72
72
  _this.link = null;
73
- /**
74
- * The pmr server object
75
- * @instance
76
- * @type {Object}
77
- * @public
78
- * @memberof PersonalMeetingRoom
73
+ /**
74
+ * The pmr server object
75
+ * @instance
76
+ * @type {Object}
77
+ * @public
78
+ * @memberof PersonalMeetingRoom
79
79
  */
80
80
  _this.userId = null;
81
- /**
82
- * The pmr name
83
- * @instance
84
- * @type {String}
85
- * @public
86
- * @memberof PersonalMeetingRoom
81
+ /**
82
+ * The pmr name
83
+ * @instance
84
+ * @type {String}
85
+ * @public
86
+ * @memberof PersonalMeetingRoom
87
87
  */
88
88
  _this.name = null;
89
- /**
90
- * The meeting info request server interface
91
- * @instance
92
- * @type {MeetingInfo}
93
- * @private
94
- * @memberof PersonalMeetingRoom
89
+ /**
90
+ * The meeting info request server interface
91
+ * @instance
92
+ * @type {MeetingInfo}
93
+ * @private
94
+ * @memberof PersonalMeetingRoom
95
95
  */
96
96
  _this.meetingInfo = attrs.meetingInfo;
97
- /**
98
- * The pmr server request interface
99
- * @instance
100
- * @type {Object}
101
- * @private
102
- * @memberof PersonalMeetingRoom
97
+ /**
98
+ * The pmr server request interface
99
+ * @instance
100
+ * @type {Object}
101
+ * @private
102
+ * @memberof PersonalMeetingRoom
103
103
  */
104
104
  // @ts-ignore
105
105
  _this.personalMeetingRoomRequest = new _request.default({}, options);
106
106
  return _this;
107
107
  }
108
108
 
109
- /**
110
- * claims a pmr and updates the cached PMR values
111
- * @param {String} link
112
- * @param {String} pin
113
- * @param {Boolean} [preferred] defaults to true to set this claimed PMR as the preferred
114
- * @returns {Promise}
115
- * @public
116
- * @memberof PersonalMeetingRoom
109
+ /**
110
+ * claims a pmr and updates the cached PMR values
111
+ * @param {String} link
112
+ * @param {String} pin
113
+ * @param {Boolean} [preferred] defaults to true to set this claimed PMR as the preferred
114
+ * @returns {Promise}
115
+ * @public
116
+ * @memberof PersonalMeetingRoom
117
117
  */
118
118
  (0, _createClass2.default)(PersonalMeetingRoom, [{
119
119
  key: "claim",
@@ -137,11 +137,11 @@ var PersonalMeetingRoom = /*#__PURE__*/function (_StatelessWebexPlugin) {
137
137
  });
138
138
  }
139
139
 
140
- /**
141
- * @param {Object} body the response body from meeting info request
142
- * @returns {undefined}
143
- * @private
144
- * @memberof PersonalMeetingRoom
140
+ /**
141
+ * @param {Object} body the response body from meeting info request
142
+ * @returns {undefined}
143
+ * @private
144
+ * @memberof PersonalMeetingRoom
145
145
  */
146
146
  }, {
147
147
  key: "set",
@@ -154,12 +154,12 @@ var PersonalMeetingRoom = /*#__PURE__*/function (_StatelessWebexPlugin) {
154
154
  this.number = body.meetingNumber;
155
155
  }
156
156
 
157
- /**
158
- * TODO: implement TTL for syncing and caching so to not request again and again
159
- * @param {Object} options
160
- * @returns {Promise}
161
- * @public
162
- * @memberof PersonalMeetingRoom
157
+ /**
158
+ * TODO: implement TTL for syncing and caching so to not request again and again
159
+ * @param {Object} options
160
+ * @returns {Promise}
161
+ * @public
162
+ * @memberof PersonalMeetingRoom
163
163
  */
164
164
  }, {
165
165
  key: "get",