@sentry/browser-utils 10.58.0

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 (312) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -0
  3. package/build/cjs/debug-build.js +6 -0
  4. package/build/cjs/debug-build.js.map +1 -0
  5. package/build/cjs/getNativeImplementation.js +51 -0
  6. package/build/cjs/getNativeImplementation.js.map +1 -0
  7. package/build/cjs/htmlTreeAsString.js +110 -0
  8. package/build/cjs/htmlTreeAsString.js.map +1 -0
  9. package/build/cjs/index.js +54 -0
  10. package/build/cjs/index.js.map +1 -0
  11. package/build/cjs/instrument/dom.js +137 -0
  12. package/build/cjs/instrument/dom.js.map +1 -0
  13. package/build/cjs/instrument/history.js +56 -0
  14. package/build/cjs/instrument/history.js.map +1 -0
  15. package/build/cjs/instrument/xhr.js +108 -0
  16. package/build/cjs/instrument/xhr.js.map +1 -0
  17. package/build/cjs/is.js +15 -0
  18. package/build/cjs/is.js.map +1 -0
  19. package/build/cjs/metrics/browserMetrics.js +535 -0
  20. package/build/cjs/metrics/browserMetrics.js.map +1 -0
  21. package/build/cjs/metrics/cls.js +64 -0
  22. package/build/cjs/metrics/cls.js.map +1 -0
  23. package/build/cjs/metrics/elementTiming.js +72 -0
  24. package/build/cjs/metrics/elementTiming.js.map +1 -0
  25. package/build/cjs/metrics/inp.js +170 -0
  26. package/build/cjs/metrics/inp.js.map +1 -0
  27. package/build/cjs/metrics/instrument.js +152 -0
  28. package/build/cjs/metrics/instrument.js.map +1 -0
  29. package/build/cjs/metrics/lcp.js +77 -0
  30. package/build/cjs/metrics/lcp.js.map +1 -0
  31. package/build/cjs/metrics/resourceTiming.js +44 -0
  32. package/build/cjs/metrics/resourceTiming.js.map +1 -0
  33. package/build/cjs/metrics/utils.js +137 -0
  34. package/build/cjs/metrics/utils.js.map +1 -0
  35. package/build/cjs/metrics/web-vitals/getCLS.js +46 -0
  36. package/build/cjs/metrics/web-vitals/getCLS.js.map +1 -0
  37. package/build/cjs/metrics/web-vitals/getINP.js +60 -0
  38. package/build/cjs/metrics/web-vitals/getINP.js.map +1 -0
  39. package/build/cjs/metrics/web-vitals/getLCP.js +62 -0
  40. package/build/cjs/metrics/web-vitals/getLCP.js.map +1 -0
  41. package/build/cjs/metrics/web-vitals/lib/InteractionManager.js +87 -0
  42. package/build/cjs/metrics/web-vitals/lib/InteractionManager.js.map +1 -0
  43. package/build/cjs/metrics/web-vitals/lib/LCPEntryManager.js +11 -0
  44. package/build/cjs/metrics/web-vitals/lib/LCPEntryManager.js.map +1 -0
  45. package/build/cjs/metrics/web-vitals/lib/LayoutShiftManager.js +27 -0
  46. package/build/cjs/metrics/web-vitals/lib/LayoutShiftManager.js.map +1 -0
  47. package/build/cjs/metrics/web-vitals/lib/bindReporter.js +31 -0
  48. package/build/cjs/metrics/web-vitals/lib/bindReporter.js.map +1 -0
  49. package/build/cjs/metrics/web-vitals/lib/generateUniqueID.js +8 -0
  50. package/build/cjs/metrics/web-vitals/lib/generateUniqueID.js.map +1 -0
  51. package/build/cjs/metrics/web-vitals/lib/getActivationStart.js +11 -0
  52. package/build/cjs/metrics/web-vitals/lib/getActivationStart.js.map +1 -0
  53. package/build/cjs/metrics/web-vitals/lib/getNavigationEntry.js +17 -0
  54. package/build/cjs/metrics/web-vitals/lib/getNavigationEntry.js.map +1 -0
  55. package/build/cjs/metrics/web-vitals/lib/getVisibilityWatcher.js +48 -0
  56. package/build/cjs/metrics/web-vitals/lib/getVisibilityWatcher.js.map +1 -0
  57. package/build/cjs/metrics/web-vitals/lib/globalListeners.js +18 -0
  58. package/build/cjs/metrics/web-vitals/lib/globalListeners.js.map +1 -0
  59. package/build/cjs/metrics/web-vitals/lib/initMetric.js +34 -0
  60. package/build/cjs/metrics/web-vitals/lib/initMetric.js.map +1 -0
  61. package/build/cjs/metrics/web-vitals/lib/initUnique.js +16 -0
  62. package/build/cjs/metrics/web-vitals/lib/initUnique.js.map +1 -0
  63. package/build/cjs/metrics/web-vitals/lib/observe.js +20 -0
  64. package/build/cjs/metrics/web-vitals/lib/observe.js.map +1 -0
  65. package/build/cjs/metrics/web-vitals/lib/onHidden.js +17 -0
  66. package/build/cjs/metrics/web-vitals/lib/onHidden.js.map +1 -0
  67. package/build/cjs/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js +32 -0
  68. package/build/cjs/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js.map +1 -0
  69. package/build/cjs/metrics/web-vitals/lib/runOnce.js +14 -0
  70. package/build/cjs/metrics/web-vitals/lib/runOnce.js.map +1 -0
  71. package/build/cjs/metrics/web-vitals/lib/whenActivated.js +14 -0
  72. package/build/cjs/metrics/web-vitals/lib/whenActivated.js.map +1 -0
  73. package/build/cjs/metrics/web-vitals/lib/whenIdleOrHidden.js +24 -0
  74. package/build/cjs/metrics/web-vitals/lib/whenIdleOrHidden.js.map +1 -0
  75. package/build/cjs/metrics/web-vitals/onFCP.js +37 -0
  76. package/build/cjs/metrics/web-vitals/onFCP.js.map +1 -0
  77. package/build/cjs/metrics/web-vitals/onTTFB.js +35 -0
  78. package/build/cjs/metrics/web-vitals/onTTFB.js.map +1 -0
  79. package/build/cjs/metrics/webVitalSpans.js +199 -0
  80. package/build/cjs/metrics/webVitalSpans.js.map +1 -0
  81. package/build/cjs/networkUtils.js +70 -0
  82. package/build/cjs/networkUtils.js.map +1 -0
  83. package/build/cjs/types.js +8 -0
  84. package/build/cjs/types.js.map +1 -0
  85. package/build/esm/debug-build.js +4 -0
  86. package/build/esm/debug-build.js.map +1 -0
  87. package/build/esm/getNativeImplementation.js +46 -0
  88. package/build/esm/getNativeImplementation.js.map +1 -0
  89. package/build/esm/htmlTreeAsString.js +108 -0
  90. package/build/esm/htmlTreeAsString.js.map +1 -0
  91. package/build/esm/index.js +15 -0
  92. package/build/esm/index.js.map +1 -0
  93. package/build/esm/instrument/dom.js +134 -0
  94. package/build/esm/instrument/dom.js.map +1 -0
  95. package/build/esm/instrument/history.js +53 -0
  96. package/build/esm/instrument/history.js.map +1 -0
  97. package/build/esm/instrument/xhr.js +104 -0
  98. package/build/esm/instrument/xhr.js.map +1 -0
  99. package/build/esm/is.js +13 -0
  100. package/build/esm/is.js.map +1 -0
  101. package/build/esm/metrics/browserMetrics.js +524 -0
  102. package/build/esm/metrics/browserMetrics.js.map +1 -0
  103. package/build/esm/metrics/cls.js +61 -0
  104. package/build/esm/metrics/cls.js.map +1 -0
  105. package/build/esm/metrics/elementTiming.js +69 -0
  106. package/build/esm/metrics/elementTiming.js.map +1 -0
  107. package/build/esm/metrics/inp.js +162 -0
  108. package/build/esm/metrics/inp.js.map +1 -0
  109. package/build/esm/metrics/instrument.js +145 -0
  110. package/build/esm/metrics/instrument.js.map +1 -0
  111. package/build/esm/metrics/lcp.js +72 -0
  112. package/build/esm/metrics/lcp.js.map +1 -0
  113. package/build/esm/metrics/resourceTiming.js +42 -0
  114. package/build/esm/metrics/resourceTiming.js.map +1 -0
  115. package/build/esm/metrics/utils.js +128 -0
  116. package/build/esm/metrics/utils.js.map +1 -0
  117. package/build/esm/metrics/web-vitals/getCLS.js +43 -0
  118. package/build/esm/metrics/web-vitals/getCLS.js.map +1 -0
  119. package/build/esm/metrics/web-vitals/getINP.js +57 -0
  120. package/build/esm/metrics/web-vitals/getINP.js.map +1 -0
  121. package/build/esm/metrics/web-vitals/getLCP.js +59 -0
  122. package/build/esm/metrics/web-vitals/getLCP.js.map +1 -0
  123. package/build/esm/metrics/web-vitals/lib/InteractionManager.js +85 -0
  124. package/build/esm/metrics/web-vitals/lib/InteractionManager.js.map +1 -0
  125. package/build/esm/metrics/web-vitals/lib/LCPEntryManager.js +9 -0
  126. package/build/esm/metrics/web-vitals/lib/LCPEntryManager.js.map +1 -0
  127. package/build/esm/metrics/web-vitals/lib/LayoutShiftManager.js +25 -0
  128. package/build/esm/metrics/web-vitals/lib/LayoutShiftManager.js.map +1 -0
  129. package/build/esm/metrics/web-vitals/lib/bindReporter.js +29 -0
  130. package/build/esm/metrics/web-vitals/lib/bindReporter.js.map +1 -0
  131. package/build/esm/metrics/web-vitals/lib/generateUniqueID.js +6 -0
  132. package/build/esm/metrics/web-vitals/lib/generateUniqueID.js.map +1 -0
  133. package/build/esm/metrics/web-vitals/lib/getActivationStart.js +9 -0
  134. package/build/esm/metrics/web-vitals/lib/getActivationStart.js.map +1 -0
  135. package/build/esm/metrics/web-vitals/lib/getNavigationEntry.js +15 -0
  136. package/build/esm/metrics/web-vitals/lib/getNavigationEntry.js.map +1 -0
  137. package/build/esm/metrics/web-vitals/lib/getVisibilityWatcher.js +46 -0
  138. package/build/esm/metrics/web-vitals/lib/getVisibilityWatcher.js.map +1 -0
  139. package/build/esm/metrics/web-vitals/lib/globalListeners.js +15 -0
  140. package/build/esm/metrics/web-vitals/lib/globalListeners.js.map +1 -0
  141. package/build/esm/metrics/web-vitals/lib/initMetric.js +32 -0
  142. package/build/esm/metrics/web-vitals/lib/initMetric.js.map +1 -0
  143. package/build/esm/metrics/web-vitals/lib/initUnique.js +14 -0
  144. package/build/esm/metrics/web-vitals/lib/initUnique.js.map +1 -0
  145. package/build/esm/metrics/web-vitals/lib/observe.js +18 -0
  146. package/build/esm/metrics/web-vitals/lib/observe.js.map +1 -0
  147. package/build/esm/metrics/web-vitals/lib/onHidden.js +15 -0
  148. package/build/esm/metrics/web-vitals/lib/onHidden.js.map +1 -0
  149. package/build/esm/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js +29 -0
  150. package/build/esm/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js.map +1 -0
  151. package/build/esm/metrics/web-vitals/lib/runOnce.js +12 -0
  152. package/build/esm/metrics/web-vitals/lib/runOnce.js.map +1 -0
  153. package/build/esm/metrics/web-vitals/lib/whenActivated.js +12 -0
  154. package/build/esm/metrics/web-vitals/lib/whenActivated.js.map +1 -0
  155. package/build/esm/metrics/web-vitals/lib/whenIdleOrHidden.js +22 -0
  156. package/build/esm/metrics/web-vitals/lib/whenIdleOrHidden.js.map +1 -0
  157. package/build/esm/metrics/web-vitals/onFCP.js +34 -0
  158. package/build/esm/metrics/web-vitals/onFCP.js.map +1 -0
  159. package/build/esm/metrics/web-vitals/onTTFB.js +32 -0
  160. package/build/esm/metrics/web-vitals/onTTFB.js.map +1 -0
  161. package/build/esm/metrics/webVitalSpans.js +191 -0
  162. package/build/esm/metrics/webVitalSpans.js.map +1 -0
  163. package/build/esm/networkUtils.js +64 -0
  164. package/build/esm/networkUtils.js.map +1 -0
  165. package/build/esm/package.json +1 -0
  166. package/build/esm/types.js +6 -0
  167. package/build/esm/types.js.map +1 -0
  168. package/build/types/debug-build.d.ts +7 -0
  169. package/build/types/debug-build.d.ts.map +1 -0
  170. package/build/types/getNativeImplementation.d.ts +69 -0
  171. package/build/types/getNativeImplementation.d.ts.map +1 -0
  172. package/build/types/htmlTreeAsString.d.ts +11 -0
  173. package/build/types/htmlTreeAsString.d.ts.map +1 -0
  174. package/build/types/index.d.ts +15 -0
  175. package/build/types/index.d.ts.map +1 -0
  176. package/build/types/instrument/dom.d.ts +11 -0
  177. package/build/types/instrument/dom.d.ts.map +1 -0
  178. package/build/types/instrument/history.d.ts +15 -0
  179. package/build/types/instrument/history.d.ts.map +1 -0
  180. package/build/types/instrument/xhr.d.ts +14 -0
  181. package/build/types/instrument/xhr.d.ts.map +1 -0
  182. package/build/types/is.d.ts +7 -0
  183. package/build/types/is.d.ts.map +1 -0
  184. package/build/types/metrics/browserMetrics.d.ts +116 -0
  185. package/build/types/metrics/browserMetrics.d.ts.map +1 -0
  186. package/build/types/metrics/cls.d.ts +17 -0
  187. package/build/types/metrics/cls.d.ts.map +1 -0
  188. package/build/types/metrics/elementTiming.d.ts +19 -0
  189. package/build/types/metrics/elementTiming.d.ts.map +1 -0
  190. package/build/types/metrics/inp.d.ts +35 -0
  191. package/build/types/metrics/inp.d.ts.map +1 -0
  192. package/build/types/metrics/instrument.d.ts +121 -0
  193. package/build/types/metrics/instrument.d.ts.map +1 -0
  194. package/build/types/metrics/lcp.d.ts +22 -0
  195. package/build/types/metrics/lcp.d.ts.map +1 -0
  196. package/build/types/metrics/resourceTiming.d.ts +13 -0
  197. package/build/types/metrics/resourceTiming.d.ts.map +1 -0
  198. package/build/types/metrics/utils.d.ts +73 -0
  199. package/build/types/metrics/utils.d.ts.map +1 -0
  200. package/build/types/metrics/web-vitals/getCLS.d.ts +26 -0
  201. package/build/types/metrics/web-vitals/getCLS.d.ts.map +1 -0
  202. package/build/types/metrics/web-vitals/getINP.d.ts +34 -0
  203. package/build/types/metrics/web-vitals/getINP.d.ts.map +1 -0
  204. package/build/types/metrics/web-vitals/getLCP.d.ts +16 -0
  205. package/build/types/metrics/web-vitals/getLCP.d.ts.map +1 -0
  206. package/build/types/metrics/web-vitals/lib/InteractionManager.d.ts +37 -0
  207. package/build/types/metrics/web-vitals/lib/InteractionManager.d.ts.map +1 -0
  208. package/build/types/metrics/web-vitals/lib/LCPEntryManager.d.ts +5 -0
  209. package/build/types/metrics/web-vitals/lib/LCPEntryManager.d.ts.map +1 -0
  210. package/build/types/metrics/web-vitals/lib/LayoutShiftManager.d.ts +7 -0
  211. package/build/types/metrics/web-vitals/lib/LayoutShiftManager.d.ts.map +1 -0
  212. package/build/types/metrics/web-vitals/lib/bindReporter.d.ts +7 -0
  213. package/build/types/metrics/web-vitals/lib/bindReporter.d.ts.map +1 -0
  214. package/build/types/metrics/web-vitals/lib/generateUniqueID.d.ts +7 -0
  215. package/build/types/metrics/web-vitals/lib/generateUniqueID.d.ts.map +1 -0
  216. package/build/types/metrics/web-vitals/lib/getActivationStart.d.ts +2 -0
  217. package/build/types/metrics/web-vitals/lib/getActivationStart.d.ts.map +1 -0
  218. package/build/types/metrics/web-vitals/lib/getNavigationEntry.d.ts +2 -0
  219. package/build/types/metrics/web-vitals/lib/getNavigationEntry.d.ts.map +1 -0
  220. package/build/types/metrics/web-vitals/lib/getVisibilityWatcher.d.ts +5 -0
  221. package/build/types/metrics/web-vitals/lib/getVisibilityWatcher.d.ts.map +1 -0
  222. package/build/types/metrics/web-vitals/lib/globalListeners.d.ts +11 -0
  223. package/build/types/metrics/web-vitals/lib/globalListeners.d.ts.map +1 -0
  224. package/build/types/metrics/web-vitals/lib/initMetric.d.ts +21 -0
  225. package/build/types/metrics/web-vitals/lib/initMetric.d.ts.map +1 -0
  226. package/build/types/metrics/web-vitals/lib/initUnique.d.ts +7 -0
  227. package/build/types/metrics/web-vitals/lib/initUnique.d.ts.map +1 -0
  228. package/build/types/metrics/web-vitals/lib/observe.d.ts +23 -0
  229. package/build/types/metrics/web-vitals/lib/observe.d.ts.map +1 -0
  230. package/build/types/metrics/web-vitals/lib/onHidden.d.ts +27 -0
  231. package/build/types/metrics/web-vitals/lib/onHidden.d.ts.map +1 -0
  232. package/build/types/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.d.ts +15 -0
  233. package/build/types/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.d.ts.map +1 -0
  234. package/build/types/metrics/web-vitals/lib/runOnce.d.ts +2 -0
  235. package/build/types/metrics/web-vitals/lib/runOnce.d.ts.map +1 -0
  236. package/build/types/metrics/web-vitals/lib/whenActivated.d.ts +2 -0
  237. package/build/types/metrics/web-vitals/lib/whenActivated.d.ts.map +1 -0
  238. package/build/types/metrics/web-vitals/lib/whenIdleOrHidden.d.ts +6 -0
  239. package/build/types/metrics/web-vitals/lib/whenIdleOrHidden.d.ts.map +1 -0
  240. package/build/types/metrics/web-vitals/onFCP.d.ts +11 -0
  241. package/build/types/metrics/web-vitals/onFCP.d.ts.map +1 -0
  242. package/build/types/metrics/web-vitals/onTTFB.d.ts +20 -0
  243. package/build/types/metrics/web-vitals/onTTFB.d.ts.map +1 -0
  244. package/build/types/metrics/web-vitals/types/base.d.ts +103 -0
  245. package/build/types/metrics/web-vitals/types/base.d.ts.map +1 -0
  246. package/build/types/metrics/web-vitals/types/cls.d.ts +58 -0
  247. package/build/types/metrics/web-vitals/types/cls.d.ts.map +1 -0
  248. package/build/types/metrics/web-vitals/types/fcp.d.ts +47 -0
  249. package/build/types/metrics/web-vitals/types/fcp.d.ts.map +1 -0
  250. package/build/types/metrics/web-vitals/types/inp.d.ts +150 -0
  251. package/build/types/metrics/web-vitals/types/inp.d.ts.map +1 -0
  252. package/build/types/metrics/web-vitals/types/lcp.d.ts +74 -0
  253. package/build/types/metrics/web-vitals/types/lcp.d.ts.map +1 -0
  254. package/build/types/metrics/web-vitals/types/ttfb.d.ts +60 -0
  255. package/build/types/metrics/web-vitals/types/ttfb.d.ts.map +1 -0
  256. package/build/types/metrics/web-vitals/types.d.ts +78 -0
  257. package/build/types/metrics/web-vitals/types.d.ts.map +1 -0
  258. package/build/types/metrics/webVitalSpans.d.ts +65 -0
  259. package/build/types/metrics/webVitalSpans.d.ts.map +1 -0
  260. package/build/types/networkUtils.d.ts +25 -0
  261. package/build/types/networkUtils.d.ts.map +1 -0
  262. package/build/types/types.d.ts +15 -0
  263. package/build/types/types.d.ts.map +1 -0
  264. package/build/types-ts3.8/debug-build.d.ts +7 -0
  265. package/build/types-ts3.8/getNativeImplementation.d.ts +69 -0
  266. package/build/types-ts3.8/htmlTreeAsString.d.ts +11 -0
  267. package/build/types-ts3.8/index.d.ts +15 -0
  268. package/build/types-ts3.8/instrument/dom.d.ts +11 -0
  269. package/build/types-ts3.8/instrument/history.d.ts +15 -0
  270. package/build/types-ts3.8/instrument/xhr.d.ts +14 -0
  271. package/build/types-ts3.8/is.d.ts +7 -0
  272. package/build/types-ts3.8/metrics/browserMetrics.d.ts +119 -0
  273. package/build/types-ts3.8/metrics/cls.d.ts +17 -0
  274. package/build/types-ts3.8/metrics/elementTiming.d.ts +19 -0
  275. package/build/types-ts3.8/metrics/inp.d.ts +35 -0
  276. package/build/types-ts3.8/metrics/instrument.d.ts +121 -0
  277. package/build/types-ts3.8/metrics/lcp.d.ts +22 -0
  278. package/build/types-ts3.8/metrics/resourceTiming.d.ts +13 -0
  279. package/build/types-ts3.8/metrics/utils.d.ts +73 -0
  280. package/build/types-ts3.8/metrics/web-vitals/getCLS.d.ts +26 -0
  281. package/build/types-ts3.8/metrics/web-vitals/getINP.d.ts +34 -0
  282. package/build/types-ts3.8/metrics/web-vitals/getLCP.d.ts +16 -0
  283. package/build/types-ts3.8/metrics/web-vitals/lib/InteractionManager.d.ts +37 -0
  284. package/build/types-ts3.8/metrics/web-vitals/lib/LCPEntryManager.d.ts +5 -0
  285. package/build/types-ts3.8/metrics/web-vitals/lib/LayoutShiftManager.d.ts +7 -0
  286. package/build/types-ts3.8/metrics/web-vitals/lib/bindReporter.d.ts +7 -0
  287. package/build/types-ts3.8/metrics/web-vitals/lib/generateUniqueID.d.ts +7 -0
  288. package/build/types-ts3.8/metrics/web-vitals/lib/getActivationStart.d.ts +2 -0
  289. package/build/types-ts3.8/metrics/web-vitals/lib/getNavigationEntry.d.ts +2 -0
  290. package/build/types-ts3.8/metrics/web-vitals/lib/getVisibilityWatcher.d.ts +5 -0
  291. package/build/types-ts3.8/metrics/web-vitals/lib/globalListeners.d.ts +11 -0
  292. package/build/types-ts3.8/metrics/web-vitals/lib/initMetric.d.ts +21 -0
  293. package/build/types-ts3.8/metrics/web-vitals/lib/initUnique.d.ts +7 -0
  294. package/build/types-ts3.8/metrics/web-vitals/lib/observe.d.ts +23 -0
  295. package/build/types-ts3.8/metrics/web-vitals/lib/onHidden.d.ts +27 -0
  296. package/build/types-ts3.8/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.d.ts +15 -0
  297. package/build/types-ts3.8/metrics/web-vitals/lib/runOnce.d.ts +2 -0
  298. package/build/types-ts3.8/metrics/web-vitals/lib/whenActivated.d.ts +2 -0
  299. package/build/types-ts3.8/metrics/web-vitals/lib/whenIdleOrHidden.d.ts +6 -0
  300. package/build/types-ts3.8/metrics/web-vitals/onFCP.d.ts +11 -0
  301. package/build/types-ts3.8/metrics/web-vitals/onTTFB.d.ts +20 -0
  302. package/build/types-ts3.8/metrics/web-vitals/types/base.d.ts +106 -0
  303. package/build/types-ts3.8/metrics/web-vitals/types/cls.d.ts +58 -0
  304. package/build/types-ts3.8/metrics/web-vitals/types/fcp.d.ts +47 -0
  305. package/build/types-ts3.8/metrics/web-vitals/types/inp.d.ts +150 -0
  306. package/build/types-ts3.8/metrics/web-vitals/types/lcp.d.ts +74 -0
  307. package/build/types-ts3.8/metrics/web-vitals/types/ttfb.d.ts +60 -0
  308. package/build/types-ts3.8/metrics/web-vitals/types.d.ts +78 -0
  309. package/build/types-ts3.8/metrics/webVitalSpans.d.ts +65 -0
  310. package/build/types-ts3.8/networkUtils.d.ts +28 -0
  311. package/build/types-ts3.8/types.d.ts +15 -0
  312. package/package.json +69 -0
