@sentry/browser-utils 10.70.0 → 11.0.0-alpha.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 (350) hide show
  1. package/build/cjs/htmlTreeAsString.js.map +1 -1
  2. package/build/cjs/index.js +30 -28
  3. package/build/cjs/index.js.map +1 -1
  4. package/build/cjs/instrumentation/dom.js.map +1 -0
  5. package/build/cjs/instrumentation/history.js.map +1 -0
  6. package/build/cjs/instrumentation/location.js.map +1 -0
  7. package/build/cjs/{metrics/instrument.js → instrumentation/performanceObserver.js} +44 -32
  8. package/build/cjs/instrumentation/performanceObserver.js.map +1 -0
  9. package/build/cjs/instrumentation/xhr.js.map +1 -0
  10. package/build/cjs/{metrics → performance}/elementTiming.js +2 -2
  11. package/build/cjs/performance/elementTiming.js.map +1 -0
  12. package/build/cjs/{metrics/browserMetrics.js → performance/entries.js} +43 -262
  13. package/build/cjs/performance/entries.js.map +1 -0
  14. package/build/cjs/performance/resourceTiming.js.map +1 -0
  15. package/build/cjs/performance/userTiming.js +119 -0
  16. package/build/cjs/performance/userTiming.js.map +1 -0
  17. package/build/cjs/performance/utils.js +68 -0
  18. package/build/cjs/performance/utils.js.map +1 -0
  19. package/build/cjs/{metrics → web-vitals}/inp.js +4 -61
  20. package/build/cjs/web-vitals/inp.js.map +1 -0
  21. package/build/cjs/web-vitals/lcp.js +10 -0
  22. package/build/cjs/web-vitals/lcp.js.map +1 -0
  23. package/build/cjs/web-vitals/reportEvents.js +31 -0
  24. package/build/cjs/web-vitals/reportEvents.js.map +1 -0
  25. package/build/cjs/{metrics/webVitalSpans.js → web-vitals/spans.js} +36 -19
  26. package/build/cjs/web-vitals/spans.js.map +1 -0
  27. package/build/cjs/web-vitals/tracking.js +164 -0
  28. package/build/cjs/web-vitals/tracking.js.map +1 -0
  29. package/build/cjs/web-vitals/utils.js +99 -0
  30. package/build/cjs/web-vitals/utils.js.map +1 -0
  31. package/build/esm/htmlTreeAsString.js.map +1 -1
  32. package/build/esm/index.js +14 -12
  33. package/build/esm/index.js.map +1 -1
  34. package/build/esm/instrumentation/dom.js.map +1 -0
  35. package/build/esm/instrumentation/history.js.map +1 -0
  36. package/build/esm/instrumentation/location.js.map +1 -0
  37. package/build/esm/{metrics/instrument.js → instrumentation/performanceObserver.js} +42 -30
  38. package/build/esm/instrumentation/performanceObserver.js.map +1 -0
  39. package/build/esm/instrumentation/xhr.js.map +1 -0
  40. package/build/esm/package.json +1 -1
  41. package/build/esm/{metrics → performance}/elementTiming.js +1 -1
  42. package/build/esm/performance/elementTiming.js.map +1 -0
  43. package/build/esm/{metrics/browserMetrics.js → performance/entries.js} +36 -252
  44. package/build/esm/performance/entries.js.map +1 -0
  45. package/build/esm/performance/resourceTiming.js.map +1 -0
  46. package/build/esm/performance/userTiming.js +116 -0
  47. package/build/esm/performance/userTiming.js.map +1 -0
  48. package/build/esm/performance/utils.js +61 -0
  49. package/build/esm/performance/utils.js.map +1 -0
  50. package/build/esm/{metrics → web-vitals}/inp.js +3 -57
  51. package/build/esm/web-vitals/inp.js.map +1 -0
  52. package/build/esm/web-vitals/lcp.js +7 -0
  53. package/build/esm/web-vitals/lcp.js.map +1 -0
  54. package/build/esm/web-vitals/reportEvents.js +29 -0
  55. package/build/esm/web-vitals/reportEvents.js.map +1 -0
  56. package/build/esm/{metrics/webVitalSpans.js → web-vitals/spans.js} +32 -15
  57. package/build/esm/web-vitals/spans.js.map +1 -0
  58. package/build/esm/web-vitals/tracking.js +161 -0
  59. package/build/esm/web-vitals/tracking.js.map +1 -0
  60. package/build/esm/web-vitals/utils.js +91 -0
  61. package/build/esm/web-vitals/utils.js.map +1 -0
  62. package/build/types/index.d.ts +13 -11
  63. package/build/types/index.d.ts.map +1 -1
  64. package/build/types/instrumentation/dom.d.ts.map +1 -0
  65. package/build/types/instrumentation/history.d.ts.map +1 -0
  66. package/build/types/instrumentation/location.d.ts.map +1 -0
  67. package/build/types/{metrics/instrument.d.ts → instrumentation/performanceObserver.d.ts} +3 -3
  68. package/build/types/instrumentation/performanceObserver.d.ts.map +1 -0
  69. package/build/types/instrumentation/xhr.d.ts.map +1 -0
  70. package/build/types/performance/elementTiming.d.ts.map +1 -0
  71. package/build/types/performance/entries.d.ts +49 -0
  72. package/build/types/performance/entries.d.ts.map +1 -0
  73. package/build/types/performance/resourceTiming.d.ts.map +1 -0
  74. package/build/types/performance/userTiming.d.ts +37 -0
  75. package/build/types/performance/userTiming.d.ts.map +1 -0
  76. package/build/types/performance/utils.d.ts +33 -0
  77. package/build/types/performance/utils.d.ts.map +1 -0
  78. package/build/types/types.d.ts +1 -1
  79. package/build/types/{metrics → web-vitals}/inp.d.ts +0 -13
  80. package/build/types/web-vitals/inp.d.ts.map +1 -0
  81. package/build/types/web-vitals/lcp.d.ts +6 -0
  82. package/build/types/web-vitals/lcp.d.ts.map +1 -0
  83. package/build/types/web-vitals/reportEvents.d.ts +18 -0
  84. package/build/types/web-vitals/reportEvents.d.ts.map +1 -0
  85. package/build/types/{metrics/webVitalSpans.d.ts → web-vitals/spans.d.ts} +18 -12
  86. package/build/types/web-vitals/spans.d.ts.map +1 -0
  87. package/build/types/web-vitals/tracking.d.ts +46 -0
  88. package/build/types/web-vitals/tracking.d.ts.map +1 -0
  89. package/build/types/{metrics/web-vitals/lib/globalListeners.d.ts → web-vitals/utils.d.ts} +16 -1
  90. package/build/types/web-vitals/utils.d.ts.map +1 -0
  91. package/package.json +8 -16
  92. package/build/cjs/instrument/dom.js.map +0 -1
  93. package/build/cjs/instrument/history.js.map +0 -1
  94. package/build/cjs/instrument/location.js.map +0 -1
  95. package/build/cjs/instrument/xhr.js.map +0 -1
  96. package/build/cjs/metrics/browserMetrics.js.map +0 -1
  97. package/build/cjs/metrics/cls.js +0 -64
  98. package/build/cjs/metrics/cls.js.map +0 -1
  99. package/build/cjs/metrics/elementTiming.js.map +0 -1
  100. package/build/cjs/metrics/inp.js.map +0 -1
  101. package/build/cjs/metrics/instrument.js.map +0 -1
  102. package/build/cjs/metrics/lcp.js +0 -77
  103. package/build/cjs/metrics/lcp.js.map +0 -1
  104. package/build/cjs/metrics/resourceTiming.js.map +0 -1
  105. package/build/cjs/metrics/utils.js +0 -137
  106. package/build/cjs/metrics/utils.js.map +0 -1
  107. package/build/cjs/metrics/web-vitals/getCLS.js +0 -46
  108. package/build/cjs/metrics/web-vitals/getCLS.js.map +0 -1
  109. package/build/cjs/metrics/web-vitals/getINP.js +0 -60
  110. package/build/cjs/metrics/web-vitals/getINP.js.map +0 -1
  111. package/build/cjs/metrics/web-vitals/getLCP.js +0 -62
  112. package/build/cjs/metrics/web-vitals/getLCP.js.map +0 -1
  113. package/build/cjs/metrics/web-vitals/lib/InteractionManager.js +0 -87
  114. package/build/cjs/metrics/web-vitals/lib/InteractionManager.js.map +0 -1
  115. package/build/cjs/metrics/web-vitals/lib/LCPEntryManager.js +0 -11
  116. package/build/cjs/metrics/web-vitals/lib/LCPEntryManager.js.map +0 -1
  117. package/build/cjs/metrics/web-vitals/lib/LayoutShiftManager.js +0 -27
  118. package/build/cjs/metrics/web-vitals/lib/LayoutShiftManager.js.map +0 -1
  119. package/build/cjs/metrics/web-vitals/lib/bindReporter.js +0 -31
  120. package/build/cjs/metrics/web-vitals/lib/bindReporter.js.map +0 -1
  121. package/build/cjs/metrics/web-vitals/lib/generateUniqueID.js +0 -8
  122. package/build/cjs/metrics/web-vitals/lib/generateUniqueID.js.map +0 -1
  123. package/build/cjs/metrics/web-vitals/lib/getActivationStart.js +0 -11
  124. package/build/cjs/metrics/web-vitals/lib/getActivationStart.js.map +0 -1
  125. package/build/cjs/metrics/web-vitals/lib/getNavigationEntry.js +0 -17
  126. package/build/cjs/metrics/web-vitals/lib/getNavigationEntry.js.map +0 -1
  127. package/build/cjs/metrics/web-vitals/lib/getVisibilityWatcher.js +0 -48
  128. package/build/cjs/metrics/web-vitals/lib/getVisibilityWatcher.js.map +0 -1
  129. package/build/cjs/metrics/web-vitals/lib/globalListeners.js +0 -18
  130. package/build/cjs/metrics/web-vitals/lib/globalListeners.js.map +0 -1
  131. package/build/cjs/metrics/web-vitals/lib/initMetric.js +0 -34
  132. package/build/cjs/metrics/web-vitals/lib/initMetric.js.map +0 -1
  133. package/build/cjs/metrics/web-vitals/lib/initUnique.js +0 -16
  134. package/build/cjs/metrics/web-vitals/lib/initUnique.js.map +0 -1
  135. package/build/cjs/metrics/web-vitals/lib/observe.js +0 -20
  136. package/build/cjs/metrics/web-vitals/lib/observe.js.map +0 -1
  137. package/build/cjs/metrics/web-vitals/lib/onHidden.js +0 -17
  138. package/build/cjs/metrics/web-vitals/lib/onHidden.js.map +0 -1
  139. package/build/cjs/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js +0 -32
  140. package/build/cjs/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js.map +0 -1
  141. package/build/cjs/metrics/web-vitals/lib/runOnce.js +0 -14
  142. package/build/cjs/metrics/web-vitals/lib/runOnce.js.map +0 -1
  143. package/build/cjs/metrics/web-vitals/lib/whenActivated.js +0 -14
  144. package/build/cjs/metrics/web-vitals/lib/whenActivated.js.map +0 -1
  145. package/build/cjs/metrics/web-vitals/lib/whenIdleOrHidden.js +0 -24
  146. package/build/cjs/metrics/web-vitals/lib/whenIdleOrHidden.js.map +0 -1
  147. package/build/cjs/metrics/web-vitals/onFCP.js +0 -37
  148. package/build/cjs/metrics/web-vitals/onFCP.js.map +0 -1
  149. package/build/cjs/metrics/web-vitals/onTTFB.js +0 -35
  150. package/build/cjs/metrics/web-vitals/onTTFB.js.map +0 -1
  151. package/build/cjs/metrics/webVitalSpans.js.map +0 -1
  152. package/build/esm/instrument/dom.js.map +0 -1
  153. package/build/esm/instrument/history.js.map +0 -1
  154. package/build/esm/instrument/location.js.map +0 -1
  155. package/build/esm/instrument/xhr.js.map +0 -1
  156. package/build/esm/metrics/browserMetrics.js.map +0 -1
  157. package/build/esm/metrics/cls.js +0 -61
  158. package/build/esm/metrics/cls.js.map +0 -1
  159. package/build/esm/metrics/elementTiming.js.map +0 -1
  160. package/build/esm/metrics/inp.js.map +0 -1
  161. package/build/esm/metrics/instrument.js.map +0 -1
  162. package/build/esm/metrics/lcp.js +0 -72
  163. package/build/esm/metrics/lcp.js.map +0 -1
  164. package/build/esm/metrics/resourceTiming.js.map +0 -1
  165. package/build/esm/metrics/utils.js +0 -128
  166. package/build/esm/metrics/utils.js.map +0 -1
  167. package/build/esm/metrics/web-vitals/getCLS.js +0 -43
  168. package/build/esm/metrics/web-vitals/getCLS.js.map +0 -1
  169. package/build/esm/metrics/web-vitals/getINP.js +0 -57
  170. package/build/esm/metrics/web-vitals/getINP.js.map +0 -1
  171. package/build/esm/metrics/web-vitals/getLCP.js +0 -59
  172. package/build/esm/metrics/web-vitals/getLCP.js.map +0 -1
  173. package/build/esm/metrics/web-vitals/lib/InteractionManager.js +0 -85
  174. package/build/esm/metrics/web-vitals/lib/InteractionManager.js.map +0 -1
  175. package/build/esm/metrics/web-vitals/lib/LCPEntryManager.js +0 -9
  176. package/build/esm/metrics/web-vitals/lib/LCPEntryManager.js.map +0 -1
  177. package/build/esm/metrics/web-vitals/lib/LayoutShiftManager.js +0 -25
  178. package/build/esm/metrics/web-vitals/lib/LayoutShiftManager.js.map +0 -1
  179. package/build/esm/metrics/web-vitals/lib/bindReporter.js +0 -29
  180. package/build/esm/metrics/web-vitals/lib/bindReporter.js.map +0 -1
  181. package/build/esm/metrics/web-vitals/lib/generateUniqueID.js +0 -6
  182. package/build/esm/metrics/web-vitals/lib/generateUniqueID.js.map +0 -1
  183. package/build/esm/metrics/web-vitals/lib/getActivationStart.js +0 -9
  184. package/build/esm/metrics/web-vitals/lib/getActivationStart.js.map +0 -1
  185. package/build/esm/metrics/web-vitals/lib/getNavigationEntry.js +0 -15
  186. package/build/esm/metrics/web-vitals/lib/getNavigationEntry.js.map +0 -1
  187. package/build/esm/metrics/web-vitals/lib/getVisibilityWatcher.js +0 -46
  188. package/build/esm/metrics/web-vitals/lib/getVisibilityWatcher.js.map +0 -1
  189. package/build/esm/metrics/web-vitals/lib/globalListeners.js +0 -15
  190. package/build/esm/metrics/web-vitals/lib/globalListeners.js.map +0 -1
  191. package/build/esm/metrics/web-vitals/lib/initMetric.js +0 -32
  192. package/build/esm/metrics/web-vitals/lib/initMetric.js.map +0 -1
  193. package/build/esm/metrics/web-vitals/lib/initUnique.js +0 -14
  194. package/build/esm/metrics/web-vitals/lib/initUnique.js.map +0 -1
  195. package/build/esm/metrics/web-vitals/lib/observe.js +0 -18
  196. package/build/esm/metrics/web-vitals/lib/observe.js.map +0 -1
  197. package/build/esm/metrics/web-vitals/lib/onHidden.js +0 -15
  198. package/build/esm/metrics/web-vitals/lib/onHidden.js.map +0 -1
  199. package/build/esm/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js +0 -29
  200. package/build/esm/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js.map +0 -1
  201. package/build/esm/metrics/web-vitals/lib/runOnce.js +0 -12
  202. package/build/esm/metrics/web-vitals/lib/runOnce.js.map +0 -1
  203. package/build/esm/metrics/web-vitals/lib/whenActivated.js +0 -12
  204. package/build/esm/metrics/web-vitals/lib/whenActivated.js.map +0 -1
  205. package/build/esm/metrics/web-vitals/lib/whenIdleOrHidden.js +0 -22
  206. package/build/esm/metrics/web-vitals/lib/whenIdleOrHidden.js.map +0 -1
  207. package/build/esm/metrics/web-vitals/onFCP.js +0 -34
  208. package/build/esm/metrics/web-vitals/onFCP.js.map +0 -1
  209. package/build/esm/metrics/web-vitals/onTTFB.js +0 -32
  210. package/build/esm/metrics/web-vitals/onTTFB.js.map +0 -1
  211. package/build/esm/metrics/webVitalSpans.js.map +0 -1
  212. package/build/types/instrument/dom.d.ts.map +0 -1
  213. package/build/types/instrument/history.d.ts.map +0 -1
  214. package/build/types/instrument/location.d.ts.map +0 -1
  215. package/build/types/instrument/xhr.d.ts.map +0 -1
  216. package/build/types/metrics/browserMetrics.d.ts +0 -116
  217. package/build/types/metrics/browserMetrics.d.ts.map +0 -1
  218. package/build/types/metrics/cls.d.ts +0 -17
  219. package/build/types/metrics/cls.d.ts.map +0 -1
  220. package/build/types/metrics/elementTiming.d.ts.map +0 -1
  221. package/build/types/metrics/inp.d.ts.map +0 -1
  222. package/build/types/metrics/instrument.d.ts.map +0 -1
  223. package/build/types/metrics/lcp.d.ts +0 -22
  224. package/build/types/metrics/lcp.d.ts.map +0 -1
  225. package/build/types/metrics/resourceTiming.d.ts.map +0 -1
  226. package/build/types/metrics/utils.d.ts +0 -73
  227. package/build/types/metrics/utils.d.ts.map +0 -1
  228. package/build/types/metrics/web-vitals/getCLS.d.ts +0 -26
  229. package/build/types/metrics/web-vitals/getCLS.d.ts.map +0 -1
  230. package/build/types/metrics/web-vitals/getINP.d.ts +0 -34
  231. package/build/types/metrics/web-vitals/getINP.d.ts.map +0 -1
  232. package/build/types/metrics/web-vitals/getLCP.d.ts +0 -16
  233. package/build/types/metrics/web-vitals/getLCP.d.ts.map +0 -1
  234. package/build/types/metrics/web-vitals/lib/InteractionManager.d.ts +0 -37
  235. package/build/types/metrics/web-vitals/lib/InteractionManager.d.ts.map +0 -1
  236. package/build/types/metrics/web-vitals/lib/LCPEntryManager.d.ts +0 -5
  237. package/build/types/metrics/web-vitals/lib/LCPEntryManager.d.ts.map +0 -1
  238. package/build/types/metrics/web-vitals/lib/LayoutShiftManager.d.ts +0 -7
  239. package/build/types/metrics/web-vitals/lib/LayoutShiftManager.d.ts.map +0 -1
  240. package/build/types/metrics/web-vitals/lib/bindReporter.d.ts +0 -7
  241. package/build/types/metrics/web-vitals/lib/bindReporter.d.ts.map +0 -1
  242. package/build/types/metrics/web-vitals/lib/generateUniqueID.d.ts +0 -7
  243. package/build/types/metrics/web-vitals/lib/generateUniqueID.d.ts.map +0 -1
  244. package/build/types/metrics/web-vitals/lib/getActivationStart.d.ts +0 -2
  245. package/build/types/metrics/web-vitals/lib/getActivationStart.d.ts.map +0 -1
  246. package/build/types/metrics/web-vitals/lib/getNavigationEntry.d.ts +0 -2
  247. package/build/types/metrics/web-vitals/lib/getNavigationEntry.d.ts.map +0 -1
  248. package/build/types/metrics/web-vitals/lib/getVisibilityWatcher.d.ts +0 -5
  249. package/build/types/metrics/web-vitals/lib/getVisibilityWatcher.d.ts.map +0 -1
  250. package/build/types/metrics/web-vitals/lib/globalListeners.d.ts.map +0 -1
  251. package/build/types/metrics/web-vitals/lib/initMetric.d.ts +0 -21
  252. package/build/types/metrics/web-vitals/lib/initMetric.d.ts.map +0 -1
  253. package/build/types/metrics/web-vitals/lib/initUnique.d.ts +0 -7
  254. package/build/types/metrics/web-vitals/lib/initUnique.d.ts.map +0 -1
  255. package/build/types/metrics/web-vitals/lib/observe.d.ts +0 -23
  256. package/build/types/metrics/web-vitals/lib/observe.d.ts.map +0 -1
  257. package/build/types/metrics/web-vitals/lib/onHidden.d.ts +0 -27
  258. package/build/types/metrics/web-vitals/lib/onHidden.d.ts.map +0 -1
  259. package/build/types/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.d.ts +0 -15
  260. package/build/types/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.d.ts.map +0 -1
  261. package/build/types/metrics/web-vitals/lib/runOnce.d.ts +0 -2
  262. package/build/types/metrics/web-vitals/lib/runOnce.d.ts.map +0 -1
  263. package/build/types/metrics/web-vitals/lib/whenActivated.d.ts +0 -2
  264. package/build/types/metrics/web-vitals/lib/whenActivated.d.ts.map +0 -1
  265. package/build/types/metrics/web-vitals/lib/whenIdleOrHidden.d.ts +0 -6
  266. package/build/types/metrics/web-vitals/lib/whenIdleOrHidden.d.ts.map +0 -1
  267. package/build/types/metrics/web-vitals/onFCP.d.ts +0 -11
  268. package/build/types/metrics/web-vitals/onFCP.d.ts.map +0 -1
  269. package/build/types/metrics/web-vitals/onTTFB.d.ts +0 -20
  270. package/build/types/metrics/web-vitals/onTTFB.d.ts.map +0 -1
  271. package/build/types/metrics/web-vitals/types/base.d.ts +0 -103
  272. package/build/types/metrics/web-vitals/types/base.d.ts.map +0 -1
  273. package/build/types/metrics/web-vitals/types/cls.d.ts +0 -58
  274. package/build/types/metrics/web-vitals/types/cls.d.ts.map +0 -1
  275. package/build/types/metrics/web-vitals/types/fcp.d.ts +0 -47
  276. package/build/types/metrics/web-vitals/types/fcp.d.ts.map +0 -1
  277. package/build/types/metrics/web-vitals/types/inp.d.ts +0 -150
  278. package/build/types/metrics/web-vitals/types/inp.d.ts.map +0 -1
  279. package/build/types/metrics/web-vitals/types/lcp.d.ts +0 -74
  280. package/build/types/metrics/web-vitals/types/lcp.d.ts.map +0 -1
  281. package/build/types/metrics/web-vitals/types/ttfb.d.ts +0 -60
  282. package/build/types/metrics/web-vitals/types/ttfb.d.ts.map +0 -1
  283. package/build/types/metrics/web-vitals/types.d.ts +0 -78
  284. package/build/types/metrics/web-vitals/types.d.ts.map +0 -1
  285. package/build/types/metrics/webVitalSpans.d.ts.map +0 -1
  286. package/build/types-ts3.8/debug-build.d.ts +0 -7
  287. package/build/types-ts3.8/getNativeImplementation.d.ts +0 -69
  288. package/build/types-ts3.8/htmlTreeAsString.d.ts +0 -11
  289. package/build/types-ts3.8/index.d.ts +0 -17
  290. package/build/types-ts3.8/instrument/dom.d.ts +0 -11
  291. package/build/types-ts3.8/instrument/history.d.ts +0 -15
  292. package/build/types-ts3.8/instrument/location.d.ts +0 -13
  293. package/build/types-ts3.8/instrument/xhr.d.ts +0 -14
  294. package/build/types-ts3.8/is.d.ts +0 -7
  295. package/build/types-ts3.8/metrics/browserMetrics.d.ts +0 -119
  296. package/build/types-ts3.8/metrics/cls.d.ts +0 -17
  297. package/build/types-ts3.8/metrics/elementTiming.d.ts +0 -21
  298. package/build/types-ts3.8/metrics/inp.d.ts +0 -35
  299. package/build/types-ts3.8/metrics/instrument.d.ts +0 -121
  300. package/build/types-ts3.8/metrics/lcp.d.ts +0 -22
  301. package/build/types-ts3.8/metrics/resourceTiming.d.ts +0 -13
  302. package/build/types-ts3.8/metrics/utils.d.ts +0 -73
  303. package/build/types-ts3.8/metrics/web-vitals/getCLS.d.ts +0 -26
  304. package/build/types-ts3.8/metrics/web-vitals/getINP.d.ts +0 -34
  305. package/build/types-ts3.8/metrics/web-vitals/getLCP.d.ts +0 -16
  306. package/build/types-ts3.8/metrics/web-vitals/lib/InteractionManager.d.ts +0 -37
  307. package/build/types-ts3.8/metrics/web-vitals/lib/LCPEntryManager.d.ts +0 -5
  308. package/build/types-ts3.8/metrics/web-vitals/lib/LayoutShiftManager.d.ts +0 -7
  309. package/build/types-ts3.8/metrics/web-vitals/lib/bindReporter.d.ts +0 -7
  310. package/build/types-ts3.8/metrics/web-vitals/lib/generateUniqueID.d.ts +0 -7
  311. package/build/types-ts3.8/metrics/web-vitals/lib/getActivationStart.d.ts +0 -2
  312. package/build/types-ts3.8/metrics/web-vitals/lib/getNavigationEntry.d.ts +0 -2
  313. package/build/types-ts3.8/metrics/web-vitals/lib/getVisibilityWatcher.d.ts +0 -5
  314. package/build/types-ts3.8/metrics/web-vitals/lib/globalListeners.d.ts +0 -11
  315. package/build/types-ts3.8/metrics/web-vitals/lib/initMetric.d.ts +0 -21
  316. package/build/types-ts3.8/metrics/web-vitals/lib/initUnique.d.ts +0 -7
  317. package/build/types-ts3.8/metrics/web-vitals/lib/observe.d.ts +0 -23
  318. package/build/types-ts3.8/metrics/web-vitals/lib/onHidden.d.ts +0 -27
  319. package/build/types-ts3.8/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.d.ts +0 -15
  320. package/build/types-ts3.8/metrics/web-vitals/lib/runOnce.d.ts +0 -2
  321. package/build/types-ts3.8/metrics/web-vitals/lib/whenActivated.d.ts +0 -2
  322. package/build/types-ts3.8/metrics/web-vitals/lib/whenIdleOrHidden.d.ts +0 -6
  323. package/build/types-ts3.8/metrics/web-vitals/onFCP.d.ts +0 -11
  324. package/build/types-ts3.8/metrics/web-vitals/onTTFB.d.ts +0 -20
  325. package/build/types-ts3.8/metrics/web-vitals/types/base.d.ts +0 -106
  326. package/build/types-ts3.8/metrics/web-vitals/types/cls.d.ts +0 -58
  327. package/build/types-ts3.8/metrics/web-vitals/types/fcp.d.ts +0 -47
  328. package/build/types-ts3.8/metrics/web-vitals/types/inp.d.ts +0 -150
  329. package/build/types-ts3.8/metrics/web-vitals/types/lcp.d.ts +0 -74
  330. package/build/types-ts3.8/metrics/web-vitals/types/ttfb.d.ts +0 -60
  331. package/build/types-ts3.8/metrics/web-vitals/types.d.ts +0 -78
  332. package/build/types-ts3.8/metrics/webVitalSpans.d.ts +0 -65
  333. package/build/types-ts3.8/networkUtils.d.ts +0 -28
  334. package/build/types-ts3.8/types.d.ts +0 -15
  335. /package/build/cjs/{instrument → instrumentation}/dom.js +0 -0
  336. /package/build/cjs/{instrument → instrumentation}/history.js +0 -0
  337. /package/build/cjs/{instrument → instrumentation}/location.js +0 -0
  338. /package/build/cjs/{instrument → instrumentation}/xhr.js +0 -0
  339. /package/build/cjs/{metrics → performance}/resourceTiming.js +0 -0
  340. /package/build/esm/{instrument → instrumentation}/dom.js +0 -0
  341. /package/build/esm/{instrument → instrumentation}/history.js +0 -0
  342. /package/build/esm/{instrument → instrumentation}/location.js +0 -0
  343. /package/build/esm/{instrument → instrumentation}/xhr.js +0 -0
  344. /package/build/esm/{metrics → performance}/resourceTiming.js +0 -0
  345. /package/build/types/{instrument → instrumentation}/dom.d.ts +0 -0
  346. /package/build/types/{instrument → instrumentation}/history.d.ts +0 -0
  347. /package/build/types/{instrument → instrumentation}/location.d.ts +0 -0
  348. /package/build/types/{instrument → instrumentation}/xhr.d.ts +0 -0
  349. /package/build/types/{metrics → performance}/elementTiming.d.ts +0 -0
  350. /package/build/types/{metrics → performance}/resourceTiming.d.ts +0 -0