@@ -0,0 +1,108 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ const core = require('@sentry/core');
4
+ const types = require('../types.js');
5
+
6
+ const SENTRY_XHR_DATA_KEY = "__sentry_xhr_v3__";
7
+ function addXhrInstrumentationHandler(handler) {
8
+ const type = "xhr";
9
+ core.addHandler(type, handler);
10
+ core.maybeInstrument(type, instrumentXHR);
11
+ }
12
+ function instrumentXHR() {
13
+ if (!types.WINDOW.XMLHttpRequest) {
14
+ return;
15
+ }
16
+ const xhrproto = XMLHttpRequest.prototype;
17
+ xhrproto.open = new Proxy(xhrproto.open, {
18
+ apply(originalOpen, xhrOpenThisArg, xhrOpenArgArray) {
19
+ const virtualError = new Error();
20
+ const startTimestamp = core.timestampInSeconds() * 1e3;
21
+ const method = core.isString(xhrOpenArgArray[0]) ? xhrOpenArgArray[0].toUpperCase() : void 0;
22
+ const url = parseXhrUrlArg(xhrOpenArgArray[1]);
23
+ if (!method || !url) {
24
+ return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);
25
+ }
26
+ xhrOpenThisArg[SENTRY_XHR_DATA_KEY] = {
27
+ method,
28
+ url,
29
+ request_headers: {}
30
+ };
31
+ if (method === "POST" && url.match(/sentry_key/)) {
32
+ xhrOpenThisArg.__sentry_own_request__ = true;
33
+ }
34
+ const onreadystatechangeHandler = () => {
35
+ const xhrInfo = xhrOpenThisArg[SENTRY_XHR_DATA_KEY];
36
+ if (!xhrInfo) {
37
+ return;
38
+ }
39
+ if (xhrOpenThisArg.readyState === 4) {
40
+ try {
41
+ xhrInfo.status_code = xhrOpenThisArg.status;
42
+ } catch {
43
+ }
44
+ const handlerData = {
45
+ endTimestamp: core.timestampInSeconds() * 1e3,
46
+ startTimestamp,
47
+ xhr: xhrOpenThisArg,
48
+ virtualError
49
+ };
50
+ core.triggerHandlers("xhr", handlerData);
51
+ }
52
+ };
53
+ if ("onreadystatechange" in xhrOpenThisArg && typeof xhrOpenThisArg.onreadystatechange === "function") {
54
+ xhrOpenThisArg.onreadystatechange = new Proxy(xhrOpenThisArg.onreadystatechange, {
55
+ apply(originalOnreadystatechange, onreadystatechangeThisArg, onreadystatechangeArgArray) {
56
+ onreadystatechangeHandler();
57
+ return originalOnreadystatechange.apply(onreadystatechangeThisArg, onreadystatechangeArgArray);
58
+ }
59
+ });
60
+ } else {
61
+ xhrOpenThisArg.addEventListener("readystatechange", onreadystatechangeHandler);
62
+ }
63
+ xhrOpenThisArg.setRequestHeader = new Proxy(xhrOpenThisArg.setRequestHeader, {
64
+ apply(originalSetRequestHeader, setRequestHeaderThisArg, setRequestHeaderArgArray) {
65
+ const [header, value] = setRequestHeaderArgArray;
66
+ const xhrInfo = setRequestHeaderThisArg[SENTRY_XHR_DATA_KEY];
67
+ if (xhrInfo && core.isString(header) && core.isString(value)) {
68
+ xhrInfo.request_headers[header.toLowerCase()] = value;
69
+ }
70
+ return originalSetRequestHeader.apply(setRequestHeaderThisArg, setRequestHeaderArgArray);
71
+ }
72
+ });
73
+ return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);
74
+ }
75
+ });
76
+ xhrproto.send = new Proxy(xhrproto.send, {
77
+ apply(originalSend, sendThisArg, sendArgArray) {
78
+ const sentryXhrData = sendThisArg[SENTRY_XHR_DATA_KEY];
79
+ if (!sentryXhrData) {
80
+ return originalSend.apply(sendThisArg, sendArgArray);
81
+ }
82
+ if (sendArgArray[0] !== void 0) {
83
+ sentryXhrData.body = sendArgArray[0];
84
+ }
85
+ const handlerData = {
86
+ startTimestamp: core.timestampInSeconds() * 1e3,
87
+ xhr: sendThisArg
88
+ };
89
+ core.triggerHandlers("xhr", handlerData);
90
+ return originalSend.apply(sendThisArg, sendArgArray);
91
+ }
92
+ });
93
+ }
94
+ function parseXhrUrlArg(url) {
95
+ if (core.isString(url)) {
96
+ return url;
97
+ }
98
+ try {
99
+ return url.toString();
100
+ } catch {
101
+ }
102
+ return void 0;
103
+ }
104
+
105
+ exports.SENTRY_XHR_DATA_KEY = SENTRY_XHR_DATA_KEY;
106
+ exports.addXhrInstrumentationHandler = addXhrInstrumentationHandler;
107
+ exports.instrumentXHR = instrumentXHR;
108
+ //# sourceMappingURL=xhr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xhr.js","sources":["../../../src/instrument/xhr.ts"],"sourcesContent":["import type { HandlerDataXhr, SentryWrappedXMLHttpRequest } from '@sentry/core';\nimport { addHandler, isString, maybeInstrument, timestampInSeconds, triggerHandlers } from '@sentry/core';\nimport { WINDOW } from '../types';\n\nexport const SENTRY_XHR_DATA_KEY = '__sentry_xhr_v3__';\n\ntype WindowWithXhr = Window & { XMLHttpRequest?: typeof XMLHttpRequest };\n\n/**\n * Add an instrumentation handler for when an XHR request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addXhrInstrumentationHandler(handler: (data: HandlerDataXhr) => void): void {\n const type = 'xhr';\n addHandler(type, handler);\n maybeInstrument(type, instrumentXHR);\n}\n\n/** Exported only for tests. */\nexport function instrumentXHR(): void {\n if (!(WINDOW as WindowWithXhr).XMLHttpRequest) {\n return;\n }\n\n const xhrproto = XMLHttpRequest.prototype;\n\n // eslint-disable-next-line @typescript-eslint/unbound-method\n xhrproto.open = new Proxy(xhrproto.open, {\n apply(\n originalOpen,\n xhrOpenThisArg: XMLHttpRequest & SentryWrappedXMLHttpRequest,\n xhrOpenArgArray:\n | [method: string, url: string | URL]\n | [method: string, url: string | URL, async: boolean, username?: string | null, password?: string | null],\n ) {\n // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n // it means the error, that was caused by your XHR call did not\n // have a stack trace. If you are using HttpClient integration,\n // this is the expected behavior, as we are using this virtual error to capture\n // the location of your XHR call, and group your HttpClient events accordingly.\n const virtualError = new Error();\n\n const startTimestamp = timestampInSeconds() * 1000;\n\n // open() should always be called with two or more arguments\n // But to be on the safe side, we actually validate this and bail out if we don't have a method & url\n const method = isString(xhrOpenArgArray[0]) ? xhrOpenArgArray[0].toUpperCase() : undefined;\n const url = parseXhrUrlArg(xhrOpenArgArray[1]);\n\n if (!method || !url) {\n return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);\n }\n\n xhrOpenThisArg[SENTRY_XHR_DATA_KEY] = {\n method,\n url,\n request_headers: {},\n };\n\n // if Sentry key appears in URL, don't capture it as a request\n if (method === 'POST' && url.match(/sentry_key/)) {\n xhrOpenThisArg.__sentry_own_request__ = true;\n }\n\n const onreadystatechangeHandler: () => void = () => {\n // For whatever reason, this is not the same instance here as from the outer method\n const xhrInfo = xhrOpenThisArg[SENTRY_XHR_DATA_KEY];\n\n if (!xhrInfo) {\n return;\n }\n\n if (xhrOpenThisArg.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhrInfo.status_code = xhrOpenThisArg.status;\n } catch {\n /* do nothing */\n }\n\n const handlerData: HandlerDataXhr = {\n endTimestamp: timestampInSeconds() * 1000,\n startTimestamp,\n xhr: xhrOpenThisArg,\n virtualError,\n };\n triggerHandlers('xhr', handlerData);\n }\n };\n\n if ('onreadystatechange' in xhrOpenThisArg && typeof xhrOpenThisArg.onreadystatechange === 'function') {\n xhrOpenThisArg.onreadystatechange = new Proxy(xhrOpenThisArg.onreadystatechange, {\n apply(originalOnreadystatechange, onreadystatechangeThisArg, onreadystatechangeArgArray: unknown[]) {\n onreadystatechangeHandler();\n return originalOnreadystatechange.apply(onreadystatechangeThisArg, onreadystatechangeArgArray);\n },\n });\n } else {\n xhrOpenThisArg.addEventListener('readystatechange', onreadystatechangeHandler);\n }\n\n // Intercepting `setRequestHeader` to access the request headers of XHR instance.\n // This will only work for user/library defined headers, not for the default/browser-assigned headers.\n // Request cookies are also unavailable for XHR, as `Cookie` header can't be defined by `setRequestHeader`.\n xhrOpenThisArg.setRequestHeader = new Proxy(xhrOpenThisArg.setRequestHeader, {\n apply(\n originalSetRequestHeader,\n setRequestHeaderThisArg: SentryWrappedXMLHttpRequest,\n setRequestHeaderArgArray: unknown[],\n ) {\n const [header, value] = setRequestHeaderArgArray;\n\n const xhrInfo = setRequestHeaderThisArg[SENTRY_XHR_DATA_KEY];\n\n if (xhrInfo && isString(header) && isString(value)) {\n xhrInfo.request_headers[header.toLowerCase()] = value;\n }\n\n return originalSetRequestHeader.apply(setRequestHeaderThisArg, setRequestHeaderArgArray);\n },\n });\n\n return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/unbound-method\n xhrproto.send = new Proxy(xhrproto.send, {\n apply(originalSend, sendThisArg: XMLHttpRequest & SentryWrappedXMLHttpRequest, sendArgArray: unknown[]) {\n const sentryXhrData = sendThisArg[SENTRY_XHR_DATA_KEY];\n\n if (!sentryXhrData) {\n return originalSend.apply(sendThisArg, sendArgArray);\n }\n\n if (sendArgArray[0] !== undefined) {\n sentryXhrData.body = sendArgArray[0];\n }\n\n const handlerData: HandlerDataXhr = {\n startTimestamp: timestampInSeconds() * 1000,\n xhr: sendThisArg,\n };\n triggerHandlers('xhr', handlerData);\n\n return originalSend.apply(sendThisArg, sendArgArray);\n },\n });\n}\n\n/**\n * Parses the URL argument of a XHR method to a string.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/open#url\n * url: A string or any other object with a stringifier — including a URL object — that provides the URL of the resource to send the request to.\n *\n * @param url - The URL argument of an XHR method\n * @returns The parsed URL string or undefined if the URL is invalid\n */\nfunction parseXhrUrlArg(url: unknown): string | undefined {\n if (isString(url)) {\n return url;\n }\n\n try {\n // If the passed in argument is not a string, it should have a `toString` method as a stringifier.\n // If that fails, we just return undefined (like in IE11 where URL is not available)\n return (url as URL).toString();\n } catch {} // eslint-disable-line no-empty\n\n return undefined;\n}\n"],"names":["addHandler","maybeInstrument","WINDOW","timestampInSeconds","isString","triggerHandlers"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ function isElement(wat) {
4
+ if (typeof Element === "undefined") {
5
+ return false;
6
+ }
7
+ try {
8
+ return wat instanceof Element;
9
+ } catch {
10
+ return false;
11
+ }
12
+ }
13
+
14
+ exports.isElement = isElement;
15
+ //# sourceMappingURL=is.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is.js","sources":["../../src/is.ts"],"sourcesContent":["/**\n * Checks whether given value's type is an Element instance.\n *\n * Returns false if `Element` is not available in the current runtime.\n */\nexport function isElement(wat: unknown): boolean {\n if (typeof Element === 'undefined') {\n return false;\n }\n try {\n return wat instanceof Element;\n } catch {\n return false;\n }\n}\n"],"names":[],"mappings":";;AAKO,SAAS,UAAU,GAAA,EAAuB;AAC/C,EAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAO,GAAA,YAAe,OAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;;"}
@@ -0,0 +1,535 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ const core = require('@sentry/core');
4
+ const htmlTreeAsString = require('../htmlTreeAsString.js');
5
+ const types = require('../types.js');
6
+ const cls = require('./cls.js');
7
+ const instrument = require('./instrument.js');
8
+ const lcp = require('./lcp.js');
9
+ const resourceTiming = require('./resourceTiming.js');
10
+ const utils = require('./utils.js');
11
+ const getActivationStart = require('./web-vitals/lib/getActivationStart.js');
12
+ const getNavigationEntry = require('./web-vitals/lib/getNavigationEntry.js');
13
+ const getVisibilityWatcher = require('./web-vitals/lib/getVisibilityWatcher.js');
14
+ const debugBuild = require('../debug-build.js');
15
+
16
+ const MAX_INT_AS_BYTES = 2147483647;
17
+ let _performanceCursor = 0;
18
+ let _measurements = {};
19
+ let _lcpEntry;
20
+ let _clsEntry;
21
+ function startTrackingWebVitals({
22
+ recordClsStandaloneSpans,
23
+ recordLcpStandaloneSpans,
24
+ client
25
+ }) {
26
+ const performance = utils.getBrowserPerformanceAPI();
27
+ if (performance && core.browserPerformanceTimeOrigin()) {
28
+ if (performance.mark) {
29
+ types.WINDOW.performance.mark("sentry-tracing-init");
30
+ }
31
+ const lcpCleanupCallback = recordLcpStandaloneSpans ? lcp.trackLcpAsStandaloneSpan(client) : recordLcpStandaloneSpans === false ? _trackLCP() : void 0;
32
+ const clsCleanupCallback = recordClsStandaloneSpans ? cls.trackClsAsStandaloneSpan(client) : recordClsStandaloneSpans === false ? _trackCLS() : void 0;
33
+ const ttfbCleanupCallback = _trackTtfb();
34
+ const fpFcpCleanupCallback = _trackFpFcp();
35
+ return () => {
36
+ ttfbCleanupCallback();
37
+ fpFcpCleanupCallback();
38
+ lcpCleanupCallback?.();
39
+ clsCleanupCallback?.();
40
+ };
41
+ }
42
+ return () => void 0;
43
+ }
44
+ function startTrackingLongTasks() {
45
+ instrument.addPerformanceInstrumentationHandler("longtask", ({ entries }) => {
46
+ const parent = core.getActiveSpan();
47
+ if (!parent) {
48
+ return;
49
+ }
50
+ const { op: parentOp, start_timestamp: parentStartTimestamp } = core.spanToJSON(parent);
51
+ for (const entry of entries) {
52
+ const startTime = utils.msToSec(core.browserPerformanceTimeOrigin() + entry.startTime);
53
+ const duration = utils.msToSec(entry.duration);
54
+ if (parentOp === "navigation" && parentStartTimestamp && startTime < parentStartTimestamp) {
55
+ continue;
56
+ }
57
+ utils.startAndEndSpan(parent, startTime, startTime + duration, {
58
+ name: "Main UI thread blocked",
59
+ op: "ui.long-task",
60
+ attributes: {
61
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.ui.browser.metrics"
62
+ }
63
+ });
64
+ }
65
+ });
66
+ }
67
+ function startTrackingLongAnimationFrames() {
68
+ const observer = new PerformanceObserver((list) => {
69
+ const parent = core.getActiveSpan();
70
+ if (!parent) {
71
+ return;
72
+ }
73
+ for (const entry of list.getEntries()) {
74
+ if (!entry.scripts[0]) {
75
+ continue;
76
+ }
77
+ const startTime = utils.msToSec(core.browserPerformanceTimeOrigin() + entry.startTime);
78
+ const { start_timestamp: parentStartTimestamp, op: parentOp } = core.spanToJSON(parent);
79
+ if (parentOp === "navigation" && parentStartTimestamp && startTime < parentStartTimestamp) {
80
+ continue;
81
+ }
82
+ const duration = utils.msToSec(entry.duration);
83
+ const attributes = {
84
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.ui.browser.metrics"
85
+ };
86
+ const initialScript = entry.scripts[0];
87
+ const { invoker, invokerType, sourceURL, sourceFunctionName, sourceCharPosition } = initialScript;
88
+ attributes["browser.script.invoker"] = invoker;
89
+ attributes["browser.script.invoker_type"] = invokerType;
90
+ if (sourceURL) {
91
+ attributes["code.filepath"] = sourceURL;
92
+ }
93
+ if (sourceFunctionName) {
94
+ attributes["code.function"] = sourceFunctionName;
95
+ }
96
+ if (sourceCharPosition !== -1) {
97
+ attributes["browser.script.source_char_position"] = sourceCharPosition;
98
+ }
99
+ utils.startAndEndSpan(parent, startTime, startTime + duration, {
100
+ name: "Main UI thread blocked",
101
+ op: "ui.long-animation-frame",
102
+ attributes
103
+ });
104
+ }
105
+ });
106
+ observer.observe({ type: "long-animation-frame", buffered: true });
107
+ }
108
+ function startTrackingInteractions() {
109
+ instrument.addPerformanceInstrumentationHandler("event", ({ entries }) => {
110
+ const parent = core.getActiveSpan();
111
+ if (!parent) {
112
+ return;
113
+ }
114
+ for (const entry of entries) {
115
+ if (entry.name === "click") {
116
+ const startTime = utils.msToSec(core.browserPerformanceTimeOrigin() + entry.startTime);
117
+ const duration = utils.msToSec(entry.duration);
118
+ const spanOptions = {
119
+ name: htmlTreeAsString.htmlTreeAsString(entry.target),
120
+ op: `ui.interaction.${entry.name}`,
121
+ startTime,
122
+ attributes: {
123
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.ui.browser.metrics"
124
+ }
125
+ };
126
+ const componentName = core.getComponentName(entry.target);
127
+ if (componentName) {
128
+ spanOptions.attributes["ui.component_name"] = componentName;
129
+ }
130
+ utils.startAndEndSpan(parent, startTime, startTime + duration, spanOptions);
131
+ }
132
+ }
133
+ });
134
+ }
135
+ function _trackCLS() {
136
+ return instrument.addClsInstrumentationHandler(({ metric }) => {
137
+ const entry = metric.entries[metric.entries.length - 1];
138
+ if (!entry) {
139
+ return;
140
+ }
141
+ _measurements["cls"] = { value: metric.value, unit: "" };
142
+ _clsEntry = entry;
143
+ }, true);
144
+ }
145
+ function _trackLCP() {
146
+ return instrument.addLcpInstrumentationHandler(({ metric }) => {
147
+ const entry = metric.entries[metric.entries.length - 1];
148
+ if (!entry || !lcp.isValidLcpMetric(metric.value)) {
149
+ return;
150
+ }
151
+ _measurements["lcp"] = { value: metric.value, unit: "millisecond" };
152
+ _lcpEntry = entry;
153
+ }, true);
154
+ }
155
+ function _trackTtfb() {
156
+ return instrument.addTtfbInstrumentationHandler(({ metric }) => {
157
+ const entry = metric.entries[metric.entries.length - 1];
158
+ if (!entry) {
159
+ return;
160
+ }
161
+ _measurements["ttfb"] = { value: metric.value, unit: "millisecond" };
162
+ });
163
+ }
164
+ function _trackFpFcp() {
165
+ return instrument.addPerformanceInstrumentationHandler("paint", ({ entries }) => {
166
+ const firstHidden = getVisibilityWatcher.getVisibilityWatcher();
167
+ for (const entry of entries) {
168
+ const shouldRecord = entry.startTime < firstHidden.firstHiddenTime;
169
+ if (entry.name === "first-paint" && shouldRecord) {
170
+ _measurements["fp"] = { value: entry.startTime, unit: "millisecond" };
171
+ }
172
+ if (entry.name === "first-contentful-paint" && shouldRecord) {
173
+ _measurements["fcp"] = { value: entry.startTime, unit: "millisecond" };
174
+ }
175
+ }
176
+ });
177
+ }
178
+ function addPerformanceEntries(span, options) {
179
+ const performance = utils.getBrowserPerformanceAPI();
180
+ const origin = core.browserPerformanceTimeOrigin();
181
+ if (!performance?.getEntries || !origin) {
182
+ return;
183
+ }
184
+ const { spanStreamingEnabled, ignorePerformanceApiSpans, ignoreResourceSpans } = options;
185
+ const timeOrigin = utils.msToSec(origin);
186
+ const performanceEntries = performance.getEntries();
187
+ const { op, start_timestamp: transactionStartTime } = core.spanToJSON(span);
188
+ performanceEntries.slice(_performanceCursor).forEach((entry) => {
189
+ const startTime = utils.msToSec(entry.startTime);
190
+ const duration = utils.msToSec(
191
+ // Inexplicably, Chrome sometimes emits a negative duration. We need to work around this.
192
+ // There is a SO post attempting to explain this, but it leaves one with open questions: https://stackoverflow.com/questions/23191918/peformance-getentries-and-negative-duration-display
193
+ // The way we clamp the value is probably not accurate, since we have observed this happen for things that may take a while to load, like for example the replay worker.
194
+ // TODO: Investigate why this happens and how to properly mitigate. For now, this is a workaround to prevent transactions being dropped due to negative duration spans.
195
+ Math.max(0, entry.duration)
196
+ );
197
+ if (op === "navigation" && transactionStartTime && timeOrigin + startTime < transactionStartTime) {
198
+ return;
199
+ }
200
+ switch (entry.entryType) {
201
+ case "navigation": {
202
+ _addNavigationSpans(span, entry, timeOrigin);
203
+ break;
204
+ }
205
+ case "mark":
206
+ case "paint":
207
+ case "measure": {
208
+ _addMeasureSpans(span, entry, startTime, duration, timeOrigin, ignorePerformanceApiSpans);
209
+ break;
210
+ }
211
+ case "resource": {
212
+ _addResourceSpans(
213
+ span,
214
+ entry,
215
+ entry.name,
216
+ startTime,
217
+ duration,
218
+ timeOrigin,
219
+ ignoreResourceSpans
220
+ );
221
+ break;
222
+ }
223
+ }
224
+ });
225
+ _performanceCursor = Math.max(performanceEntries.length - 1, 0);
226
+ _trackNavigator(span, spanStreamingEnabled);
227
+ }
228
+ function addWebVitalsToSpan(span, options) {
229
+ const origin = core.browserPerformanceTimeOrigin();
230
+ if (!utils.getBrowserPerformanceAPI()?.getEntries || !origin) {
231
+ resetWebVitalState();
232
+ return;
233
+ }
234
+ const { spanStreamingEnabled, recordClsOnPageloadSpan, recordLcpOnPageloadSpan } = options;
235
+ const timeOrigin = utils.msToSec(origin);
236
+ if (core.spanToJSON(span).op === "pageload") {
237
+ _addTtfbRequestTimeToMeasurements(_measurements);
238
+ if (spanStreamingEnabled) {
239
+ const setAttr = (shortWebVitalName, value, customAttrName) => {
240
+ const attrKey = customAttrName ?? `browser.web_vital.${shortWebVitalName}.value`;
241
+ span.setAttribute(attrKey, value);
242
+ debugBuild.DEBUG_BUILD && core.debug.log("Setting web vital attribute", { [attrKey]: value }, "on pageload span");
243
+ };
244
+ ["ttfb", "fp", "fcp"].forEach((measurementName) => {
245
+ if (_measurements[measurementName]) {
246
+ setAttr(measurementName, _measurements[measurementName].value);
247
+ }
248
+ });
249
+ if (_measurements["ttfb.requestTime"]) {
250
+ setAttr("ttfb.requestTime", _measurements["ttfb.requestTime"].value, "browser.web_vital.ttfb.request_time");
251
+ }
252
+ } else {
253
+ if (!recordClsOnPageloadSpan) {
254
+ delete _measurements.cls;
255
+ }
256
+ if (!recordLcpOnPageloadSpan) {
257
+ delete _measurements.lcp;
258
+ }
259
+ Object.entries(_measurements).forEach(([measurementName, measurement]) => {
260
+ core.setMeasurement(measurementName, measurement.value, measurement.unit, span);
261
+ });
262
+ _setWebVitalAttributes(span, options);
263
+ }
264
+ span.setAttribute(spanStreamingEnabled ? "browser.performance.time_origin" : "performance.timeOrigin", timeOrigin);
265
+ span.setAttribute(
266
+ spanStreamingEnabled ? "browser.performance.navigation.activation_start" : "performance.activationStart",
267
+ getActivationStart.getActivationStart()
268
+ );
269
+ }
270
+ resetWebVitalState();
271
+ }
272
+ function resetWebVitalState() {
273
+ _lcpEntry = void 0;
274
+ _clsEntry = void 0;
275
+ _measurements = {};
276
+ }
277
+ function isReact19MeasureEntry(entry) {
278
+ if (entry?.entryType !== "measure") {
279
+ return;
280
+ }
281
+ try {
282
+ return entry.detail.devtools.track === "Components \u269B";
283
+ } catch {
284
+ return;
285
+ }
286
+ }
287
+ function _addMeasureSpans(span, entry, startTime, duration, timeOrigin, ignorePerformanceApiSpans) {
288
+ if (isReact19MeasureEntry(entry)) {
289
+ return;
290
+ }
291
+ if (["mark", "measure"].includes(entry.entryType) && core.stringMatchesSomePattern(entry.name, ignorePerformanceApiSpans)) {
292
+ return;
293
+ }
294
+ const navEntry = getNavigationEntry.getNavigationEntry(false);
295
+ const requestTime = utils.msToSec(navEntry ? navEntry.requestStart : 0);
296
+ const measureStartTimestamp = timeOrigin + Math.max(startTime, requestTime);
297
+ const startTimeStamp = timeOrigin + startTime;
298
+ const measureEndTimestamp = startTimeStamp + duration;
299
+ const attributes = {
300
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.resource.browser.metrics"
301
+ };
302
+ if (measureStartTimestamp !== startTimeStamp) {
303
+ attributes["sentry.browser.measure_happened_before_request"] = true;
304
+ attributes["sentry.browser.measure_start_time"] = measureStartTimestamp;
305
+ }
306
+ _addDetailToSpanAttributes(attributes, entry);
307
+ if (measureStartTimestamp <= measureEndTimestamp) {
308
+ utils.startAndEndSpan(span, measureStartTimestamp, measureEndTimestamp, {
309
+ name: entry.name,
310
+ op: entry.entryType,
311
+ attributes
312
+ });
313
+ }
314
+ }
315
+ function _addDetailToSpanAttributes(attributes, performanceMeasure) {
316
+ try {
317
+ const detail = performanceMeasure.detail;
318
+ if (!detail) {
319
+ return;
320
+ }
321
+ if (typeof detail === "object") {
322
+ for (const [key, value] of Object.entries(detail)) {
323
+ if (value && core.isPrimitive(value)) {
324
+ attributes[`sentry.browser.measure.detail.${key}`] = value;
325
+ } else if (value !== void 0) {
326
+ try {
327
+ attributes[`sentry.browser.measure.detail.${key}`] = JSON.stringify(value);
328
+ } catch {
329
+ }
330
+ }
331
+ }
332
+ return;
333
+ }
334
+ if (core.isPrimitive(detail)) {
335
+ attributes["sentry.browser.measure.detail"] = detail;
336
+ return;
337
+ }
338
+ try {
339
+ attributes["sentry.browser.measure.detail"] = JSON.stringify(detail);
340
+ } catch {
341
+ }
342
+ } catch {
343
+ }
344
+ }
345
+ function _addNavigationSpans(span, entry, timeOrigin) {
346
+ ["unloadEvent", "redirect", "domContentLoadedEvent", "loadEvent", "connect"].forEach((event) => {
347
+ _addPerformanceNavigationTiming(span, entry, event, timeOrigin);
348
+ });
349
+ _addPerformanceNavigationTiming(span, entry, "secureConnection", timeOrigin, "TLS/SSL");
350
+ _addPerformanceNavigationTiming(span, entry, "fetch", timeOrigin, "cache");
351
+ _addPerformanceNavigationTiming(span, entry, "domainLookup", timeOrigin, "DNS");
352
+ _addRequest(span, entry, timeOrigin);
353
+ }
354
+ function _addPerformanceNavigationTiming(span, entry, event, timeOrigin, name = event) {
355
+ const eventEnd = _getEndPropertyNameForNavigationTiming(event);
356
+ const end = entry[eventEnd];
357
+ const start = entry[`${event}Start`];
358
+ if (!start || !end) {
359
+ return;
360
+ }
361
+ utils.startAndEndSpan(span, timeOrigin + utils.msToSec(start), timeOrigin + utils.msToSec(end), {
362
+ op: `browser.${name}`,
363
+ name: entry.name,
364
+ attributes: {
365
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.ui.browser.metrics",
366
+ ...event === "redirect" && entry.redirectCount != null ? { "http.redirect_count": entry.redirectCount } : {}
367
+ }
368
+ });
369
+ }
370
+ function _getEndPropertyNameForNavigationTiming(event) {
371
+ if (event === "secureConnection") {
372
+ return "connectEnd";
373
+ }
374
+ if (event === "fetch") {
375
+ return "domainLookupStart";
376
+ }
377
+ return `${event}End`;
378
+ }
379
+ function _addRequest(span, entry, timeOrigin) {
380
+ const requestStartTimestamp = timeOrigin + utils.msToSec(entry.requestStart);
381
+ const responseEndTimestamp = timeOrigin + utils.msToSec(entry.responseEnd);
382
+ const responseStartTimestamp = timeOrigin + utils.msToSec(entry.responseStart);
383
+ if (entry.responseEnd) {
384
+ utils.startAndEndSpan(span, requestStartTimestamp, responseEndTimestamp, {
385
+ op: "browser.request",
386
+ name: entry.name,
387
+ attributes: {
388
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.ui.browser.metrics"
389
+ }
390
+ });
391
+ utils.startAndEndSpan(span, responseStartTimestamp, responseEndTimestamp, {
392
+ op: "browser.response",
393
+ name: entry.name,
394
+ attributes: {
395
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.ui.browser.metrics"
396
+ }
397
+ });
398
+ }
399
+ }
400
+ function _addResourceSpans(span, entry, resourceUrl, startTime, duration, timeOrigin, ignoredResourceSpanOps) {
401
+ if (entry.initiatorType === "xmlhttprequest" || entry.initiatorType === "fetch") {
402
+ return;
403
+ }
404
+ const op = entry.initiatorType ? `resource.${entry.initiatorType}` : "resource.other";
405
+ if (ignoredResourceSpanOps?.includes(op)) {
406
+ return;
407
+ }
408
+ const attributes = {
409
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.resource.browser.metrics"
410
+ };
411
+ const parsedUrl = core.parseUrl(resourceUrl);
412
+ if (parsedUrl.protocol) {
413
+ attributes["url.scheme"] = parsedUrl.protocol.split(":").pop();
414
+ }
415
+ if (parsedUrl.host) {
416
+ attributes["server.address"] = parsedUrl.host;
417
+ }
418
+ attributes["url.same_origin"] = resourceUrl.includes(types.WINDOW.location.origin);
419
+ _setResourceRequestAttributes(entry, attributes, [
420
+ // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/responseStatus
421
+ ["responseStatus", "http.response.status_code"],
422
+ ["transferSize", "http.response_transfer_size"],
423
+ ["encodedBodySize", "http.response_content_length"],
424
+ ["decodedBodySize", "http.decoded_response_content_length"],
425
+ // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/renderBlockingStatus
426
+ ["renderBlockingStatus", "resource.render_blocking_status"],
427
+ // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/deliveryType
428
+ ["deliveryType", "http.response_delivery_type"]
429
+ ]);
430
+ const attributesWithResourceTiming = { ...attributes, ...resourceTiming.resourceTimingToSpanAttributes(entry) };
431
+ const startTimestamp = timeOrigin + startTime;
432
+ const endTimestamp = startTimestamp + duration;
433
+ utils.startAndEndSpan(span, startTimestamp, endTimestamp, {
434
+ name: resourceUrl.replace(types.WINDOW.location.origin, ""),
435
+ op,
436
+ attributes: attributesWithResourceTiming
437
+ });
438
+ }
439
+ function _trackNavigator(span, spanStreamingEnabled) {
440
+ const navigator = types.WINDOW.navigator;
441
+ if (!navigator) {
442
+ return;
443
+ }
444
+ const connection = navigator.connection;
445
+ if (connection) {
446
+ if (connection.effectiveType) {
447
+ span.setAttribute(
448
+ spanStreamingEnabled ? "network.connection.effective_type" : "effectiveConnectionType",
449
+ connection.effectiveType
450
+ );
451
+ }
452
+ if (connection.type) {
453
+ span.setAttribute(spanStreamingEnabled ? "network.connection.type" : "connectionType", connection.type);
454
+ }
455
+ if (utils.isMeasurementValue(connection.rtt)) {
456
+ if (spanStreamingEnabled) {
457
+ span.setAttribute("network.connection.rtt", connection.rtt);
458
+ } else if (core.spanToJSON(span).op === "pageload") {
459
+ core.setMeasurement("connection.rtt", connection.rtt, "millisecond");
460
+ }
461
+ }
462
+ }
463
+ if (utils.isMeasurementValue(navigator.deviceMemory)) {
464
+ if (spanStreamingEnabled) {
465
+ span.setAttribute("device.memory.estimated_capacity", navigator.deviceMemory);
466
+ } else {
467
+ span.setAttribute("deviceMemory", `${navigator.deviceMemory} GB`);
468
+ }
469
+ }
470
+ if (utils.isMeasurementValue(navigator.hardwareConcurrency)) {
471
+ if (spanStreamingEnabled) {
472
+ span.setAttribute("device.processor_count", navigator.hardwareConcurrency);
473
+ } else {
474
+ span.setAttribute("hardwareConcurrency", String(navigator.hardwareConcurrency));
475
+ }
476
+ }
477
+ }
478
+ function _setWebVitalAttributes(span, options) {
479
+ if (_lcpEntry && options.recordLcpOnPageloadSpan) {
480
+ if (_lcpEntry.element) {
481
+ span.setAttribute("lcp.element", htmlTreeAsString.htmlTreeAsString(_lcpEntry.element));
482
+ }
483
+ if (_lcpEntry.id) {
484
+ span.setAttribute("lcp.id", _lcpEntry.id);
485
+ }
486
+ if (_lcpEntry.url) {
487
+ span.setAttribute("lcp.url", _lcpEntry.url.trim().slice(0, 200));
488
+ }
489
+ if (_lcpEntry.loadTime != null) {
490
+ span.setAttribute("lcp.loadTime", _lcpEntry.loadTime);
491
+ }
492
+ if (_lcpEntry.renderTime != null) {
493
+ span.setAttribute("lcp.renderTime", _lcpEntry.renderTime);
494
+ }
495
+ span.setAttribute("lcp.size", _lcpEntry.size);
496
+ }
497
+ if (_clsEntry?.sources && options.recordClsOnPageloadSpan) {
498
+ _clsEntry.sources.forEach(
499
+ (source, index) => span.setAttribute(`cls.source.${index + 1}`, htmlTreeAsString.htmlTreeAsString(source.node))
500
+ );
501
+ }
502
+ }
503
+ function _setResourceRequestAttributes(entry, attributes, properties) {
504
+ properties.forEach(([entryKey, attributeKey]) => {
505
+ const entryVal = entry[entryKey];
506
+ if (entryVal != null && (typeof entryVal === "number" && entryVal < MAX_INT_AS_BYTES || typeof entryVal === "string")) {
507
+ attributes[attributeKey] = entryVal;
508
+ }
509
+ });
510
+ }
511
+ function _addTtfbRequestTimeToMeasurements(_measurements2) {
512
+ const navEntry = getNavigationEntry.getNavigationEntry(false);
513
+ if (!navEntry) {
514
+ return;
515
+ }
516
+ const { responseStart, requestStart } = navEntry;
517
+ if (requestStart <= responseStart) {
518
+ _measurements2["ttfb.requestTime"] = {
519
+ value: responseStart - requestStart,
520
+ unit: "millisecond"
521
+ };
522
+ }
523
+ }
524
+
525
+ exports._addMeasureSpans = _addMeasureSpans;
526
+ exports._addNavigationSpans = _addNavigationSpans;
527
+ exports._addResourceSpans = _addResourceSpans;
528
+ exports._setResourceRequestAttributes = _setResourceRequestAttributes;
529
+ exports.addPerformanceEntries = addPerformanceEntries;
530
+ exports.addWebVitalsToSpan = addWebVitalsToSpan;
531
+ exports.startTrackingInteractions = startTrackingInteractions;
532
+ exports.startTrackingLongAnimationFrames = startTrackingLongAnimationFrames;
533
+ exports.startTrackingLongTasks = startTrackingLongTasks;
534
+ exports.startTrackingWebVitals = startTrackingWebVitals;
535
+ //# sourceMappingURL=browserMetrics.js.map