@@ -1,63 +1,32 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
3
  const core = require('@sentry/core');
4
+ const attributes = require('@sentry/conventions/attributes');
5
+ const op = require('@sentry/conventions/op');
4
6
  const htmlTreeAsString = require('../htmlTreeAsString.js');
7
+ const performanceObserver = require('../instrumentation/performanceObserver.js');
5
8
  const types = require('../types.js');
6
- const cls = require('./cls.js');
7
- const instrument = require('./instrument.js');
8
- const lcp = require('./lcp.js');
9
9
  const resourceTiming = require('./resourceTiming.js');
10
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
- const attributes = require('@sentry/conventions/attributes');
16
11
 
17
12
  const MAX_INT_AS_BYTES = 2147483647;
18
13
  let _performanceCursor = 0;
19
- let _measurements = {};
20
- let _lcpEntry;
21
- let _clsEntry;
22
- function startTrackingWebVitals({
23
- recordClsStandaloneSpans,
24
- recordLcpStandaloneSpans,
25
- client
26
- }) {
27
- const performance = utils.getBrowserPerformanceAPI();
28
- if (performance && core.browserPerformanceTimeOrigin()) {
29
- if (performance.mark) {
30
- types.WINDOW.performance.mark("sentry-tracing-init");
31
- }
32
- const lcpCleanupCallback = recordLcpStandaloneSpans ? lcp.trackLcpAsStandaloneSpan(client) : recordLcpStandaloneSpans === false ? _trackLCP() : void 0;
33
- const clsCleanupCallback = recordClsStandaloneSpans ? cls.trackClsAsStandaloneSpan(client) : recordClsStandaloneSpans === false ? _trackCLS() : void 0;
34
- const ttfbCleanupCallback = _trackTtfb();
35
- const fpFcpCleanupCallback = _trackFpFcp();
36
- return () => {
37
- ttfbCleanupCallback();
38
- fpFcpCleanupCallback();
39
- lcpCleanupCallback?.();
40
- clsCleanupCallback?.();
41
- };
42
- }
43
- return () => void 0;
44
- }
45
14
  function startTrackingLongTasks() {
46
- instrument.addPerformanceInstrumentationHandler("longtask", ({ entries }) => {
15
+ performanceObserver.addPerformanceInstrumentationHandler("longtask", ({ entries }) => {
47
16
  const parent = core.getActiveSpan();
48
17
  if (!parent) {
49
18
  return;
50
19
  }
51
- const { op: parentOp, start_timestamp: parentStartTimestamp } = core.spanToJSON(parent);
20
+ const { attributes: parentAttributes, start_timestamp: parentStartTimestamp } = core.spanToJSON(parent);
52
21
  for (const entry of entries) {
53
22
  const startTime = utils.msToSec(core.browserPerformanceTimeOrigin() + entry.startTime);
54
23
  const duration = utils.msToSec(entry.duration);
55
- if (parentOp === "navigation" && parentStartTimestamp && startTime < parentStartTimestamp) {
24
+ if (parentAttributes[attributes.SENTRY_OP] === "navigation" && parentStartTimestamp && startTime < parentStartTimestamp) {
56
25
  continue;
57
26
  }
58
27
  utils.startAndEndSpan(parent, startTime, startTime + duration, {
59
28
  name: "Main UI thread blocked",
60
- op: "ui.long-task",
29
+ op: "ui.long_task",
61
30
  attributes: {
62
31
  [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.ui.browser.metrics"
63
32
  }
@@ -76,38 +45,41 @@ function startTrackingLongAnimationFrames() {
76
45
  continue;
77
46
  }
78
47
  const startTime = utils.msToSec(core.browserPerformanceTimeOrigin() + entry.startTime);
79
- const { start_timestamp: parentStartTimestamp, op: parentOp } = core.spanToJSON(parent);
48
+ const {
49
+ start_timestamp: parentStartTimestamp,
50
+ attributes: { [attributes.SENTRY_OP]: parentOp }
51
+ } = core.spanToJSON(parent);
80
52
  if (parentOp === "navigation" && parentStartTimestamp && startTime < parentStartTimestamp) {
81
53
  continue;
82
54
  }
83
55
  const duration = utils.msToSec(entry.duration);
84
- const attributes = {
56
+ const attributes$1 = {
85
57
  [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.ui.browser.metrics"
86
58
  };
87
59
  const initialScript = entry.scripts[0];
88
60
  const { invoker, invokerType, sourceURL, sourceFunctionName, sourceCharPosition } = initialScript;
89
- attributes["browser.script.invoker"] = invoker;
90
- attributes["browser.script.invoker_type"] = invokerType;
61
+ attributes$1["browser.script.invoker"] = invoker;
62
+ attributes$1["browser.script.invoker_type"] = invokerType;
91
63
  if (sourceURL) {
92
- attributes["code.filepath"] = sourceURL;
64
+ attributes$1["code.filepath"] = sourceURL;
93
65
  }
94
66
  if (sourceFunctionName) {
95
- attributes["code.function"] = sourceFunctionName;
67
+ attributes$1["code.function"] = sourceFunctionName;
96
68
  }
97
69
  if (sourceCharPosition !== -1) {
98
- attributes["browser.script.source_char_position"] = sourceCharPosition;
70
+ attributes$1["browser.script.source_char_position"] = sourceCharPosition;
99
71
  }
100
72
  utils.startAndEndSpan(parent, startTime, startTime + duration, {
101
73
  name: "Main UI thread blocked",
102
- op: "ui.long-animation-frame",
103
- attributes
74
+ op: "ui.long_animation_frame",
75
+ attributes: attributes$1
104
76
  });
105
77
  }
106
78
  });
107
79
  observer.observe({ type: "long-animation-frame", buffered: true });
108
80
  }
109
81
  function startTrackingInteractions() {
110
- instrument.addPerformanceInstrumentationHandler("event", ({ entries }) => {
82
+ performanceObserver.addPerformanceInstrumentationHandler("event", ({ entries }) => {
111
83
  const parent = core.getActiveSpan();
112
84
  if (!parent) {
113
85
  return;
@@ -133,59 +105,16 @@ function startTrackingInteractions() {
133
105
  }
134
106
  });
135
107
  }
136
- function _trackCLS() {
137
- return instrument.addClsInstrumentationHandler(({ metric }) => {
138
- const entry = metric.entries[metric.entries.length - 1];
139
- if (!entry) {
140
- return;
141
- }
142
- _measurements["cls"] = { value: metric.value, unit: "" };
143
- _clsEntry = entry;
144
- }, true);
145
- }
146
- function _trackLCP() {
147
- return instrument.addLcpInstrumentationHandler(({ metric }) => {
148
- const entry = metric.entries[metric.entries.length - 1];
149
- if (!entry || !lcp.isValidLcpMetric(metric.value)) {
150
- return;
151
- }
152
- _measurements["lcp"] = { value: metric.value, unit: "millisecond" };
153
- _lcpEntry = entry;
154
- }, true);
155
- }
156
- function _trackTtfb() {
157
- return instrument.addTtfbInstrumentationHandler(({ metric }) => {
158
- const entry = metric.entries[metric.entries.length - 1];
159
- if (!entry) {
160
- return;
161
- }
162
- _measurements["ttfb"] = { value: metric.value, unit: "millisecond" };
163
- });
164
- }
165
- function _trackFpFcp() {
166
- return instrument.addPerformanceInstrumentationHandler("paint", ({ entries }) => {
167
- const firstHidden = getVisibilityWatcher.getVisibilityWatcher();
168
- for (const entry of entries) {
169
- const shouldRecord = entry.startTime < firstHidden.firstHiddenTime;
170
- if (entry.name === "first-paint" && shouldRecord) {
171
- _measurements["fp"] = { value: entry.startTime, unit: "millisecond" };
172
- }
173
- if (entry.name === "first-contentful-paint" && shouldRecord) {
174
- _measurements["fcp"] = { value: entry.startTime, unit: "millisecond" };
175
- }
176
- }
177
- });
178
- }
179
108
  function addPerformanceEntries(span, options) {
180
109
  const performance = utils.getBrowserPerformanceAPI();
181
110
  const origin = core.browserPerformanceTimeOrigin();
182
111
  if (!performance?.getEntries || !origin) {
183
112
  return;
184
113
  }
185
- const { spanStreamingEnabled, ignorePerformanceApiSpans, ignoreResourceSpans } = options;
114
+ const { spanStreamingEnabled, ignoreResourceSpans } = options;
186
115
  const timeOrigin = utils.msToSec(origin);
187
116
  const performanceEntries = performance.getEntries();
188
- const { op, start_timestamp: transactionStartTime } = core.spanToJSON(span);
117
+ const { attributes: attributes$1, start_timestamp: transactionStartTime } = core.spanToJSON(span);
189
118
  performanceEntries.slice(_performanceCursor).forEach((entry) => {
190
119
  const startTime = utils.msToSec(entry.startTime);
191
120
  const duration = utils.msToSec(
@@ -195,7 +124,7 @@ function addPerformanceEntries(span, options) {
195
124
  // 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.
196
125
  Math.max(0, entry.duration)
197
126
  );
198
- if (op === "navigation" && transactionStartTime && timeOrigin + startTime < transactionStartTime) {
127
+ if (attributes$1[attributes.SENTRY_OP] === "navigation" && transactionStartTime && timeOrigin + startTime < transactionStartTime) {
199
128
  return;
200
129
  }
201
130
  switch (entry.entryType) {
@@ -203,10 +132,8 @@ function addPerformanceEntries(span, options) {
203
132
  _addNavigationSpans(span, entry, timeOrigin);
204
133
  break;
205
134
  }
206
- case "mark":
207
- case "paint":
208
- case "measure": {
209
- _addMeasureSpans(span, entry, startTime, duration, timeOrigin, ignorePerformanceApiSpans);
135
+ case "paint": {
136
+ _addPaintSpan(span, entry, startTime, duration, timeOrigin);
210
137
  break;
211
138
  }
212
139
  case "resource": {
@@ -226,130 +153,25 @@ function addPerformanceEntries(span, options) {
226
153
  _performanceCursor = Math.max(performanceEntries.length - 1, 0);
227
154
  _trackNavigator(span, spanStreamingEnabled);
228
155
  }
229
- function addWebVitalsToSpan(span, options) {
230
- const origin = core.browserPerformanceTimeOrigin();
231
- if (!utils.getBrowserPerformanceAPI()?.getEntries || !origin) {
232
- resetWebVitalState();
233
- return;
234
- }
235
- const { spanStreamingEnabled, recordClsOnPageloadSpan, recordLcpOnPageloadSpan } = options;
236
- const timeOrigin = utils.msToSec(origin);
237
- if (core.spanToJSON(span).op === "pageload") {
238
- _addTtfbRequestTimeToMeasurements(_measurements);
239
- if (spanStreamingEnabled) {
240
- const setAttr = (shortWebVitalName, value, customAttrName) => {
241
- const attrKey = customAttrName ?? `browser.web_vital.${shortWebVitalName}.value`;
242
- span.setAttribute(attrKey, value);
243
- debugBuild.DEBUG_BUILD && core.debug.log("Setting web vital attribute", { [attrKey]: value }, "on pageload span");
244
- };
245
- ["ttfb", "fp", "fcp"].forEach((measurementName) => {
246
- if (_measurements[measurementName]) {
247
- setAttr(measurementName, _measurements[measurementName].value);
248
- }
249
- });
250
- if (_measurements["ttfb.requestTime"]) {
251
- setAttr("ttfb.requestTime", _measurements["ttfb.requestTime"].value, "browser.web_vital.ttfb.request_time");
252
- }
253
- } else {
254
- if (!recordClsOnPageloadSpan) {
255
- delete _measurements.cls;
256
- }
257
- if (!recordLcpOnPageloadSpan) {
258
- delete _measurements.lcp;
259
- }
260
- Object.entries(_measurements).forEach(([measurementName, measurement]) => {
261
- core.setMeasurement(measurementName, measurement.value, measurement.unit, span);
262
- });
263
- _setWebVitalAttributes(span, options);
264
- }
265
- span.setAttribute(spanStreamingEnabled ? "browser.performance.time_origin" : "performance.timeOrigin", timeOrigin);
266
- span.setAttribute(
267
- spanStreamingEnabled ? "browser.performance.navigation.activation_start" : "performance.activationStart",
268
- getActivationStart.getActivationStart()
269
- );
270
- }
271
- resetWebVitalState();
272
- }
273
- function resetWebVitalState() {
274
- _lcpEntry = void 0;
275
- _clsEntry = void 0;
276
- _measurements = {};
277
- }
278
- function isReact19MeasureEntry(entry) {
279
- if (entry?.entryType !== "measure") {
280
- return;
281
- }
282
- try {
283
- return entry.detail.devtools.track === "Components \u269B";
284
- } catch {
285
- return;
286
- }
287
- }
288
- function _addMeasureSpans(span, entry, startTime, duration, timeOrigin, ignorePerformanceApiSpans) {
289
- if (isReact19MeasureEntry(entry)) {
290
- return;
291
- }
292
- if (["mark", "measure"].includes(entry.entryType) && core.stringMatchesSomePattern(entry.name, ignorePerformanceApiSpans)) {
293
- return;
294
- }
295
- const navEntry = getNavigationEntry.getNavigationEntry(false);
296
- const requestTime = utils.msToSec(navEntry ? navEntry.requestStart : 0);
297
- const measureStartTimestamp = timeOrigin + Math.max(startTime, requestTime);
298
- const startTimeStamp = timeOrigin + startTime;
299
- const measureEndTimestamp = startTimeStamp + duration;
300
- const attributes = {
301
- [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.resource.browser.metrics"
302
- };
303
- if (measureStartTimestamp !== startTimeStamp) {
304
- attributes["sentry.browser.measure_happened_before_request"] = true;
305
- attributes["sentry.browser.measure_start_time"] = measureStartTimestamp;
306
- }
307
- _addDetailToSpanAttributes(attributes, entry);
308
- if (measureStartTimestamp <= measureEndTimestamp) {
309
- utils.startAndEndSpan(span, measureStartTimestamp, measureEndTimestamp, {
310
- name: entry.name,
311
- op: entry.entryType,
312
- attributes
313
- });
314
- }
315
- }
316
- function _addDetailToSpanAttributes(attributes, performanceMeasure) {
317
- try {
318
- const detail = performanceMeasure.detail;
319
- if (!detail) {
320
- return;
321
- }
322
- if (typeof detail === "object") {
323
- for (const [key, value] of Object.entries(detail)) {
324
- if (value && core.isPrimitive(value)) {
325
- attributes[`sentry.browser.measure.detail.${key}`] = value;
326
- } else if (value !== void 0) {
327
- try {
328
- attributes[`sentry.browser.measure.detail.${key}`] = JSON.stringify(value);
329
- } catch {
330
- }
331
- }
332
- }
333
- return;
334
- }
335
- if (core.isPrimitive(detail)) {
336
- attributes["sentry.browser.measure.detail"] = detail;
337
- return;
338
- }
339
- try {
340
- attributes["sentry.browser.measure.detail"] = JSON.stringify(detail);
341
- } catch {
156
+ function _addPaintSpan(span, entry, startTime, duration, timeOrigin) {
157
+ const startTimestamp = timeOrigin + startTime;
158
+ utils.startAndEndSpan(span, startTimestamp, startTimestamp + duration, {
159
+ name: entry.name,
160
+ attributes: {
161
+ [attributes.SENTRY_OP]: op.BROWSER_BROWSER_PAINT_SPAN_OP,
162
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.resource.browser.metrics"
342
163
  }
343
- } catch {
344
- }
164
+ });
345
165
  }
346
166
  function _addNavigationSpans(span, entry, timeOrigin) {
347
- ["unloadEvent", "redirect", "domContentLoadedEvent", "loadEvent", "connect"].forEach((event) => {
348
- _addPerformanceNavigationTiming(span, entry, event, timeOrigin);
349
- });
350
- _addPerformanceNavigationTiming(span, entry, "secureConnection", timeOrigin, "TLS/SSL");
167
+ _addPerformanceNavigationTiming(span, entry, "unloadEvent", timeOrigin, "unload_event");
168
+ _addPerformanceNavigationTiming(span, entry, "redirect", timeOrigin, "redirect");
169
+ _addPerformanceNavigationTiming(span, entry, "domContentLoadedEvent", timeOrigin, "dom_content_loaded_event");
170
+ _addPerformanceNavigationTiming(span, entry, "loadEvent", timeOrigin, "load_event");
171
+ _addPerformanceNavigationTiming(span, entry, "connect", timeOrigin, "connect");
172
+ _addPerformanceNavigationTiming(span, entry, "secureConnection", timeOrigin, "tls_ssl");
351
173
  _addPerformanceNavigationTiming(span, entry, "fetch", timeOrigin, "cache");
352
- _addPerformanceNavigationTiming(span, entry, "domainLookup", timeOrigin, "DNS");
174
+ _addPerformanceNavigationTiming(span, entry, "domainLookup", timeOrigin, "dns");
353
175
  _addRequest(span, entry, timeOrigin);
354
176
  }
355
177
  function _addPerformanceNavigationTiming(span, entry, event, timeOrigin, name = event) {
@@ -417,7 +239,7 @@ function _addResourceSpans(span, entry, resourceUrl, startTime, duration, timeOr
417
239
  attributes$1["server.address"] = parsedUrl.host;
418
240
  }
419
241
  attributes$1["url.same_origin"] = resourceUrl.includes(types.WINDOW.location.origin);
420
- attributes$1[attributes.URL_FULL] = resourceUrl;
242
+ attributes$1[attributes.URL_FULL] = core.filterCollectedUrl(resourceUrl);
421
243
  _setResourceRequestAttributes(entry, attributes$1, [
422
244
  // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/responseStatus
423
245
  ["responseStatus", "http.response.status_code"],
@@ -457,7 +279,7 @@ function _trackNavigator(span, spanStreamingEnabled) {
457
279
  if (utils.isMeasurementValue(connection.rtt)) {
458
280
  if (spanStreamingEnabled) {
459
281
  span.setAttribute("network.connection.rtt", connection.rtt);
460
- } else if (core.spanToJSON(span).op === "pageload") {
282
+ } else if (core.spanToJSON(span).attributes[attributes.SENTRY_OP] === "pageload") {
461
283
  core.setMeasurement("connection.rtt", connection.rtt, "millisecond");
462
284
  }
463
285
  }
@@ -477,31 +299,6 @@ function _trackNavigator(span, spanStreamingEnabled) {
477
299
  }
478
300
  }
479
301
  }
480
- function _setWebVitalAttributes(span, options) {
481
- if (_lcpEntry && options.recordLcpOnPageloadSpan) {
482
- if (_lcpEntry.element) {
483
- span.setAttribute("lcp.element", htmlTreeAsString.htmlTreeAsString(_lcpEntry.element));
484
- }
485
- if (_lcpEntry.id) {
486
- span.setAttribute("lcp.id", _lcpEntry.id);
487
- }
488
- if (_lcpEntry.url) {
489
- span.setAttribute("lcp.url", _lcpEntry.url.trim().slice(0, 200));
490
- }
491
- if (_lcpEntry.loadTime != null) {
492
- span.setAttribute("lcp.loadTime", _lcpEntry.loadTime);
493
- }
494
- if (_lcpEntry.renderTime != null) {
495
- span.setAttribute("lcp.renderTime", _lcpEntry.renderTime);
496
- }
497
- span.setAttribute("lcp.size", _lcpEntry.size);
498
- }
499
- if (_clsEntry?.sources && options.recordClsOnPageloadSpan) {
500
- _clsEntry.sources.forEach(
501
- (source, index) => span.setAttribute(`cls.source.${index + 1}`, htmlTreeAsString.htmlTreeAsString(source.node))
502
- );
503
- }
504
- }
505
302
  function _setResourceRequestAttributes(entry, attributes, properties) {
506
303
  properties.forEach(([entryKey, attributeKey]) => {
507
304
  const entryVal = entry[entryKey];
@@ -510,28 +307,12 @@ function _setResourceRequestAttributes(entry, attributes, properties) {
510
307
  }
511
308
  });
512
309
  }
513
- function _addTtfbRequestTimeToMeasurements(_measurements2) {
514
- const navEntry = getNavigationEntry.getNavigationEntry(false);
515
- if (!navEntry) {
516
- return;
517
- }
518
- const { responseStart, requestStart } = navEntry;
519
- if (requestStart <= responseStart) {
520
- _measurements2["ttfb.requestTime"] = {
521
- value: responseStart - requestStart,
522
- unit: "millisecond"
523
- };
524
- }
525
- }
526
310
 
527
- exports._addMeasureSpans = _addMeasureSpans;
528
311
  exports._addNavigationSpans = _addNavigationSpans;
529
312
  exports._addResourceSpans = _addResourceSpans;
530
313
  exports._setResourceRequestAttributes = _setResourceRequestAttributes;
531
314
  exports.addPerformanceEntries = addPerformanceEntries;
532
- exports.addWebVitalsToSpan = addWebVitalsToSpan;
533
315
  exports.startTrackingInteractions = startTrackingInteractions;
534
316
  exports.startTrackingLongAnimationFrames = startTrackingLongAnimationFrames;
535
317
  exports.startTrackingLongTasks = startTrackingLongTasks;
536
- exports.startTrackingWebVitals = startTrackingWebVitals;
537
- //# sourceMappingURL=browserMetrics.js.map
318
+ //# sourceMappingURL=entries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entries.js","sources":["../../../src/performance/entries.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport type { Span, SpanAttributes, StartSpanOptions } from '@sentry/core';\nimport {\n browserPerformanceTimeOrigin,\n getActiveSpan,\n getComponentName,\n parseUrl,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n setMeasurement,\n spanToJSON,\n filterCollectedUrl,\n} from '@sentry/core';\nimport { SENTRY_OP, URL_FULL } from '@sentry/conventions/attributes';\nimport { BROWSER_BROWSER_PAINT_SPAN_OP } from '@sentry/conventions/op';\nimport { htmlTreeAsString } from '../htmlTreeAsString';\nimport {\n addPerformanceInstrumentationHandler,\n type PerformanceLongAnimationFrameTiming,\n} from '../instrumentation/performanceObserver';\nimport { WINDOW } from '../types';\nimport { resourceTimingToSpanAttributes } from './resourceTiming';\nimport { getBrowserPerformanceAPI, isMeasurementValue, msToSec, startAndEndSpan } from './utils';\n\ninterface NavigatorNetworkInformation {\n readonly connection?: NetworkInformation;\n}\n\n// http://wicg.github.io/netinfo/#connection-types\ntype ConnectionType = 'bluetooth' | 'cellular' | 'ethernet' | 'mixed' | 'none' | 'other' | 'unknown' | 'wifi' | 'wimax';\n\n// http://wicg.github.io/netinfo/#effectiveconnectiontype-enum\ntype EffectiveConnectionType = '2g' | '3g' | '4g' | 'slow-2g';\n\n// http://wicg.github.io/netinfo/#dom-megabit\ntype Megabit = number;\n// http://wicg.github.io/netinfo/#dom-millisecond\ntype Millisecond = number;\n\n// http://wicg.github.io/netinfo/#networkinformation-interface\ninterface NetworkInformation extends EventTarget {\n // http://wicg.github.io/netinfo/#type-attribute\n readonly type?: ConnectionType;\n // http://wicg.github.io/netinfo/#effectivetype-attribute\n readonly effectiveType?: EffectiveConnectionType;\n // http://wicg.github.io/netinfo/#downlinkmax-attribute\n readonly downlinkMax?: Megabit;\n // http://wicg.github.io/netinfo/#downlink-attribute\n readonly downlink?: Megabit;\n // http://wicg.github.io/netinfo/#rtt-attribute\n readonly rtt?: Millisecond;\n // http://wicg.github.io/netinfo/#savedata-attribute\n readonly saveData?: boolean;\n // http://wicg.github.io/netinfo/#handling-changes-to-the-underlying-connection\n onchange?: EventListener;\n}\n\n// https://w3c.github.io/device-memory/#sec-device-memory-js-api\ninterface NavigatorDeviceMemory {\n readonly deviceMemory?: number;\n}\n\nconst MAX_INT_AS_BYTES = 2147483647;\n\nlet _performanceCursor: number = 0;\n\n/**\n * Start tracking long tasks.\n */\nexport function startTrackingLongTasks(): void {\n addPerformanceInstrumentationHandler('longtask', ({ entries }) => {\n const parent = getActiveSpan();\n if (!parent) {\n return;\n }\n\n const { attributes: parentAttributes, start_timestamp: parentStartTimestamp } = spanToJSON(parent);\n\n for (const entry of entries) {\n const startTime = msToSec((browserPerformanceTimeOrigin() as number) + entry.startTime);\n const duration = msToSec(entry.duration);\n\n if (parentAttributes[SENTRY_OP] === 'navigation' && parentStartTimestamp && startTime < parentStartTimestamp) {\n // Skip adding a span if the long task started before the navigation started.\n // `startAndEndSpan` will otherwise adjust the parent's start time to the span's start\n // time, potentially skewing the duration of the actual navigation as reported via our\n // routing instrumentations\n continue;\n }\n\n startAndEndSpan(parent, startTime, startTime + duration, {\n name: 'Main UI thread blocked',\n op: 'ui.long_task',\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n });\n }\n });\n}\n\n/**\n * Start tracking long animation frames.\n */\nexport function startTrackingLongAnimationFrames(): void {\n // NOTE: the current web-vitals version (3.5.2) does not support long-animation-frame, so\n // we directly observe `long-animation-frame` events instead of through the web-vitals\n // `observe` helper function.\n const observer = new PerformanceObserver(list => {\n const parent = getActiveSpan();\n if (!parent) {\n return;\n }\n for (const entry of list.getEntries() as PerformanceLongAnimationFrameTiming[]) {\n if (!entry.scripts[0]) {\n continue;\n }\n\n const startTime = msToSec((browserPerformanceTimeOrigin() as number) + entry.startTime);\n\n const {\n start_timestamp: parentStartTimestamp,\n attributes: { [SENTRY_OP]: parentOp },\n } = spanToJSON(parent);\n\n if (parentOp === 'navigation' && parentStartTimestamp && startTime < parentStartTimestamp) {\n // Skip adding the span if the long animation frame started before the navigation started.\n // `startAndEndSpan` will otherwise adjust the parent's start time to the span's start\n // time, potentially skewing the duration of the actual navigation as reported via our\n // routing instrumentations\n continue;\n }\n const duration = msToSec(entry.duration);\n\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n };\n\n const initialScript = entry.scripts[0];\n const { invoker, invokerType, sourceURL, sourceFunctionName, sourceCharPosition } = initialScript;\n attributes['browser.script.invoker'] = invoker;\n attributes['browser.script.invoker_type'] = invokerType;\n if (sourceURL) {\n attributes['code.filepath'] = sourceURL;\n }\n if (sourceFunctionName) {\n attributes['code.function'] = sourceFunctionName;\n }\n if (sourceCharPosition !== -1) {\n attributes['browser.script.source_char_position'] = sourceCharPosition;\n }\n\n startAndEndSpan(parent, startTime, startTime + duration, {\n name: 'Main UI thread blocked',\n op: 'ui.long_animation_frame',\n attributes,\n });\n }\n });\n\n observer.observe({ type: 'long-animation-frame', buffered: true });\n}\n\n/**\n * Start tracking interaction events.\n */\nexport function startTrackingInteractions(): void {\n addPerformanceInstrumentationHandler('event', ({ entries }) => {\n const parent = getActiveSpan();\n if (!parent) {\n return;\n }\n for (const entry of entries) {\n if (entry.name === 'click') {\n const startTime = msToSec((browserPerformanceTimeOrigin() as number) + entry.startTime);\n const duration = msToSec(entry.duration);\n\n const spanOptions: StartSpanOptions & Required<Pick<StartSpanOptions, 'attributes'>> = {\n name: htmlTreeAsString(entry.target),\n op: `ui.interaction.${entry.name}`,\n startTime: startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n };\n\n const componentName = getComponentName(entry.target);\n if (componentName) {\n spanOptions.attributes['ui.component_name'] = componentName;\n }\n\n startAndEndSpan(parent, startTime, startTime + duration, spanOptions);\n }\n }\n });\n}\n\ninterface AddPerformanceEntriesOptions {\n /**\n * Resource spans with `op`s matching strings in the array will not be emitted.\n *\n * Default: []\n */\n ignoreResourceSpans: Array<'resource.script' | 'resource.css' | 'resource.img' | 'resource.other' | string>;\n\n /**\n * Whether span streaming is enabled.\n */\n spanStreamingEnabled?: boolean;\n}\n\n/** Add performance related spans to a transaction */\nexport function addPerformanceEntries(span: Span, options: AddPerformanceEntriesOptions): void {\n const performance = getBrowserPerformanceAPI();\n const origin = browserPerformanceTimeOrigin();\n if (!performance?.getEntries || !origin) {\n // Gatekeeper if performance API not available\n return;\n }\n\n const { spanStreamingEnabled, ignoreResourceSpans } = options;\n\n const timeOrigin = msToSec(origin);\n\n const performanceEntries = performance.getEntries();\n\n const { attributes, start_timestamp: transactionStartTime } = spanToJSON(span);\n\n performanceEntries.slice(_performanceCursor).forEach(entry => {\n const startTime = msToSec(entry.startTime);\n const duration = msToSec(\n // Inexplicably, Chrome sometimes emits a negative duration. We need to work around this.\n // 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\n // 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.\n // 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.\n Math.max(0, entry.duration),\n );\n\n if (\n attributes[SENTRY_OP] === 'navigation' &&\n transactionStartTime &&\n timeOrigin + startTime < transactionStartTime\n ) {\n return;\n }\n\n switch (entry.entryType) {\n case 'navigation': {\n _addNavigationSpans(span, entry as PerformanceNavigationTiming, timeOrigin);\n break;\n }\n case 'paint': {\n _addPaintSpan(span, entry, startTime, duration, timeOrigin);\n break;\n }\n case 'resource': {\n _addResourceSpans(\n span,\n entry as PerformanceResourceTiming,\n entry.name,\n startTime,\n duration,\n timeOrigin,\n ignoreResourceSpans,\n );\n break;\n }\n // Ignore other entry types.\n }\n });\n\n _performanceCursor = Math.max(performanceEntries.length - 1, 0);\n\n _trackNavigator(span, spanStreamingEnabled);\n}\n\n/** Create a span for a browser paint performance entry. */\nfunction _addPaintSpan(\n span: Span,\n entry: PerformanceEntry,\n startTime: number,\n duration: number,\n timeOrigin: number,\n): void {\n const startTimestamp = timeOrigin + startTime;\n\n startAndEndSpan(span, startTimestamp, startTimestamp + duration, {\n name: entry.name,\n attributes: {\n [SENTRY_OP]: BROWSER_BROWSER_PAINT_SPAN_OP,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.resource.browser.metrics',\n },\n });\n}\n\n/**\n * Instrument navigation entries\n * exported only for tests\n */\nexport function _addNavigationSpans(span: Span, entry: PerformanceNavigationTiming, timeOrigin: number): void {\n _addPerformanceNavigationTiming(span, entry, 'unloadEvent', timeOrigin, 'unload_event');\n _addPerformanceNavigationTiming(span, entry, 'redirect', timeOrigin, 'redirect');\n _addPerformanceNavigationTiming(span, entry, 'domContentLoadedEvent', timeOrigin, 'dom_content_loaded_event');\n _addPerformanceNavigationTiming(span, entry, 'loadEvent', timeOrigin, 'load_event');\n _addPerformanceNavigationTiming(span, entry, 'connect', timeOrigin, 'connect');\n _addPerformanceNavigationTiming(span, entry, 'secureConnection', timeOrigin, 'tls_ssl');\n _addPerformanceNavigationTiming(span, entry, 'fetch', timeOrigin, 'cache');\n _addPerformanceNavigationTiming(span, entry, 'domainLookup', timeOrigin, 'dns');\n\n _addRequest(span, entry, timeOrigin);\n}\n\ntype StartEventName =\n | 'secureConnection'\n | 'fetch'\n | 'domainLookup'\n | 'unloadEvent'\n | 'redirect'\n | 'connect'\n | 'domContentLoadedEvent'\n | 'loadEvent';\n\ntype EndEventName =\n | 'domainLookupStart'\n | 'domainLookupEnd'\n | 'unloadEventEnd'\n | 'redirectEnd'\n | 'connectEnd'\n | 'domContentLoadedEventEnd'\n | 'loadEventEnd';\n\n/** Create performance navigation related spans */\nfunction _addPerformanceNavigationTiming(\n span: Span,\n entry: PerformanceNavigationTiming,\n event: StartEventName,\n timeOrigin: number,\n name: string = event,\n): void {\n const eventEnd = _getEndPropertyNameForNavigationTiming(event) satisfies keyof PerformanceNavigationTiming;\n const end = entry[eventEnd];\n const start = entry[`${event}Start`];\n if (!start || !end) {\n return;\n }\n startAndEndSpan(span, timeOrigin + msToSec(start), timeOrigin + msToSec(end), {\n op: `browser.${name}`,\n name: entry.name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n ...(event === 'redirect' && entry.redirectCount != null ? { 'http.redirect_count': entry.redirectCount } : {}),\n },\n });\n}\n\nfunction _getEndPropertyNameForNavigationTiming(event: StartEventName): EndEventName {\n if (event === 'secureConnection') {\n return 'connectEnd';\n }\n if (event === 'fetch') {\n return 'domainLookupStart';\n }\n return `${event}End`;\n}\n\n/** Create request and response related spans */\nfunction _addRequest(span: Span, entry: PerformanceNavigationTiming, timeOrigin: number): void {\n const requestStartTimestamp = timeOrigin + msToSec(entry.requestStart);\n const responseEndTimestamp = timeOrigin + msToSec(entry.responseEnd);\n const responseStartTimestamp = timeOrigin + msToSec(entry.responseStart);\n if (entry.responseEnd) {\n // It is possible that we are collecting these metrics when the page hasn't finished loading yet, for example when the HTML slowly streams in.\n // In this case, ie. when the document request hasn't finished yet, `entry.responseEnd` will be 0.\n // In order not to produce faulty spans, where the end timestamp is before the start timestamp, we will only collect\n // these spans when the responseEnd value is available. The backend (Relay) would drop the entire span if it contained faulty spans.\n startAndEndSpan(span, requestStartTimestamp, responseEndTimestamp, {\n op: 'browser.request',\n name: entry.name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n });\n\n startAndEndSpan(span, responseStartTimestamp, responseEndTimestamp, {\n op: 'browser.response',\n name: entry.name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n });\n }\n}\n\n/**\n * Create resource-related spans.\n * Exported only for tests.\n */\nexport function _addResourceSpans(\n span: Span,\n entry: PerformanceResourceTiming,\n resourceUrl: string,\n startTime: number,\n duration: number,\n timeOrigin: number,\n ignoredResourceSpanOps?: Array<string>,\n): void {\n // we already instrument based on fetch and xhr, so we don't need to\n // duplicate spans here.\n if (entry.initiatorType === 'xmlhttprequest' || entry.initiatorType === 'fetch') {\n return;\n }\n\n const op = entry.initiatorType ? `resource.${entry.initiatorType}` : 'resource.other';\n if (ignoredResourceSpanOps?.includes(op)) {\n return;\n }\n\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.resource.browser.metrics',\n };\n\n const parsedUrl = parseUrl(resourceUrl);\n\n if (parsedUrl.protocol) {\n attributes['url.scheme'] = parsedUrl.protocol.split(':').pop(); // the protocol returned by parseUrl includes a :, but OTEL spec does not, so we remove it.\n }\n\n if (parsedUrl.host) {\n attributes['server.address'] = parsedUrl.host;\n }\n\n attributes['url.same_origin'] = resourceUrl.includes(WINDOW.location.origin);\n\n attributes[URL_FULL] = filterCollectedUrl(resourceUrl);\n\n _setResourceRequestAttributes(entry, attributes, [\n // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/responseStatus\n ['responseStatus', 'http.response.status_code'],\n\n ['transferSize', 'http.response_transfer_size'],\n ['encodedBodySize', 'http.response_content_length'],\n ['decodedBodySize', 'http.decoded_response_content_length'],\n\n // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/renderBlockingStatus\n ['renderBlockingStatus', 'resource.render_blocking_status'],\n\n // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/deliveryType\n ['deliveryType', 'http.response_delivery_type'],\n ]);\n\n const attributesWithResourceTiming: SpanAttributes = { ...attributes, ...resourceTimingToSpanAttributes(entry) };\n\n const startTimestamp = timeOrigin + startTime;\n const endTimestamp = startTimestamp + duration;\n\n startAndEndSpan(span, startTimestamp, endTimestamp, {\n name: resourceUrl.replace(WINDOW.location.origin, ''),\n op,\n attributes: attributesWithResourceTiming,\n });\n}\n\n/**\n * Capture the information of the user agent.\n * TODO v11: Remove non-span-streaming attributes and measurements once we removed transactions\n */\nfunction _trackNavigator(span: Span, spanStreamingEnabled: boolean | undefined): void {\n const navigator = WINDOW.navigator as null | (Navigator & NavigatorNetworkInformation & NavigatorDeviceMemory);\n if (!navigator) {\n return;\n }\n\n // track network connectivity\n const connection = navigator.connection;\n if (connection) {\n if (connection.effectiveType) {\n span.setAttribute(\n spanStreamingEnabled ? 'network.connection.effective_type' : 'effectiveConnectionType',\n connection.effectiveType,\n );\n }\n\n if (connection.type) {\n span.setAttribute(spanStreamingEnabled ? 'network.connection.type' : 'connectionType', connection.type);\n }\n\n if (isMeasurementValue(connection.rtt)) {\n if (spanStreamingEnabled) {\n span.setAttribute('network.connection.rtt', connection.rtt);\n } else if (spanToJSON(span).attributes[SENTRY_OP] === 'pageload') {\n // Measurements are only recorded on the pageload span, matching the historical\n // behavior where `connection.rtt` was only flushed for pageload transactions.\n setMeasurement('connection.rtt', connection.rtt, 'millisecond');\n }\n }\n }\n\n if (isMeasurementValue(navigator.deviceMemory)) {\n if (spanStreamingEnabled) {\n span.setAttribute('device.memory.estimated_capacity', navigator.deviceMemory);\n } else {\n span.setAttribute('deviceMemory', `${navigator.deviceMemory} GB`);\n }\n }\n\n if (isMeasurementValue(navigator.hardwareConcurrency)) {\n if (spanStreamingEnabled) {\n span.setAttribute('device.processor_count', navigator.hardwareConcurrency);\n } else {\n span.setAttribute('hardwareConcurrency', String(navigator.hardwareConcurrency));\n }\n }\n}\n\ntype ExperimentalResourceTimingProperty =\n | 'renderBlockingStatus'\n | 'deliveryType'\n // For some reason, TS during build, errors on `responseStatus` not being a property of\n // PerformanceResourceTiming while it actually is. Hence, we're adding it here.\n // Perhaps because response status is not yet available in Webkit/Safari.\n // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/responseStatus\n | 'responseStatus';\n\n/**\n * Use this to set any attributes we can take directly form the PerformanceResourceTiming entry.\n *\n * This is just a mapping function for entry->attribute to keep bundle-size minimal.\n * Experimental properties are also accepted (see {@link ExperimentalResourceTimingProperty}).\n * Assumes that all entry properties might be undefined for browser-specific differences.\n * Only accepts string and number values for now and also sets 0-values.\n */\nexport function _setResourceRequestAttributes(\n entry: Partial<PerformanceResourceTiming> & Partial<Record<ExperimentalResourceTimingProperty, number | string>>,\n attributes: SpanAttributes,\n properties: [keyof PerformanceResourceTiming | ExperimentalResourceTimingProperty, string][],\n): void {\n properties.forEach(([entryKey, attributeKey]) => {\n const entryVal = entry[entryKey];\n if (\n entryVal != null &&\n ((typeof entryVal === 'number' && entryVal < MAX_INT_AS_BYTES) || typeof entryVal === 'string')\n ) {\n attributes[attributeKey] = entryVal;\n }\n });\n}\n"],"names":["addPerformanceInstrumentationHandler","getActiveSpan","spanToJSON","msToSec","browserPerformanceTimeOrigin","SENTRY_OP","startAndEndSpan","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","attributes","htmlTreeAsString","getComponentName","getBrowserPerformanceAPI","BROWSER_BROWSER_PAINT_SPAN_OP","parseUrl","WINDOW","URL_FULL","filterCollectedUrl","resourceTimingToSpanAttributes","isMeasurementValue","setMeasurement"],"mappings":";;;;;;;;;;;AA6DA,MAAM,gBAAA,GAAmB,UAAA;AAEzB,IAAI,kBAAA,GAA6B,CAAA;AAK1B,SAAS,sBAAA,GAA+B;AAC7C,EAAAA,wDAAA,CAAqC,UAAA,EAAY,CAAC,EAAE,OAAA,EAAQ,KAAM;AAChE,IAAA,MAAM,SAASC,kBAAA,EAAc;AAC7B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,UAAA,EAAY,gBAAA,EAAkB,iBAAiB,oBAAA,EAAqB,GAAIC,gBAAW,MAAM,CAAA;AAEjG,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,SAAA,GAAYC,aAAA,CAASC,iCAAA,EAA6B,GAAe,MAAM,SAAS,CAAA;AACtF,MAAA,MAAM,QAAA,GAAWD,aAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA;AAEvC,MAAA,IAAI,iBAAiBE,oBAAS,CAAA,KAAM,YAAA,IAAgB,oBAAA,IAAwB,YAAY,oBAAA,EAAsB;AAK5G,QAAA;AAAA,MACF;AAEA,MAAAC,qBAAA,CAAgB,MAAA,EAAQ,SAAA,EAAW,SAAA,GAAY,QAAA,EAAU;AAAA,QACvD,IAAA,EAAM,wBAAA;AAAA,QACN,EAAA,EAAI,cAAA;AAAA,QACJ,UAAA,EAAY;AAAA,UACV,CAACC,qCAAgC,GAAG;AAAA;AACtC,OACD,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AACH;AAKO,SAAS,gCAAA,GAAyC;AAIvD,EAAA,MAAM,QAAA,GAAW,IAAI,mBAAA,CAAoB,CAAA,IAAA,KAAQ;AAC/C,IAAA,MAAM,SAASN,kBAAA,EAAc;AAC7B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,UAAA,EAAW,EAA4C;AAC9E,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AACrB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAYE,aAAA,CAASC,iCAAA,EAA6B,GAAe,MAAM,SAAS,CAAA;AAEtF,MAAA,MAAM;AAAA,QACJ,eAAA,EAAiB,oBAAA;AAAA,QACjB,UAAA,EAAY,EAAE,CAACC,oBAAS,GAAG,QAAA;AAAS,OACtC,GAAIH,gBAAW,MAAM,CAAA;AAErB,MAAA,IAAI,QAAA,KAAa,YAAA,IAAgB,oBAAA,IAAwB,SAAA,GAAY,oBAAA,EAAsB;AAKzF,QAAA;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GAAWC,aAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA;AAEvC,MAAA,MAAMK,YAAA,GAA6B;AAAA,QACjC,CAACD,qCAAgC,GAAG;AAAA,OACtC;AAEA,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AACrC,MAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAa,SAAA,EAAW,kBAAA,EAAoB,oBAAmB,GAAI,aAAA;AACpF,MAAAC,YAAA,CAAW,wBAAwB,CAAA,GAAI,OAAA;AACvC,MAAAA,YAAA,CAAW,6BAA6B,CAAA,GAAI,WAAA;AAC5C,MAAA,IAAI,SAAA,EAAW;AACb,QAAAA,YAAA,CAAW,eAAe,CAAA,GAAI,SAAA;AAAA,MAChC;AACA,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAAA,YAAA,CAAW,eAAe,CAAA,GAAI,kBAAA;AAAA,MAChC;AACA,MAAA,IAAI,uBAAuB,EAAA,EAAI;AAC7B,QAAAA,YAAA,CAAW,qCAAqC,CAAA,GAAI,kBAAA;AAAA,MACtD;AAEA,MAAAF,qBAAA,CAAgB,MAAA,EAAQ,SAAA,EAAW,SAAA,GAAY,QAAA,EAAU;AAAA,QACvD,IAAA,EAAM,wBAAA;AAAA,QACN,EAAA,EAAI,yBAAA;AAAA,oBACJE;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AAED,EAAA,QAAA,CAAS,QAAQ,EAAE,IAAA,EAAM,sBAAA,EAAwB,QAAA,EAAU,MAAM,CAAA;AACnE;AAKO,SAAS,yBAAA,GAAkC;AAChD,EAAAR,wDAAA,CAAqC,OAAA,EAAS,CAAC,EAAE,OAAA,EAAQ,KAAM;AAC7D,IAAA,MAAM,SAASC,kBAAA,EAAc;AAC7B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,QAAA,MAAM,SAAA,GAAYE,aAAA,CAASC,iCAAA,EAA6B,GAAe,MAAM,SAAS,CAAA;AACtF,QAAA,MAAM,QAAA,GAAWD,aAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA;AAEvC,QAAA,MAAM,WAAA,GAAiF;AAAA,UACrF,IAAA,EAAMM,iCAAA,CAAiB,KAAA,CAAM,MAAM,CAAA;AAAA,UACnC,EAAA,EAAI,CAAA,eAAA,EAAkB,KAAA,CAAM,IAAI,CAAA,CAAA;AAAA,UAChC,SAAA;AAAA,UACA,UAAA,EAAY;AAAA,YACV,CAACF,qCAAgC,GAAG;AAAA;AACtC,SACF;AAEA,QAAA,MAAM,aAAA,GAAgBG,qBAAA,CAAiB,KAAA,CAAM,MAAM,CAAA;AACnD,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,WAAA,CAAY,UAAA,CAAW,mBAAmB,CAAA,GAAI,aAAA;AAAA,QAChD;AAEA,QAAAJ,qBAAA,CAAgB,MAAA,EAAQ,SAAA,EAAW,SAAA,GAAY,QAAA,EAAU,WAAW,CAAA;AAAA,MACtE;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;AAiBO,SAAS,qBAAA,CAAsB,MAAY,OAAA,EAA6C;AAC7F,EAAA,MAAM,cAAcK,8BAAA,EAAyB;AAC7C,EAAA,MAAM,SAASP,iCAAA,EAA6B;AAC5C,EAAA,IAAI,CAAC,WAAA,EAAa,UAAA,IAAc,CAAC,MAAA,EAAQ;AAEvC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,oBAAA,EAAsB,mBAAA,EAAoB,GAAI,OAAA;AAEtD,EAAA,MAAM,UAAA,GAAaD,cAAQ,MAAM,CAAA;AAEjC,EAAA,MAAM,kBAAA,GAAqB,YAAY,UAAA,EAAW;AAElD,EAAA,MAAM,cAAEK,YAAA,EAAY,eAAA,EAAiB,oBAAA,EAAqB,GAAIN,gBAAW,IAAI,CAAA;AAE7E,EAAA,kBAAA,CAAmB,KAAA,CAAM,kBAAkB,CAAA,CAAE,OAAA,CAAQ,CAAA,KAAA,KAAS;AAC5D,IAAA,MAAM,SAAA,GAAYC,aAAA,CAAQ,KAAA,CAAM,SAAS,CAAA;AACzC,IAAA,MAAM,QAAA,GAAWA,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKf,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,QAAQ;AAAA,KAC5B;AAEA,IAAA,IACEK,aAAWH,oBAAS,CAAA,KAAM,gBAC1B,oBAAA,IACA,UAAA,GAAa,YAAY,oBAAA,EACzB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,QAAQ,MAAM,SAAA;AAAW,MACvB,KAAK,YAAA,EAAc;AACjB,QAAA,mBAAA,CAAoB,IAAA,EAAM,OAAsC,UAAU,CAAA;AAC1E,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,aAAA,CAAc,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,UAAU,CAAA;AAC1D,QAAA;AAAA,MACF;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,iBAAA;AAAA,UACE,IAAA;AAAA,UACA,KAAA;AAAA,UACA,KAAA,CAAM,IAAA;AAAA,UACN,SAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA;AAAA,MACF;AAAA;AAEF,EACF,CAAC,CAAA;AAED,EAAA,kBAAA,GAAqB,IAAA,CAAK,GAAA,CAAI,kBAAA,CAAmB,MAAA,GAAS,GAAG,CAAC,CAAA;AAE9D,EAAA,eAAA,CAAgB,MAAM,oBAAoB,CAAA;AAC5C;AAGA,SAAS,aAAA,CACP,IAAA,EACA,KAAA,EACA,SAAA,EACA,UACA,UAAA,EACM;AACN,EAAA,MAAM,iBAAiB,UAAA,GAAa,SAAA;AAEpC,EAAAC,qBAAA,CAAgB,IAAA,EAAM,cAAA,EAAgB,cAAA,GAAiB,QAAA,EAAU;AAAA,IAC/D,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,UAAA,EAAY;AAAA,MACV,CAACD,oBAAS,GAAGO,gCAAA;AAAA,MACb,CAACL,qCAAgC,GAAG;AAAA;AACtC,GACD,CAAA;AACH;AAMO,SAAS,mBAAA,CAAoB,IAAA,EAAY,KAAA,EAAoC,UAAA,EAA0B;AAC5G,EAAA,+BAAA,CAAgC,IAAA,EAAM,KAAA,EAAO,aAAA,EAAe,UAAA,EAAY,cAAc,CAAA;AACtF,EAAA,+BAAA,CAAgC,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,UAAA,EAAY,UAAU,CAAA;AAC/E,EAAA,+BAAA,CAAgC,IAAA,EAAM,KAAA,EAAO,uBAAA,EAAyB,UAAA,EAAY,0BAA0B,CAAA;AAC5G,EAAA,+BAAA,CAAgC,IAAA,EAAM,KAAA,EAAO,WAAA,EAAa,UAAA,EAAY,YAAY,CAAA;AAClF,EAAA,+BAAA,CAAgC,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,SAAS,CAAA;AAC7E,EAAA,+BAAA,CAAgC,IAAA,EAAM,KAAA,EAAO,kBAAA,EAAoB,UAAA,EAAY,SAAS,CAAA;AACtF,EAAA,+BAAA,CAAgC,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,OAAO,CAAA;AACzE,EAAA,+BAAA,CAAgC,IAAA,EAAM,KAAA,EAAO,cAAA,EAAgB,UAAA,EAAY,KAAK,CAAA;AAE9E,EAAA,WAAA,CAAY,IAAA,EAAM,OAAO,UAAU,CAAA;AACrC;AAsBA,SAAS,gCACP,IAAA,EACA,KAAA,EACA,KAAA,EACA,UAAA,EACA,OAAe,KAAA,EACT;AACN,EAAA,MAAM,QAAA,GAAW,uCAAuC,KAAK,CAAA;AAC7D,EAAA,MAAM,GAAA,GAAM,MAAM,QAAQ,CAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,KAAA,CAAO,CAAA;AACnC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,EAAK;AAClB,IAAA;AAAA,EACF;AACA,EAAAD,qBAAA,CAAgB,IAAA,EAAM,aAAaH,aAAA,CAAQ,KAAK,GAAG,UAAA,GAAaA,aAAA,CAAQ,GAAG,CAAA,EAAG;AAAA,IAC5E,EAAA,EAAI,WAAW,IAAI,CAAA,CAAA;AAAA,IACnB,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,UAAA,EAAY;AAAA,MACV,CAACI,qCAAgC,GAAG,yBAAA;AAAA,MACpC,GAAI,KAAA,KAAU,UAAA,IAAc,KAAA,CAAM,aAAA,IAAiB,IAAA,GAAO,EAAE,qBAAA,EAAuB,KAAA,CAAM,aAAA,EAAc,GAAI;AAAC;AAC9G,GACD,CAAA;AACH;AAEA,SAAS,uCAAuC,KAAA,EAAqC;AACnF,EAAA,IAAI,UAAU,kBAAA,EAAoB;AAChC,IAAA,OAAO,YAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,OAAO,mBAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAG,KAAK,CAAA,GAAA,CAAA;AACjB;AAGA,SAAS,WAAA,CAAY,IAAA,EAAY,KAAA,EAAoC,UAAA,EAA0B;AAC7F,EAAA,MAAM,qBAAA,GAAwB,UAAA,GAAaJ,aAAA,CAAQ,KAAA,CAAM,YAAY,CAAA;AACrE,EAAA,MAAM,oBAAA,GAAuB,UAAA,GAAaA,aAAA,CAAQ,KAAA,CAAM,WAAW,CAAA;AACnE,EAAA,MAAM,sBAAA,GAAyB,UAAA,GAAaA,aAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AACvE,EAAA,IAAI,MAAM,WAAA,EAAa;AAKrB,IAAAG,qBAAA,CAAgB,IAAA,EAAM,uBAAuB,oBAAA,EAAsB;AAAA,MACjE,EAAA,EAAI,iBAAA;AAAA,MACJ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,UAAA,EAAY;AAAA,QACV,CAACC,qCAAgC,GAAG;AAAA;AACtC,KACD,CAAA;AAED,IAAAD,qBAAA,CAAgB,IAAA,EAAM,wBAAwB,oBAAA,EAAsB;AAAA,MAClE,EAAA,EAAI,kBAAA;AAAA,MACJ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,UAAA,EAAY;AAAA,QACV,CAACC,qCAAgC,GAAG;AAAA;AACtC,KACD,CAAA;AAAA,EACH;AACF;AAMO,SAAS,kBACd,IAAA,EACA,KAAA,EACA,aACA,SAAA,EACA,QAAA,EACA,YACA,sBAAA,EACM;AAGN,EAAA,IAAI,KAAA,CAAM,aAAA,KAAkB,gBAAA,IAAoB,KAAA,CAAM,kBAAkB,OAAA,EAAS;AAC/E,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAK,KAAA,CAAM,aAAA,GAAgB,CAAA,SAAA,EAAY,KAAA,CAAM,aAAa,CAAA,CAAA,GAAK,gBAAA;AACrE,EAAA,IAAI,sBAAA,EAAwB,QAAA,CAAS,EAAE,CAAA,EAAG;AACxC,IAAA;AAAA,EACF;AAEA,EAAA,MAAMC,YAAA,GAA6B;AAAA,IACjC,CAACD,qCAAgC,GAAG;AAAA,GACtC;AAEA,EAAA,MAAM,SAAA,GAAYM,cAAS,WAAW,CAAA;AAEtC,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAAL,YAAA,CAAW,YAAY,CAAA,GAAI,SAAA,CAAU,SAAS,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI;AAAA,EAC/D;AAEA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAAA,YAAA,CAAW,gBAAgB,IAAI,SAAA,CAAU,IAAA;AAAA,EAC3C;AAEA,EAAAA,YAAA,CAAW,iBAAiB,CAAA,GAAI,WAAA,CAAY,QAAA,CAASM,YAAA,CAAO,SAAS,MAAM,CAAA;AAE3E,EAAAN,YAAA,CAAWO,mBAAQ,CAAA,GAAIC,uBAAA,CAAmB,WAAW,CAAA;AAErD,EAAA,6BAAA,CAA8B,OAAOR,YAAA,EAAY;AAAA;AAAA,IAE/C,CAAC,kBAAkB,2BAA2B,CAAA;AAAA,IAE9C,CAAC,gBAAgB,6BAA6B,CAAA;AAAA,IAC9C,CAAC,mBAAmB,8BAA8B,CAAA;AAAA,IAClD,CAAC,mBAAmB,sCAAsC,CAAA;AAAA;AAAA,IAG1D,CAAC,wBAAwB,iCAAiC,CAAA;AAAA;AAAA,IAG1D,CAAC,gBAAgB,6BAA6B;AAAA,GAC/C,CAAA;AAED,EAAA,MAAM,+BAA+C,EAAE,GAAGA,cAAY,GAAGS,6CAAA,CAA+B,KAAK,CAAA,EAAE;AAE/G,EAAA,MAAM,iBAAiB,UAAA,GAAa,SAAA;AACpC,EAAA,MAAM,eAAe,cAAA,GAAiB,QAAA;AAEtC,EAAAX,qBAAA,CAAgB,IAAA,EAAM,gBAAgB,YAAA,EAAc;AAAA,IAClD,MAAM,WAAA,CAAY,OAAA,CAAQQ,YAAA,CAAO,QAAA,CAAS,QAAQ,EAAE,CAAA;AAAA,IACpD,EAAA;AAAA,IACA,UAAA,EAAY;AAAA,GACb,CAAA;AACH;AAMA,SAAS,eAAA,CAAgB,MAAY,oBAAA,EAAiD;AACpF,EAAA,MAAM,YAAYA,YAAA,CAAO,SAAA;AACzB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAa,SAAA,CAAU,UAAA;AAC7B,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI,WAAW,aAAA,EAAe;AAC5B,MAAA,IAAA,CAAK,YAAA;AAAA,QACH,uBAAuB,mCAAA,GAAsC,yBAAA;AAAA,QAC7D,UAAA,CAAW;AAAA,OACb;AAAA,IACF;AAEA,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,IAAA,CAAK,YAAA,CAAa,oBAAA,GAAuB,yBAAA,GAA4B,gBAAA,EAAkB,WAAW,IAAI,CAAA;AAAA,IACxG;AAEA,IAAA,IAAII,wBAAA,CAAmB,UAAA,CAAW,GAAG,CAAA,EAAG;AACtC,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,IAAA,CAAK,YAAA,CAAa,wBAAA,EAA0B,UAAA,CAAW,GAAG,CAAA;AAAA,MAC5D,WAAWhB,eAAA,CAAW,IAAI,EAAE,UAAA,CAAWG,oBAAS,MAAM,UAAA,EAAY;AAGhE,QAAAc,mBAAA,CAAe,gBAAA,EAAkB,UAAA,CAAW,GAAA,EAAK,aAAa,CAAA;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAID,wBAAA,CAAmB,SAAA,CAAU,YAAY,CAAA,EAAG;AAC9C,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,IAAA,CAAK,YAAA,CAAa,kCAAA,EAAoC,SAAA,CAAU,YAAY,CAAA;AAAA,IAC9E,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB,CAAA,EAAG,SAAA,CAAU,YAAY,CAAA,GAAA,CAAK,CAAA;AAAA,IAClE;AAAA,EACF;AAEA,EAAA,IAAIA,wBAAA,CAAmB,SAAA,CAAU,mBAAmB,CAAA,EAAG;AACrD,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,IAAA,CAAK,YAAA,CAAa,wBAAA,EAA0B,SAAA,CAAU,mBAAmB,CAAA;AAAA,IAC3E,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,CAAa,qBAAA,EAAuB,MAAA,CAAO,SAAA,CAAU,mBAAmB,CAAC,CAAA;AAAA,IAChF;AAAA,EACF;AACF;AAmBO,SAAS,6BAAA,CACd,KAAA,EACA,UAAA,EACA,UAAA,EACM;AACN,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,QAAA,EAAU,YAAY,CAAA,KAAM;AAC/C,IAAA,MAAM,QAAA,GAAW,MAAM,QAAQ,CAAA;AAC/B,IAAA,IACE,QAAA,IAAY,SACV,OAAO,QAAA,KAAa,YAAY,QAAA,GAAW,gBAAA,IAAqB,OAAO,QAAA,KAAa,QAAA,CAAA,EACtF;AACA,MAAA,UAAA,CAAW,YAAY,CAAA,GAAI,QAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AACH;;;;;;;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceTiming.js","sources":["../../../src/performance/resourceTiming.ts"],"sourcesContent":["import type { SpanAttributes } from '@sentry/core';\nimport { browserPerformanceTimeOrigin } from '@sentry/core';\nimport { extractNetworkProtocol, getBrowserPerformanceAPI } from './utils';\n\nfunction getAbsoluteTime(time: number | undefined): number | undefined {\n // falsy values should be preserved so that we can later on drop undefined values and\n // preserve 0 vals for cross-origin resources without proper `Timing-Allow-Origin` header.\n return time ? ((browserPerformanceTimeOrigin() || performance.timeOrigin) + time) / 1000 : time;\n}\n\n/**\n * Converts a PerformanceResourceTiming entry to span data for the resource span. Most importantly,\n * it converts the timing values from timestamps relative to the `performance.timeOrigin` to absolute timestamps\n * in seconds.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming#timestamps\n *\n * @param resourceTiming\n * @returns An array where the first element is the attribute name and the second element is the attribute value.\n */\nexport function resourceTimingToSpanAttributes(resourceTiming: PerformanceResourceTiming): SpanAttributes {\n const timingSpanData: SpanAttributes = {};\n // Checking for only `undefined` and `null` is intentional because it's\n // valid for `nextHopProtocol` to be an empty string.\n if (resourceTiming.nextHopProtocol != undefined) {\n const { name, version } = extractNetworkProtocol(resourceTiming.nextHopProtocol);\n timingSpanData['network.protocol.version'] = version;\n timingSpanData['network.protocol.name'] = name;\n }\n\n if (!(browserPerformanceTimeOrigin() || getBrowserPerformanceAPI()?.timeOrigin)) {\n return timingSpanData;\n }\n\n return dropUndefinedKeysFromObject({\n ...timingSpanData,\n\n 'http.request.redirect_start': getAbsoluteTime(resourceTiming.redirectStart),\n 'http.request.redirect_end': getAbsoluteTime(resourceTiming.redirectEnd),\n\n 'http.request.worker_start': getAbsoluteTime(resourceTiming.workerStart),\n\n 'http.request.fetch_start': getAbsoluteTime(resourceTiming.fetchStart),\n\n 'http.request.domain_lookup_start': getAbsoluteTime(resourceTiming.domainLookupStart),\n 'http.request.domain_lookup_end': getAbsoluteTime(resourceTiming.domainLookupEnd),\n\n 'http.request.connect_start': getAbsoluteTime(resourceTiming.connectStart),\n 'http.request.secure_connection_start': getAbsoluteTime(resourceTiming.secureConnectionStart),\n 'http.request.connection_end': getAbsoluteTime(resourceTiming.connectEnd),\n\n 'http.request.request_start': getAbsoluteTime(resourceTiming.requestStart),\n\n 'http.request.response_start': getAbsoluteTime(resourceTiming.responseStart),\n 'http.request.response_end': getAbsoluteTime(resourceTiming.responseEnd),\n\n // For TTFB we actually want the relative time from timeOrigin to responseStart\n // This way, TTFB always measures the \"first page load\" experience.\n // see: https://web.dev/articles/ttfb#measure-resource-requests\n 'http.request.time_to_first_byte':\n resourceTiming.responseStart != null ? resourceTiming.responseStart / 1000 : undefined,\n });\n}\n\n/**\n * Remove properties with `undefined` as value from an object.\n * In contrast to `dropUndefinedKeys` in core this funciton only works on first-level\n * key-value objects and does not recursively go into object properties or arrays.\n */\nfunction dropUndefinedKeysFromObject<T extends object>(attrs: T): Partial<T> {\n return Object.fromEntries(Object.entries(attrs).filter(([, value]) => value != null)) as Partial<T>;\n}\n"],"names":["browserPerformanceTimeOrigin","extractNetworkProtocol","getBrowserPerformanceAPI"],"mappings":";;;;;AAIA,SAAS,gBAAgB,IAAA,EAA8C;AAGrE,EAAA,OAAO,SAASA,iCAAA,EAA6B,IAAK,WAAA,CAAY,UAAA,IAAc,QAAQ,GAAA,GAAO,IAAA;AAC7F;AAYO,SAAS,+BAA+B,cAAA,EAA2D;AACxG,EAAA,MAAM,iBAAiC,EAAC;AAGxC,EAAA,IAAI,cAAA,CAAe,mBAAmB,MAAA,EAAW;AAC/C,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAIC,4BAAA,CAAuB,eAAe,eAAe,CAAA;AAC/E,IAAA,cAAA,CAAe,0BAA0B,CAAA,GAAI,OAAA;AAC7C,IAAA,cAAA,CAAe,uBAAuB,CAAA,GAAI,IAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,EAAED,iCAAA,EAA6B,IAAKE,8BAAA,IAA4B,UAAA,CAAA,EAAa;AAC/E,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,OAAO,2BAAA,CAA4B;AAAA,IACjC,GAAG,cAAA;AAAA,IAEH,6BAAA,EAA+B,eAAA,CAAgB,cAAA,CAAe,aAAa,CAAA;AAAA,IAC3E,2BAAA,EAA6B,eAAA,CAAgB,cAAA,CAAe,WAAW,CAAA;AAAA,IAEvE,2BAAA,EAA6B,eAAA,CAAgB,cAAA,CAAe,WAAW,CAAA;AAAA,IAEvE,0BAAA,EAA4B,eAAA,CAAgB,cAAA,CAAe,UAAU,CAAA;AAAA,IAErE,kCAAA,EAAoC,eAAA,CAAgB,cAAA,CAAe,iBAAiB,CAAA;AAAA,IACpF,gCAAA,EAAkC,eAAA,CAAgB,cAAA,CAAe,eAAe,CAAA;AAAA,IAEhF,4BAAA,EAA8B,eAAA,CAAgB,cAAA,CAAe,YAAY,CAAA;AAAA,IACzE,sCAAA,EAAwC,eAAA,CAAgB,cAAA,CAAe,qBAAqB,CAAA;AAAA,IAC5F,6BAAA,EAA+B,eAAA,CAAgB,cAAA,CAAe,UAAU,CAAA;AAAA,IAExE,4BAAA,EAA8B,eAAA,CAAgB,cAAA,CAAe,YAAY,CAAA;AAAA,IAEzE,6BAAA,EAA+B,eAAA,CAAgB,cAAA,CAAe,aAAa,CAAA;AAAA,IAC3E,2BAAA,EAA6B,eAAA,CAAgB,cAAA,CAAe,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA,IAKvE,mCACE,cAAA,CAAe,aAAA,IAAiB,IAAA,GAAO,cAAA,CAAe,gBAAgB,GAAA,GAAO;AAAA,GAChF,CAAA;AACH;AAOA,SAAS,4BAA8C,KAAA,EAAsB;AAC3E,EAAA,OAAO,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,IAAS,IAAI,CAAC,CAAA;AACtF;;;;"}
@@ -0,0 +1,119 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ const attributes = require('@sentry/conventions/attributes');
4
+ const core = require('@sentry/core');
5
+ const utils = require('./utils.js');
6
+ const utils$1 = require('../web-vitals/utils.js');
7
+
8
+ const INTEGRATION_NAME = "UserTiming";
9
+ const _userTimingIntegration = ((options = {}) => {
10
+ return {
11
+ name: INTEGRATION_NAME,
12
+ setup(client) {
13
+ const performance = utils.getBrowserPerformanceAPI();
14
+ const timeOrigin = core.browserPerformanceTimeOrigin();
15
+ if (!performance?.getEntries || !timeOrigin) {
16
+ return;
17
+ }
18
+ const timeOriginInSeconds = utils.msToSec(timeOrigin);
19
+ let performanceCursor = 0;
20
+ client.on("beforeIdleSpanEnd", (idleSpan) => {
21
+ const { attributes: attributes$1, start_timestamp: parentStartTimestamp } = core.spanToJSON(idleSpan);
22
+ const parentOp = attributes$1[attributes.SENTRY_OP];
23
+ if (parentOp !== "pageload" && parentOp !== "navigation") {
24
+ return;
25
+ }
26
+ const requestTime = utils.msToSec(utils$1.getNavigationEntry(false)?.requestStart ?? 0);
27
+ const performanceEntries = performance.getEntries();
28
+ for (const entry of performanceEntries.slice(performanceCursor)) {
29
+ if (entry.entryType !== "mark" && entry.entryType !== "measure") {
30
+ continue;
31
+ }
32
+ const startTime = utils.msToSec(entry.startTime);
33
+ const absoluteStartTime = timeOriginInSeconds + startTime;
34
+ if (parentOp === "navigation" && parentStartTimestamp && absoluteStartTime < parentStartTimestamp) {
35
+ continue;
36
+ }
37
+ _addUserTimingSpan(
38
+ idleSpan,
39
+ entry,
40
+ startTime,
41
+ utils.msToSec(Math.max(0, entry.duration)),
42
+ timeOriginInSeconds,
43
+ requestTime,
44
+ options.ignore ?? []
45
+ );
46
+ }
47
+ performanceCursor = performanceEntries.length;
48
+ });
49
+ }
50
+ };
51
+ });
52
+ const userTimingIntegration = core.defineIntegration(_userTimingIntegration);
53
+ function _addUserTimingSpan(parentSpan, entry, startTime, duration, timeOrigin, requestTime, ignore) {
54
+ if (isReact19MeasureEntry(entry) || core.stringMatchesSomePattern(entry.name, ignore)) {
55
+ return;
56
+ }
57
+ const spanStartTimestamp = timeOrigin + Math.max(startTime, requestTime);
58
+ const originalStartTimestamp = timeOrigin + startTime;
59
+ const spanEndTimestamp = originalStartTimestamp + duration;
60
+ const attributes$1 = {
61
+ [attributes.SENTRY_ORIGIN]: `auto.browser.user_timing.${entry.entryType}`
62
+ };
63
+ if (spanStartTimestamp !== originalStartTimestamp) {
64
+ attributes$1["sentry.browser.measure_happened_before_request"] = true;
65
+ attributes$1["sentry.browser.measure_start_time"] = spanStartTimestamp;
66
+ }
67
+ addDetailToSpanAttributes(attributes$1, entry);
68
+ if (spanStartTimestamp <= spanEndTimestamp) {
69
+ utils.startAndEndSpan(parentSpan, spanStartTimestamp, spanEndTimestamp, {
70
+ name: entry.name,
71
+ op: entry.entryType,
72
+ attributes: attributes$1
73
+ });
74
+ }
75
+ }
76
+ function isReact19MeasureEntry(entry) {
77
+ if (entry.entryType !== "measure") {
78
+ return;
79
+ }
80
+ try {
81
+ return entry.detail.devtools.track === "Components \u269B";
82
+ } catch {
83
+ return;
84
+ }
85
+ }
86
+ function addDetailToSpanAttributes(attributes, entry) {
87
+ try {
88
+ const detail = entry.detail;
89
+ if (!detail) {
90
+ return;
91
+ }
92
+ if (typeof detail === "object") {
93
+ for (const [key, value] of Object.entries(detail)) {
94
+ if (value && core.isPrimitive(value)) {
95
+ attributes[`sentry.browser.measure.detail.${key}`] = value;
96
+ } else if (value !== void 0) {
97
+ try {
98
+ attributes[`sentry.browser.measure.detail.${key}`] = JSON.stringify(value);
99
+ } catch {
100
+ }
101
+ }
102
+ }
103
+ return;
104
+ }
105
+ if (core.isPrimitive(detail)) {
106
+ attributes["sentry.browser.measure.detail"] = detail;
107
+ return;
108
+ }
109
+ try {
110
+ attributes["sentry.browser.measure.detail"] = JSON.stringify(detail);
111
+ } catch {
112
+ }
113
+ } catch {
114
+ }
115
+ }
116
+
117
+ exports._addUserTimingSpan = _addUserTimingSpan;
118
+ exports.userTimingIntegration = userTimingIntegration;
119
+ //# sourceMappingURL=userTiming.js.map