@kubesense/kubesense-browser-rum-core 1.8.0 → 2.0.0-beta.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 (922) hide show
  1. package/LICENSE +1 -1
  2. package/cjs/boot/preStartRum.d.ts +4 -3
  3. package/cjs/boot/preStartRum.js +229 -204
  4. package/cjs/boot/preStartRum.js.map +1 -1
  5. package/cjs/boot/rumPublicApi.d.ts +190 -51
  6. package/cjs/boot/rumPublicApi.js +267 -164
  7. package/cjs/boot/rumPublicApi.js.map +1 -1
  8. package/cjs/boot/startRum.d.ts +42 -31
  9. package/cjs/boot/startRum.js +157 -150
  10. package/cjs/boot/startRum.js.map +1 -1
  11. package/cjs/browser/cookieObservable.d.ts +1 -5
  12. package/cjs/browser/cookieObservable.js +30 -34
  13. package/cjs/browser/cookieObservable.js.map +1 -1
  14. package/cjs/browser/domMutationObservable.d.ts +3 -3
  15. package/cjs/browser/domMutationObservable.js +29 -53
  16. package/cjs/browser/domMutationObservable.js.map +1 -1
  17. package/cjs/browser/htmlDomUtils.d.ts +5 -0
  18. package/cjs/browser/htmlDomUtils.js +38 -28
  19. package/cjs/browser/htmlDomUtils.js.map +1 -1
  20. package/cjs/browser/locationChangeObservable.d.ts +1 -2
  21. package/cjs/browser/locationChangeObservable.js +44 -45
  22. package/cjs/browser/locationChangeObservable.js.map +1 -1
  23. package/cjs/browser/performanceObservable.d.ts +4 -4
  24. package/cjs/browser/performanceObservable.js +50 -114
  25. package/cjs/browser/performanceObservable.js.map +1 -1
  26. package/cjs/browser/performanceUtils.d.ts +13 -1
  27. package/cjs/browser/performanceUtils.js +63 -37
  28. package/cjs/browser/performanceUtils.js.map +1 -1
  29. package/cjs/browser/scroll.js +17 -28
  30. package/cjs/browser/scroll.js.map +1 -1
  31. package/cjs/browser/viewportObservable.d.ts +2 -3
  32. package/cjs/browser/viewportObservable.js +29 -31
  33. package/cjs/browser/viewportObservable.js.map +1 -1
  34. package/cjs/browser/windowOpenObservable.js +11 -7
  35. package/cjs/browser/windowOpenObservable.js.map +1 -1
  36. package/cjs/domain/action/actionCollection.d.ts +11 -12
  37. package/cjs/domain/action/actionCollection.js +82 -89
  38. package/cjs/domain/action/actionCollection.js.map +1 -1
  39. package/cjs/domain/action/actionNameConstants.js +10 -9
  40. package/cjs/domain/action/actionNameConstants.js.map +1 -1
  41. package/cjs/domain/action/clickChain.js +51 -54
  42. package/cjs/domain/action/clickChain.js.map +1 -1
  43. package/cjs/domain/action/computeFrustration.js +30 -62
  44. package/cjs/domain/action/computeFrustration.js.map +1 -1
  45. package/cjs/domain/action/frustrationIgnore.d.ts +9 -0
  46. package/cjs/domain/action/frustrationIgnore.js +32 -0
  47. package/cjs/domain/action/frustrationIgnore.js.map +1 -0
  48. package/cjs/domain/action/getActionNameFromElement.js +141 -217
  49. package/cjs/domain/action/getActionNameFromElement.js.map +1 -1
  50. package/cjs/domain/action/interactionSelectorCache.d.ts +1 -1
  51. package/cjs/domain/action/interactionSelectorCache.js +17 -18
  52. package/cjs/domain/action/interactionSelectorCache.js.map +1 -1
  53. package/cjs/domain/action/isActionChildEvent.d.ts +2 -0
  54. package/cjs/domain/action/isActionChildEvent.js +8 -0
  55. package/cjs/domain/action/isActionChildEvent.js.map +1 -0
  56. package/cjs/domain/action/listenActionEvents.d.ts +2 -3
  57. package/cjs/domain/action/listenActionEvents.js +51 -55
  58. package/cjs/domain/action/listenActionEvents.js.map +1 -1
  59. package/cjs/domain/action/trackClickActions.d.ts +15 -21
  60. package/cjs/domain/action/trackClickActions.js +188 -226
  61. package/cjs/domain/action/trackClickActions.js.map +1 -1
  62. package/cjs/domain/action/trackManualActions.d.ts +45 -0
  63. package/cjs/domain/action/trackManualActions.js +48 -0
  64. package/cjs/domain/action/trackManualActions.js.map +1 -0
  65. package/cjs/domain/assembly.d.ts +1 -2
  66. package/cjs/domain/assembly.js +80 -95
  67. package/cjs/domain/assembly.js.map +1 -1
  68. package/cjs/domain/configuration/configuration.d.ts +575 -81
  69. package/cjs/domain/configuration/configuration.js +464 -199
  70. package/cjs/domain/configuration/configuration.js.map +1 -1
  71. package/cjs/domain/configuration/index.d.ts +1 -0
  72. package/cjs/domain/configuration/index.js +27 -21
  73. package/cjs/domain/configuration/jsonPathParser.js +125 -139
  74. package/cjs/domain/configuration/jsonPathParser.js.map +1 -1
  75. package/cjs/domain/configuration/remoteConfiguration.d.ts +18 -5
  76. package/cjs/domain/configuration/remoteConfiguration.js +268 -226
  77. package/cjs/domain/configuration/remoteConfiguration.js.map +1 -1
  78. package/cjs/domain/configuration/remoteConfiguration.types.d.ts +49 -0
  79. package/cjs/domain/configuration/remoteConfigurationCache.d.ts +42 -0
  80. package/cjs/domain/configuration/remoteConfigurationCache.js +95 -0
  81. package/cjs/domain/configuration/remoteConfigurationCache.js.map +1 -0
  82. package/cjs/domain/configuration/remoteSdkConfiguration.d.ts +11 -2
  83. package/cjs/domain/configuration/remoteSdkConfiguration.js +185 -117
  84. package/cjs/domain/configuration/remoteSdkConfiguration.js.map +1 -1
  85. package/cjs/domain/configuration/sessionReplayRoutes.d.ts +1 -6
  86. package/cjs/domain/configuration/sessionReplayRoutes.js +20 -63
  87. package/cjs/domain/configuration/sessionReplayRoutes.js.map +1 -1
  88. package/cjs/domain/contexts/ciVisibilityContext.d.ts +2 -4
  89. package/cjs/domain/contexts/ciVisibilityContext.js +36 -32
  90. package/cjs/domain/contexts/ciVisibilityContext.js.map +1 -1
  91. package/cjs/domain/contexts/connectivityContext.d.ts +2 -2
  92. package/cjs/domain/contexts/connectivityContext.js +10 -9
  93. package/cjs/domain/contexts/connectivityContext.js.map +1 -1
  94. package/cjs/domain/contexts/defaultContext.d.ts +3 -3
  95. package/cjs/domain/contexts/defaultContext.js +28 -32
  96. package/cjs/domain/contexts/defaultContext.js.map +1 -1
  97. package/cjs/domain/contexts/displayContext.d.ts +2 -3
  98. package/cjs/domain/contexts/displayContext.js +22 -26
  99. package/cjs/domain/contexts/displayContext.js.map +1 -1
  100. package/cjs/domain/contexts/featureFlagContext.d.ts +2 -2
  101. package/cjs/domain/contexts/featureFlagContext.js +38 -50
  102. package/cjs/domain/contexts/featureFlagContext.js.map +1 -1
  103. package/cjs/domain/contexts/internalContext.d.ts +2 -3
  104. package/cjs/domain/contexts/internalContext.js +26 -22
  105. package/cjs/domain/contexts/internalContext.js.map +1 -1
  106. package/cjs/domain/contexts/pageStateHistory.d.ts +3 -4
  107. package/cjs/domain/contexts/pageStateHistory.js +76 -96
  108. package/cjs/domain/contexts/pageStateHistory.js.map +1 -1
  109. package/cjs/domain/contexts/sessionContext.d.ts +9 -3
  110. package/cjs/domain/contexts/sessionContext.js +31 -45
  111. package/cjs/domain/contexts/sessionContext.js.map +1 -1
  112. package/cjs/domain/contexts/sourceCodeMfeContext.d.ts +10 -0
  113. package/cjs/domain/contexts/sourceCodeMfeContext.js +35 -0
  114. package/cjs/domain/contexts/sourceCodeMfeContext.js.map +1 -0
  115. package/cjs/domain/contexts/syntheticsContext.d.ts +2 -2
  116. package/cjs/domain/contexts/syntheticsContext.js +19 -23
  117. package/cjs/domain/contexts/syntheticsContext.js.map +1 -1
  118. package/cjs/domain/contexts/trackingConsentContext.d.ts +2 -2
  119. package/cjs/domain/contexts/trackingConsentContext.js +10 -12
  120. package/cjs/domain/contexts/trackingConsentContext.js.map +1 -1
  121. package/cjs/domain/contexts/urlContexts.d.ts +4 -3
  122. package/cjs/domain/contexts/urlContexts.js +65 -61
  123. package/cjs/domain/contexts/urlContexts.js.map +1 -1
  124. package/cjs/domain/contexts/userAgentDataContext.d.ts +2 -2
  125. package/cjs/domain/contexts/userAgentDataContext.js +20 -29
  126. package/cjs/domain/contexts/userAgentDataContext.js.map +1 -1
  127. package/cjs/domain/contexts/viewHistory.d.ts +5 -2
  128. package/cjs/domain/contexts/viewHistory.js +41 -45
  129. package/cjs/domain/contexts/viewHistory.js.map +1 -1
  130. package/cjs/domain/discardNegativeDuration.d.ts +1 -1
  131. package/cjs/domain/discardNegativeDuration.js +6 -5
  132. package/cjs/domain/discardNegativeDuration.js.map +1 -1
  133. package/cjs/domain/error/errorCollection.d.ts +3 -3
  134. package/cjs/domain/error/errorCollection.js +67 -68
  135. package/cjs/domain/error/errorCollection.js.map +1 -1
  136. package/cjs/domain/error/trackReportError.d.ts +1 -2
  137. package/cjs/domain/error/trackReportError.js +10 -14
  138. package/cjs/domain/error/trackReportError.js.map +1 -1
  139. package/cjs/domain/event/eventCollection.d.ts +2 -1
  140. package/cjs/domain/event/eventCollection.js +21 -22
  141. package/cjs/domain/event/eventCollection.js.map +1 -1
  142. package/cjs/domain/eventTracker.d.ts +37 -0
  143. package/cjs/domain/eventTracker.js +94 -0
  144. package/cjs/domain/eventTracker.js.map +1 -0
  145. package/cjs/domain/extractRegexMatch.d.ts +5 -0
  146. package/cjs/domain/extractRegexMatch.js +16 -0
  147. package/cjs/domain/extractRegexMatch.js.map +1 -0
  148. package/cjs/domain/getComposedPathSelector.d.ts +22 -0
  149. package/cjs/domain/getComposedPathSelector.js +95 -0
  150. package/cjs/domain/getComposedPathSelector.js.map +1 -0
  151. package/cjs/domain/getSelectorFromElement.d.ts +18 -6
  152. package/cjs/domain/getSelectorFromElement.js +199 -191
  153. package/cjs/domain/getSelectorFromElement.js.map +1 -1
  154. package/cjs/domain/getSessionReplayUrl.d.ts +2 -2
  155. package/cjs/domain/getSessionReplayUrl.js +17 -30
  156. package/cjs/domain/getSessionReplayUrl.js.map +1 -1
  157. package/cjs/domain/hooks.d.ts +26 -17
  158. package/cjs/domain/hooks.js +12 -5
  159. package/cjs/domain/hooks.js.map +1 -1
  160. package/cjs/domain/lifeCycle.d.ts +26 -12
  161. package/cjs/domain/lifeCycle.js +28 -5
  162. package/cjs/domain/lifeCycle.js.map +1 -1
  163. package/cjs/domain/limitModification.d.ts +5 -1
  164. package/cjs/domain/limitModification.js +32 -36
  165. package/cjs/domain/limitModification.js.map +1 -1
  166. package/cjs/domain/longTask/longTaskCollection.d.ts +0 -13
  167. package/cjs/domain/longTask/longTaskCollection.js +75 -87
  168. package/cjs/domain/longTask/longTaskCollection.js.map +1 -1
  169. package/cjs/domain/plugins.d.ts +37 -14
  170. package/cjs/domain/plugins.js +22 -13
  171. package/cjs/domain/plugins.js.map +1 -1
  172. package/cjs/domain/privacy.d.ts +6 -1
  173. package/cjs/domain/privacy.js +143 -286
  174. package/cjs/domain/privacy.js.map +1 -1
  175. package/cjs/domain/privacyConstants.js +43 -34
  176. package/cjs/domain/privacyConstants.js.map +1 -1
  177. package/cjs/domain/requestCollection.d.ts +6 -5
  178. package/cjs/domain/requestCollection.js +82 -105
  179. package/cjs/domain/requestCollection.js.map +1 -1
  180. package/cjs/domain/resource/graphql.d.ts +1 -1
  181. package/cjs/domain/resource/graphql.js +85 -86
  182. package/cjs/domain/resource/graphql.js.map +1 -1
  183. package/cjs/domain/resource/requestRegistry.js +30 -38
  184. package/cjs/domain/resource/requestRegistry.js.map +1 -1
  185. package/cjs/domain/resource/resourceCollection.d.ts +5 -3
  186. package/cjs/domain/resource/resourceCollection.js +241 -175
  187. package/cjs/domain/resource/resourceCollection.js.map +1 -1
  188. package/cjs/domain/resource/resourceUtils.d.ts +13 -13
  189. package/cjs/domain/resource/resourceUtils.js +323 -221
  190. package/cjs/domain/resource/resourceUtils.js.map +1 -1
  191. package/cjs/domain/resource/trackManualResources.d.ts +55 -0
  192. package/cjs/domain/resource/trackManualResources.js +53 -0
  193. package/cjs/domain/resource/trackManualResources.js.map +1 -0
  194. package/cjs/domain/resource/webSocketCollection.d.ts +46 -0
  195. package/cjs/domain/resource/webSocketCollection.js +163 -0
  196. package/cjs/domain/resource/webSocketCollection.js.map +1 -0
  197. package/cjs/domain/session/session.types.d.ts +4 -0
  198. package/cjs/domain/sessionReplayState.d.ts +8 -0
  199. package/cjs/domain/sessionReplayState.js +19 -0
  200. package/cjs/domain/sessionReplayState.js.map +1 -0
  201. package/cjs/domain/startCustomerDataTelemetry.js +39 -43
  202. package/cjs/domain/startCustomerDataTelemetry.js.map +1 -1
  203. package/cjs/domain/tracing/getDocumentTraceId.d.ts +1 -1
  204. package/cjs/domain/tracing/getDocumentTraceId.js +42 -63
  205. package/cjs/domain/tracing/getDocumentTraceId.js.map +1 -1
  206. package/cjs/domain/tracing/identifier.js +13 -46
  207. package/cjs/domain/tracing/identifier.js.map +1 -1
  208. package/cjs/domain/tracing/tracer.d.ts +2 -5
  209. package/cjs/domain/tracing/tracer.js +110 -150
  210. package/cjs/domain/tracing/tracer.js.map +1 -1
  211. package/cjs/domain/trackEventCounts.js +43 -48
  212. package/cjs/domain/trackEventCounts.js.map +1 -1
  213. package/cjs/domain/view/bfCacheSupport.d.ts +1 -2
  214. package/cjs/domain/view/bfCacheSupport.js +10 -11
  215. package/cjs/domain/view/bfCacheSupport.js.map +1 -1
  216. package/cjs/domain/view/trackViewEventCounts.js +14 -13
  217. package/cjs/domain/view/trackViewEventCounts.js.map +1 -1
  218. package/cjs/domain/view/trackViews.d.ts +8 -2
  219. package/cjs/domain/view/trackViews.js +221 -270
  220. package/cjs/domain/view/trackViews.js.map +1 -1
  221. package/cjs/domain/view/viewCollection.d.ts +4 -3
  222. package/cjs/domain/view/viewCollection.js +124 -148
  223. package/cjs/domain/view/viewCollection.js.map +1 -1
  224. package/cjs/domain/view/viewDiff.d.ts +22 -0
  225. package/cjs/domain/view/viewDiff.js +62 -0
  226. package/cjs/domain/view/viewDiff.js.map +1 -0
  227. package/cjs/domain/view/viewMetrics/getClsAttributionImpactedArea.js +20 -22
  228. package/cjs/domain/view/viewMetrics/getClsAttributionImpactedArea.js.map +1 -1
  229. package/cjs/domain/view/viewMetrics/interactionCountPolyfill.d.ts +1 -0
  230. package/cjs/domain/view/viewMetrics/interactionCountPolyfill.js +35 -33
  231. package/cjs/domain/view/viewMetrics/interactionCountPolyfill.js.map +1 -1
  232. package/cjs/domain/view/viewMetrics/trackBfcacheMetrics.d.ts +1 -1
  233. package/cjs/domain/view/viewMetrics/trackBfcacheMetrics.js +14 -13
  234. package/cjs/domain/view/viewMetrics/trackBfcacheMetrics.js.map +1 -1
  235. package/cjs/domain/view/viewMetrics/trackCommonViewMetrics.d.ts +4 -2
  236. package/cjs/domain/view/viewMetrics/trackCommonViewMetrics.js +51 -34
  237. package/cjs/domain/view/viewMetrics/trackCommonViewMetrics.js.map +1 -1
  238. package/cjs/domain/view/viewMetrics/trackCumulativeLayoutShift.d.ts +1 -1
  239. package/cjs/domain/view/viewMetrics/trackCumulativeLayoutShift.js +106 -122
  240. package/cjs/domain/view/viewMetrics/trackCumulativeLayoutShift.js.map +1 -1
  241. package/cjs/domain/view/viewMetrics/trackFirstContentfulPaint.d.ts +2 -3
  242. package/cjs/domain/view/viewMetrics/trackFirstContentfulPaint.js +26 -34
  243. package/cjs/domain/view/viewMetrics/trackFirstContentfulPaint.js.map +1 -1
  244. package/cjs/domain/view/viewMetrics/trackFirstHidden.d.ts +2 -3
  245. package/cjs/domain/view/viewMetrics/trackFirstHidden.js +31 -31
  246. package/cjs/domain/view/viewMetrics/trackFirstHidden.js.map +1 -1
  247. package/cjs/domain/view/viewMetrics/trackInitialViewMetrics.d.ts +1 -3
  248. package/cjs/domain/view/viewMetrics/trackInitialViewMetrics.js +33 -38
  249. package/cjs/domain/view/viewMetrics/trackInitialViewMetrics.js.map +1 -1
  250. package/cjs/domain/view/viewMetrics/trackInteractionToNextPaint.d.ts +10 -1
  251. package/cjs/domain/view/viewMetrics/trackInteractionToNextPaint.js +202 -144
  252. package/cjs/domain/view/viewMetrics/trackInteractionToNextPaint.js.map +1 -1
  253. package/cjs/domain/view/viewMetrics/trackLargestContentfulPaint.d.ts +6 -1
  254. package/cjs/domain/view/viewMetrics/trackLargestContentfulPaint.js +65 -55
  255. package/cjs/domain/view/viewMetrics/trackLargestContentfulPaint.js.map +1 -1
  256. package/cjs/domain/view/viewMetrics/trackLoadingTime.d.ts +2 -1
  257. package/cjs/domain/view/viewMetrics/trackLoadingTime.js +42 -46
  258. package/cjs/domain/view/viewMetrics/trackLoadingTime.js.map +1 -1
  259. package/cjs/domain/view/viewMetrics/trackNavigationTimings.d.ts +2 -3
  260. package/cjs/domain/view/viewMetrics/trackNavigationTimings.js +28 -36
  261. package/cjs/domain/view/viewMetrics/trackNavigationTimings.js.map +1 -1
  262. package/cjs/domain/view/viewMetrics/trackScrollMetrics.d.ts +3 -4
  263. package/cjs/domain/view/viewMetrics/trackScrollMetrics.js +63 -72
  264. package/cjs/domain/view/viewMetrics/trackScrollMetrics.js.map +1 -1
  265. package/cjs/domain/vital/vitalCollection.d.ts +44 -20
  266. package/cjs/domain/vital/vitalCollection.js +81 -109
  267. package/cjs/domain/vital/vitalCollection.js.map +1 -1
  268. package/cjs/domain/waitPageActivityEnd.d.ts +1 -4
  269. package/cjs/domain/waitPageActivityEnd.js +99 -119
  270. package/cjs/domain/waitPageActivityEnd.js.map +1 -1
  271. package/cjs/domainContext.types.d.ts +21 -13
  272. package/cjs/index.d.ts +11 -10
  273. package/cjs/index.js +84 -62
  274. package/cjs/rawRumEvent.types.d.ts +79 -13
  275. package/cjs/rawRumEvent.types.js +40 -27
  276. package/cjs/rawRumEvent.types.js.map +1 -1
  277. package/cjs/rumEvent.types.d.ts +906 -669
  278. package/cjs/transport/formDataTransport.js +43 -41
  279. package/cjs/transport/formDataTransport.js.map +1 -1
  280. package/cjs/transport/startRumBatch.d.ts +27 -3
  281. package/cjs/transport/startRumBatch.js +132 -31
  282. package/cjs/transport/startRumBatch.js.map +1 -1
  283. package/cjs/transport/startRumEventBridge.js +10 -8
  284. package/cjs/transport/startRumEventBridge.js.map +1 -1
  285. package/esm/boot/preStartRum.mjs +233 -0
  286. package/esm/boot/preStartRum.mjs.map +1 -0
  287. package/esm/boot/rumPublicApi.mjs +271 -0
  288. package/esm/boot/rumPublicApi.mjs.map +1 -0
  289. package/esm/boot/startRum.mjs +159 -0
  290. package/esm/boot/startRum.mjs.map +1 -0
  291. package/esm/browser/cookieObservable.mjs +34 -0
  292. package/esm/browser/cookieObservable.mjs.map +1 -0
  293. package/esm/browser/domMutationObservable.mjs +33 -0
  294. package/esm/browser/domMutationObservable.mjs.map +1 -0
  295. package/esm/browser/htmlDomUtils.mjs +48 -0
  296. package/esm/browser/htmlDomUtils.mjs.map +1 -0
  297. package/esm/browser/locationChangeObservable.mjs +50 -0
  298. package/esm/browser/locationChangeObservable.mjs.map +1 -0
  299. package/esm/browser/performanceObservable.mjs +60 -0
  300. package/esm/browser/performanceObservable.mjs.map +1 -0
  301. package/esm/browser/performanceUtils.mjs +64 -0
  302. package/esm/browser/performanceUtils.mjs.map +1 -0
  303. package/esm/browser/scroll.mjs +21 -0
  304. package/esm/browser/scroll.mjs.map +1 -0
  305. package/esm/browser/viewportObservable.mjs +33 -0
  306. package/esm/browser/viewportObservable.mjs.map +1 -0
  307. package/esm/browser/windowOpenObservable.mjs +14 -0
  308. package/esm/browser/windowOpenObservable.mjs.map +1 -0
  309. package/esm/domain/action/actionCollection.mjs +89 -0
  310. package/esm/domain/action/actionCollection.mjs.map +1 -0
  311. package/esm/domain/action/actionNameConstants.mjs +11 -0
  312. package/esm/domain/action/actionNameConstants.mjs.map +1 -0
  313. package/esm/domain/action/clickChain.mjs +57 -0
  314. package/esm/domain/action/clickChain.mjs.map +1 -0
  315. package/esm/domain/action/computeFrustration.mjs +36 -0
  316. package/esm/domain/action/computeFrustration.mjs.map +1 -0
  317. package/esm/domain/action/frustrationIgnore.mjs +31 -0
  318. package/esm/domain/action/frustrationIgnore.mjs.map +1 -0
  319. package/esm/domain/action/getActionNameFromElement.mjs +163 -0
  320. package/esm/domain/action/getActionNameFromElement.mjs.map +1 -0
  321. package/esm/domain/action/interactionSelectorCache.mjs +19 -0
  322. package/esm/domain/action/interactionSelectorCache.mjs.map +1 -0
  323. package/esm/domain/action/isActionChildEvent.mjs +8 -0
  324. package/esm/domain/action/isActionChildEvent.mjs.map +1 -0
  325. package/esm/domain/action/listenActionEvents.mjs +57 -0
  326. package/esm/domain/action/listenActionEvents.mjs.map +1 -0
  327. package/esm/domain/action/trackClickActions.mjs +198 -0
  328. package/esm/domain/action/trackClickActions.mjs.map +1 -0
  329. package/esm/domain/action/trackManualActions.mjs +48 -0
  330. package/esm/domain/action/trackManualActions.mjs.map +1 -0
  331. package/esm/domain/assembly.mjs +87 -0
  332. package/esm/domain/assembly.mjs.map +1 -0
  333. package/esm/domain/configuration/configuration.mjs +474 -0
  334. package/esm/domain/configuration/configuration.mjs.map +1 -0
  335. package/esm/domain/configuration/index.mjs +6 -0
  336. package/esm/domain/configuration/jsonPathParser.mjs +145 -0
  337. package/esm/domain/configuration/jsonPathParser.mjs.map +1 -0
  338. package/esm/domain/configuration/remoteConfiguration.mjs +279 -0
  339. package/esm/domain/configuration/remoteConfiguration.mjs.map +1 -0
  340. package/esm/domain/configuration/remoteConfigurationCache.mjs +92 -0
  341. package/esm/domain/configuration/remoteConfigurationCache.mjs.map +1 -0
  342. package/esm/domain/configuration/remoteSdkConfiguration.mjs +208 -0
  343. package/esm/domain/configuration/remoteSdkConfiguration.mjs.map +1 -0
  344. package/esm/domain/configuration/sessionReplayRoutes.mjs +26 -0
  345. package/esm/domain/configuration/sessionReplayRoutes.mjs.map +1 -0
  346. package/esm/domain/contexts/ciVisibilityContext.mjs +37 -0
  347. package/esm/domain/contexts/ciVisibilityContext.mjs.map +1 -0
  348. package/esm/domain/contexts/connectivityContext.mjs +12 -0
  349. package/esm/domain/contexts/connectivityContext.mjs.map +1 -0
  350. package/esm/domain/contexts/defaultContext.mjs +30 -0
  351. package/esm/domain/contexts/defaultContext.mjs.map +1 -0
  352. package/esm/domain/contexts/displayContext.mjs +24 -0
  353. package/esm/domain/contexts/displayContext.mjs.map +1 -0
  354. package/esm/domain/contexts/featureFlagContext.mjs +40 -0
  355. package/esm/domain/contexts/featureFlagContext.mjs.map +1 -0
  356. package/esm/domain/contexts/internalContext.mjs +30 -0
  357. package/esm/domain/contexts/internalContext.mjs.map +1 -0
  358. package/esm/domain/contexts/pageStateHistory.mjs +82 -0
  359. package/esm/domain/contexts/pageStateHistory.mjs.map +1 -0
  360. package/esm/domain/contexts/sessionContext.mjs +33 -0
  361. package/esm/domain/contexts/sessionContext.mjs.map +1 -0
  362. package/esm/domain/contexts/sourceCodeMfeContext.mjs +35 -0
  363. package/esm/domain/contexts/sourceCodeMfeContext.mjs.map +1 -0
  364. package/esm/domain/contexts/syntheticsContext.mjs +21 -0
  365. package/esm/domain/contexts/syntheticsContext.mjs.map +1 -0
  366. package/esm/domain/contexts/trackingConsentContext.mjs +12 -0
  367. package/esm/domain/contexts/trackingConsentContext.mjs.map +1 -0
  368. package/esm/domain/contexts/urlContexts.mjs +67 -0
  369. package/esm/domain/contexts/urlContexts.mjs.map +1 -0
  370. package/esm/domain/contexts/userAgentDataContext.mjs +22 -0
  371. package/esm/domain/contexts/userAgentDataContext.mjs.map +1 -0
  372. package/esm/domain/contexts/viewHistory.mjs +43 -0
  373. package/esm/domain/contexts/viewHistory.mjs.map +1 -0
  374. package/esm/domain/discardNegativeDuration.mjs +9 -0
  375. package/esm/domain/discardNegativeDuration.mjs.map +1 -0
  376. package/esm/domain/error/errorCollection.mjs +72 -0
  377. package/esm/domain/error/errorCollection.mjs.map +1 -0
  378. package/esm/domain/error/trackReportError.mjs +12 -0
  379. package/esm/domain/error/trackReportError.mjs.map +1 -0
  380. package/esm/domain/event/eventCollection.mjs +26 -0
  381. package/esm/domain/event/eventCollection.mjs.map +1 -0
  382. package/esm/domain/eventTracker.mjs +93 -0
  383. package/esm/domain/eventTracker.mjs.map +1 -0
  384. package/esm/domain/extractRegexMatch.mjs +16 -0
  385. package/esm/domain/extractRegexMatch.mjs.map +1 -0
  386. package/esm/domain/getComposedPathSelector.mjs +93 -0
  387. package/esm/domain/getComposedPathSelector.mjs.map +1 -0
  388. package/esm/domain/getSelectorFromElement.mjs +218 -0
  389. package/esm/domain/getSelectorFromElement.mjs.map +1 -0
  390. package/esm/domain/getSessionReplayUrl.mjs +20 -0
  391. package/esm/domain/getSessionReplayUrl.mjs.map +1 -0
  392. package/esm/domain/hooks.mjs +13 -0
  393. package/esm/domain/hooks.mjs.map +1 -0
  394. package/esm/domain/lifeCycle.mjs +28 -0
  395. package/esm/domain/lifeCycle.mjs.map +1 -0
  396. package/esm/domain/limitModification.mjs +42 -0
  397. package/esm/domain/limitModification.mjs.map +1 -0
  398. package/esm/domain/longTask/longTaskCollection.mjs +79 -0
  399. package/esm/domain/longTask/longTaskCollection.mjs.map +1 -0
  400. package/esm/domain/plugins.mjs +23 -0
  401. package/esm/domain/plugins.mjs.map +1 -0
  402. package/esm/domain/privacy.mjs +161 -0
  403. package/esm/domain/privacy.mjs.map +1 -0
  404. package/esm/domain/privacyConstants.mjs +36 -0
  405. package/esm/domain/privacyConstants.mjs.map +1 -0
  406. package/esm/domain/requestCollection.mjs +86 -0
  407. package/esm/domain/requestCollection.mjs.map +1 -0
  408. package/esm/domain/resource/graphql.mjs +93 -0
  409. package/esm/domain/resource/graphql.mjs.map +1 -0
  410. package/esm/domain/resource/requestRegistry.mjs +32 -0
  411. package/esm/domain/resource/requestRegistry.mjs.map +1 -0
  412. package/esm/domain/resource/resourceCollection.mjs +256 -0
  413. package/esm/domain/resource/resourceCollection.mjs.map +1 -0
  414. package/esm/domain/resource/resourceUtils.mjs +349 -0
  415. package/esm/domain/resource/resourceUtils.mjs.map +1 -0
  416. package/esm/domain/resource/trackManualResources.mjs +53 -0
  417. package/esm/domain/resource/trackManualResources.mjs.map +1 -0
  418. package/esm/domain/resource/webSocketCollection.mjs +160 -0
  419. package/esm/domain/resource/webSocketCollection.mjs.map +1 -0
  420. package/esm/domain/sessionReplayState.mjs +18 -0
  421. package/esm/domain/sessionReplayState.mjs.map +1 -0
  422. package/esm/domain/startCustomerDataTelemetry.mjs +51 -0
  423. package/esm/domain/startCustomerDataTelemetry.mjs.map +1 -0
  424. package/esm/domain/tracing/getDocumentTraceId.mjs +50 -0
  425. package/esm/domain/tracing/getDocumentTraceId.mjs.map +1 -0
  426. package/esm/domain/tracing/identifier.mjs +20 -0
  427. package/esm/domain/tracing/identifier.mjs.map +1 -0
  428. package/esm/domain/tracing/tracer.mjs +120 -0
  429. package/esm/domain/tracing/tracer.mjs.map +1 -0
  430. package/esm/domain/trackEventCounts.mjs +45 -0
  431. package/esm/domain/trackEventCounts.mjs.map +1 -0
  432. package/esm/domain/view/bfCacheSupport.mjs +12 -0
  433. package/esm/domain/view/bfCacheSupport.mjs.map +1 -0
  434. package/esm/domain/view/trackViewEventCounts.mjs +17 -0
  435. package/esm/domain/view/trackViewEventCounts.mjs.map +1 -0
  436. package/esm/domain/view/trackViews.mjs +230 -0
  437. package/esm/domain/view/trackViews.mjs.map +1 -0
  438. package/esm/domain/view/viewCollection.mjs +129 -0
  439. package/esm/domain/view/viewCollection.mjs.map +1 -0
  440. package/esm/domain/view/viewDiff.mjs +61 -0
  441. package/esm/domain/view/viewDiff.mjs.map +1 -0
  442. package/esm/domain/view/viewMetrics/getClsAttributionImpactedArea.mjs +30 -0
  443. package/esm/domain/view/viewMetrics/getClsAttributionImpactedArea.mjs.map +1 -0
  444. package/esm/domain/view/viewMetrics/interactionCountPolyfill.mjs +45 -0
  445. package/esm/domain/view/viewMetrics/interactionCountPolyfill.mjs.map +1 -0
  446. package/esm/domain/view/viewMetrics/trackBfcacheMetrics.mjs +18 -0
  447. package/esm/domain/view/viewMetrics/trackBfcacheMetrics.mjs.map +1 -0
  448. package/esm/domain/view/viewMetrics/trackCommonViewMetrics.mjs +54 -0
  449. package/esm/domain/view/viewMetrics/trackCommonViewMetrics.mjs.map +1 -0
  450. package/esm/domain/view/viewMetrics/trackCumulativeLayoutShift.mjs +117 -0
  451. package/esm/domain/view/viewMetrics/trackCumulativeLayoutShift.mjs.map +1 -0
  452. package/esm/domain/view/viewMetrics/trackFirstContentfulPaint.mjs +29 -0
  453. package/esm/domain/view/viewMetrics/trackFirstContentfulPaint.mjs.map +1 -0
  454. package/esm/domain/view/viewMetrics/trackFirstHidden.mjs +33 -0
  455. package/esm/domain/view/viewMetrics/trackFirstHidden.mjs.map +1 -0
  456. package/esm/domain/view/viewMetrics/trackInitialViewMetrics.mjs +36 -0
  457. package/esm/domain/view/viewMetrics/trackInitialViewMetrics.mjs.map +1 -0
  458. package/esm/domain/view/viewMetrics/trackInteractionToNextPaint.mjs +210 -0
  459. package/esm/domain/view/viewMetrics/trackInteractionToNextPaint.mjs.map +1 -0
  460. package/esm/domain/view/viewMetrics/trackLargestContentfulPaint.mjs +70 -0
  461. package/esm/domain/view/viewMetrics/trackLargestContentfulPaint.mjs.map +1 -0
  462. package/esm/domain/view/viewMetrics/trackLoadingTime.mjs +46 -0
  463. package/esm/domain/view/viewMetrics/trackLoadingTime.mjs.map +1 -0
  464. package/esm/domain/view/viewMetrics/trackNavigationTimings.mjs +35 -0
  465. package/esm/domain/view/viewMetrics/trackNavigationTimings.mjs.map +1 -0
  466. package/esm/domain/view/viewMetrics/trackScrollMetrics.mjs +66 -0
  467. package/esm/domain/view/viewMetrics/trackScrollMetrics.mjs.map +1 -0
  468. package/esm/domain/vital/vitalCollection.mjs +85 -0
  469. package/esm/domain/vital/vitalCollection.mjs.map +1 -0
  470. package/esm/domain/waitPageActivityEnd.mjs +107 -0
  471. package/esm/domain/waitPageActivityEnd.mjs.map +1 -0
  472. package/esm/index.mjs +23 -0
  473. package/esm/rawRumEvent.types.mjs +42 -0
  474. package/esm/rawRumEvent.types.mjs.map +1 -0
  475. package/esm/transport/formDataTransport.mjs +48 -0
  476. package/esm/transport/formDataTransport.mjs.map +1 -0
  477. package/esm/transport/startRumBatch.mjs +132 -0
  478. package/esm/transport/startRumBatch.mjs.map +1 -0
  479. package/esm/transport/startRumEventBridge.mjs +13 -0
  480. package/esm/transport/startRumEventBridge.mjs.map +1 -0
  481. package/package.json +19 -11
  482. package/src/boot/preStartRum.ts +216 -88
  483. package/src/boot/rumPublicApi.ts +358 -119
  484. package/src/boot/startRum.ts +88 -84
  485. package/src/browser/cookieObservable.ts +19 -28
  486. package/src/browser/domMutationObservable.ts +7 -12
  487. package/src/browser/htmlDomUtils.ts +15 -0
  488. package/src/browser/locationChangeObservable.ts +23 -12
  489. package/src/browser/performanceObservable.ts +23 -73
  490. package/src/browser/performanceUtils.ts +52 -4
  491. package/src/browser/viewportObservable.ts +4 -6
  492. package/src/domain/action/actionCollection.ts +94 -87
  493. package/src/domain/action/clickChain.ts +11 -10
  494. package/src/domain/action/computeFrustration.ts +19 -5
  495. package/src/domain/action/frustrationIgnore.ts +54 -0
  496. package/src/domain/action/getActionNameFromElement.ts +27 -61
  497. package/src/domain/action/interactionSelectorCache.ts +2 -2
  498. package/src/domain/action/isActionChildEvent.ts +6 -0
  499. package/src/domain/action/listenActionEvents.ts +2 -11
  500. package/src/domain/action/trackClickActions.ts +92 -82
  501. package/src/domain/action/trackManualActions.ts +104 -0
  502. package/src/domain/assembly.ts +57 -70
  503. package/src/domain/configuration/configuration.ts +587 -208
  504. package/src/domain/configuration/index.ts +1 -0
  505. package/src/domain/configuration/remoteConfiguration.ts +152 -29
  506. package/src/domain/configuration/remoteConfiguration.types.ts +51 -1
  507. package/src/domain/configuration/remoteConfigurationCache.ts +153 -0
  508. package/src/domain/configuration/remoteSdkConfiguration.ts +131 -13
  509. package/src/domain/configuration/sessionReplayRoutes.ts +2 -47
  510. package/src/domain/contexts/ciVisibilityContext.ts +23 -12
  511. package/src/domain/contexts/connectivityContext.ts +7 -10
  512. package/src/domain/contexts/defaultContext.ts +11 -14
  513. package/src/domain/contexts/displayContext.ts +8 -12
  514. package/src/domain/contexts/featureFlagContext.ts +5 -4
  515. package/src/domain/contexts/internalContext.ts +3 -3
  516. package/src/domain/contexts/pageStateHistory.ts +20 -31
  517. package/src/domain/contexts/sessionContext.ts +16 -22
  518. package/src/domain/contexts/sourceCodeMfeContext.ts +53 -0
  519. package/src/domain/contexts/syntheticsContext.ts +7 -17
  520. package/src/domain/contexts/trackingConsentContext.ts +7 -4
  521. package/src/domain/contexts/urlContexts.ts +13 -9
  522. package/src/domain/contexts/userAgentDataContext.ts +12 -13
  523. package/src/domain/contexts/viewHistory.ts +4 -3
  524. package/src/domain/discardNegativeDuration.ts +1 -1
  525. package/src/domain/error/errorCollection.ts +12 -22
  526. package/src/domain/error/trackReportError.ts +4 -7
  527. package/src/domain/event/eventCollection.ts +4 -2
  528. package/src/domain/eventTracker.ts +169 -0
  529. package/src/domain/extractRegexMatch.ts +15 -0
  530. package/src/domain/getComposedPathSelector.ts +130 -0
  531. package/src/domain/getSelectorFromElement.ts +125 -31
  532. package/src/domain/getSessionReplayUrl.ts +4 -13
  533. package/src/domain/hooks.ts +34 -21
  534. package/src/domain/lifeCycle.ts +21 -8
  535. package/src/domain/limitModification.ts +20 -4
  536. package/src/domain/longTask/longTaskCollection.ts +18 -47
  537. package/src/domain/plugins.ts +54 -25
  538. package/src/domain/privacy.ts +16 -24
  539. package/src/domain/requestCollection.ts +108 -97
  540. package/src/domain/resource/graphql.ts +71 -25
  541. package/src/domain/resource/requestRegistry.ts +1 -3
  542. package/src/domain/resource/resourceCollection.ts +319 -137
  543. package/src/domain/resource/resourceUtils.ts +24 -26
  544. package/src/domain/resource/trackManualResources.ts +121 -0
  545. package/src/domain/resource/webSocketCollection.ts +281 -0
  546. package/src/domain/session/session.types.ts +5 -0
  547. package/src/domain/sessionReplayState.ts +36 -0
  548. package/src/domain/startCustomerDataTelemetry.ts +2 -2
  549. package/src/domain/tracing/getDocumentTraceId.ts +5 -4
  550. package/src/domain/tracing/identifier.ts +6 -37
  551. package/src/domain/tracing/tracer.ts +22 -21
  552. package/src/domain/tracing/tracer.types.ts +3 -3
  553. package/src/domain/view/bfCacheSupport.ts +1 -6
  554. package/src/domain/view/trackViews.ts +40 -37
  555. package/src/domain/view/viewCollection.ts +29 -23
  556. package/src/domain/view/viewDiff.ts +115 -0
  557. package/src/domain/view/viewMetrics/interactionCountPolyfill.ts +13 -2
  558. package/src/domain/view/viewMetrics/trackBfcacheMetrics.ts +1 -1
  559. package/src/domain/view/viewMetrics/trackCommonViewMetrics.ts +27 -6
  560. package/src/domain/view/viewMetrics/trackCumulativeLayoutShift.ts +5 -3
  561. package/src/domain/view/viewMetrics/trackFirstContentfulPaint.ts +4 -9
  562. package/src/domain/view/viewMetrics/trackFirstHidden.ts +2 -8
  563. package/src/domain/view/viewMetrics/trackInitialViewMetrics.ts +4 -13
  564. package/src/domain/view/viewMetrics/trackInteractionToNextPaint.ts +180 -35
  565. package/src/domain/view/viewMetrics/trackLargestContentfulPaint.ts +47 -6
  566. package/src/domain/view/viewMetrics/trackLoadingTime.ts +4 -3
  567. package/src/domain/view/viewMetrics/trackNavigationTimings.ts +10 -18
  568. package/src/domain/view/viewMetrics/trackScrollMetrics.ts +23 -37
  569. package/src/domain/vital/vitalCollection.ts +83 -102
  570. package/src/domain/waitPageActivityEnd.ts +7 -11
  571. package/src/domainContext.types.ts +23 -15
  572. package/src/index.ts +17 -11
  573. package/src/rawRumEvent.types.ts +80 -26
  574. package/src/rumEvent.types.ts +730 -505
  575. package/src/transport/formDataTransport.ts +16 -6
  576. package/src/transport/startRumBatch.ts +181 -24
  577. package/cjs/browser/firstInputPolyfill.d.ts +0 -8
  578. package/cjs/browser/firstInputPolyfill.js +0 -68
  579. package/cjs/browser/firstInputPolyfill.js.map +0 -1
  580. package/cjs/domain/configuration/index.js.map +0 -1
  581. package/cjs/domain/configuration/remoteConfiguration.types.js +0 -7
  582. package/cjs/domain/configuration/remoteConfiguration.types.js.map +0 -1
  583. package/cjs/domain/error/trackConsoleError.d.ts +0 -4
  584. package/cjs/domain/error/trackConsoleError.js +0 -13
  585. package/cjs/domain/error/trackConsoleError.js.map +0 -1
  586. package/cjs/domain/resource/matchRequestResourceEntry.d.ts +0 -16
  587. package/cjs/domain/resource/matchRequestResourceEntry.js +0 -49
  588. package/cjs/domain/resource/matchRequestResourceEntry.js.map +0 -1
  589. package/cjs/domain/resource/retrieveInitialDocumentResourceTiming.d.ts +0 -4
  590. package/cjs/domain/resource/retrieveInitialDocumentResourceTiming.js +0 -24
  591. package/cjs/domain/resource/retrieveInitialDocumentResourceTiming.js.map +0 -1
  592. package/cjs/domain/rumSessionManager.d.ts +0 -36
  593. package/cjs/domain/rumSessionManager.js +0 -77
  594. package/cjs/domain/rumSessionManager.js.map +0 -1
  595. package/cjs/domain/sampler/sampler.d.ts +0 -10
  596. package/cjs/domain/sampler/sampler.js +0 -63
  597. package/cjs/domain/sampler/sampler.js.map +0 -1
  598. package/cjs/domain/tracing/sampler.d.ts +0 -10
  599. package/cjs/domain/tracing/sampler.js +0 -69
  600. package/cjs/domain/tracing/sampler.js.map +0 -1
  601. package/cjs/domain/tracing/tracer.types.js +0 -3
  602. package/cjs/domain/tracing/tracer.types.js.map +0 -1
  603. package/cjs/domain/view/viewMetrics/startInitialViewMetricsTelemetry.d.ts +0 -6
  604. package/cjs/domain/view/viewMetrics/startInitialViewMetricsTelemetry.js +0 -44
  605. package/cjs/domain/view/viewMetrics/startInitialViewMetricsTelemetry.js.map +0 -1
  606. package/cjs/domain/view/viewMetrics/trackFirstInput.d.ts +0 -19
  607. package/cjs/domain/view/viewMetrics/trackFirstInput.js +0 -43
  608. package/cjs/domain/view/viewMetrics/trackFirstInput.js.map +0 -1
  609. package/cjs/domainContext.types.js +0 -6
  610. package/cjs/domainContext.types.js.map +0 -1
  611. package/cjs/index.js.map +0 -1
  612. package/cjs/rumEvent.types.js +0 -7
  613. package/cjs/rumEvent.types.js.map +0 -1
  614. package/esm/boot/preStartRum.d.ts +0 -7
  615. package/esm/boot/preStartRum.js +0 -205
  616. package/esm/boot/preStartRum.js.map +0 -1
  617. package/esm/boot/rumPublicApi.d.ts +0 -409
  618. package/esm/boot/rumPublicApi.js +0 -165
  619. package/esm/boot/rumPublicApi.js.map +0 -1
  620. package/esm/boot/startRum.d.ts +0 -109
  621. package/esm/boot/startRum.js +0 -149
  622. package/esm/boot/startRum.js.map +0 -1
  623. package/esm/browser/cookieObservable.d.ts +0 -8
  624. package/esm/browser/cookieObservable.js +0 -35
  625. package/esm/browser/cookieObservable.js.map +0 -1
  626. package/esm/browser/domMutationObservable.d.ts +0 -27
  627. package/esm/browser/domMutationObservable.js +0 -54
  628. package/esm/browser/domMutationObservable.js.map +0 -1
  629. package/esm/browser/firstInputPolyfill.d.ts +0 -8
  630. package/esm/browser/firstInputPolyfill.js +0 -65
  631. package/esm/browser/firstInputPolyfill.js.map +0 -1
  632. package/esm/browser/htmlDomUtils.d.ts +0 -13
  633. package/esm/browser/htmlDomUtils.js +0 -36
  634. package/esm/browser/htmlDomUtils.js.map +0 -1
  635. package/esm/browser/locationChangeObservable.d.ts +0 -7
  636. package/esm/browser/locationChangeObservable.js +0 -48
  637. package/esm/browser/locationChangeObservable.js.map +0 -1
  638. package/esm/browser/performanceObservable.d.ts +0 -174
  639. package/esm/browser/performanceObservable.js +0 -121
  640. package/esm/browser/performanceObservable.js.map +0 -1
  641. package/esm/browser/performanceUtils.d.ts +0 -7
  642. package/esm/browser/performanceUtils.js +0 -38
  643. package/esm/browser/performanceUtils.js.map +0 -1
  644. package/esm/browser/scroll.d.ts +0 -2
  645. package/esm/browser/scroll.js +0 -29
  646. package/esm/browser/scroll.js.map +0 -1
  647. package/esm/browser/viewportObservable.d.ts +0 -10
  648. package/esm/browser/viewportObservable.js +0 -32
  649. package/esm/browser/viewportObservable.js.map +0 -1
  650. package/esm/browser/windowOpenObservable.d.ts +0 -5
  651. package/esm/browser/windowOpenObservable.js +0 -7
  652. package/esm/browser/windowOpenObservable.js.map +0 -1
  653. package/esm/domain/action/actionCollection.d.ts +0 -21
  654. package/esm/domain/action/actionCollection.js +0 -93
  655. package/esm/domain/action/actionCollection.js.map +0 -1
  656. package/esm/domain/action/actionNameConstants.d.ts +0 -18
  657. package/esm/domain/action/actionNameConstants.js +0 -8
  658. package/esm/domain/action/actionNameConstants.js.map +0 -1
  659. package/esm/domain/action/clickChain.d.ts +0 -8
  660. package/esm/domain/action/clickChain.js +0 -57
  661. package/esm/domain/action/clickChain.js.map +0 -1
  662. package/esm/domain/action/computeFrustration.d.ts +0 -6
  663. package/esm/domain/action/computeFrustration.js +0 -65
  664. package/esm/domain/action/computeFrustration.js.map +0 -1
  665. package/esm/domain/action/getActionNameFromElement.d.ts +0 -4
  666. package/esm/domain/action/getActionNameFromElement.js +0 -236
  667. package/esm/domain/action/getActionNameFromElement.js.map +0 -1
  668. package/esm/domain/action/interactionSelectorCache.d.ts +0 -5
  669. package/esm/domain/action/interactionSelectorCache.js +0 -18
  670. package/esm/domain/action/interactionSelectorCache.js.map +0 -1
  671. package/esm/domain/action/listenActionEvents.d.ts +0 -19
  672. package/esm/domain/action/listenActionEvents.js +0 -58
  673. package/esm/domain/action/listenActionEvents.js.map +0 -1
  674. package/esm/domain/action/trackClickActions.d.ts +0 -81
  675. package/esm/domain/action/trackClickActions.js +0 -232
  676. package/esm/domain/action/trackClickActions.js.map +0 -1
  677. package/esm/domain/assembly.d.ts +0 -5
  678. package/esm/domain/assembly.js +0 -99
  679. package/esm/domain/assembly.js.map +0 -1
  680. package/esm/domain/configuration/configuration.d.ts +0 -358
  681. package/esm/domain/configuration/configuration.js +0 -209
  682. package/esm/domain/configuration/configuration.js.map +0 -1
  683. package/esm/domain/configuration/index.d.ts +0 -4
  684. package/esm/domain/configuration/index.js +0 -5
  685. package/esm/domain/configuration/index.js.map +0 -1
  686. package/esm/domain/configuration/jsonPathParser.d.ts +0 -28
  687. package/esm/domain/configuration/jsonPathParser.js +0 -156
  688. package/esm/domain/configuration/jsonPathParser.js.map +0 -1
  689. package/esm/domain/configuration/remoteConfiguration.d.ts +0 -39
  690. package/esm/domain/configuration/remoteConfiguration.js +0 -236
  691. package/esm/domain/configuration/remoteConfiguration.js.map +0 -1
  692. package/esm/domain/configuration/remoteConfiguration.types.d.ts +0 -138
  693. package/esm/domain/configuration/remoteConfiguration.types.js +0 -6
  694. package/esm/domain/configuration/remoteConfiguration.types.js.map +0 -1
  695. package/esm/domain/configuration/remoteSdkConfiguration.d.ts +0 -18
  696. package/esm/domain/configuration/remoteSdkConfiguration.js +0 -137
  697. package/esm/domain/configuration/remoteSdkConfiguration.js.map +0 -1
  698. package/esm/domain/configuration/sessionReplayRoutes.d.ts +0 -35
  699. package/esm/domain/configuration/sessionReplayRoutes.js +0 -65
  700. package/esm/domain/configuration/sessionReplayRoutes.js.map +0 -1
  701. package/esm/domain/contexts/ciVisibilityContext.d.ts +0 -12
  702. package/esm/domain/contexts/ciVisibilityContext.js +0 -30
  703. package/esm/domain/contexts/ciVisibilityContext.js.map +0 -1
  704. package/esm/domain/contexts/connectivityContext.d.ts +0 -2
  705. package/esm/domain/contexts/connectivityContext.js +0 -8
  706. package/esm/domain/contexts/connectivityContext.js.map +0 -1
  707. package/esm/domain/contexts/defaultContext.d.ts +0 -4
  708. package/esm/domain/contexts/defaultContext.js +0 -31
  709. package/esm/domain/contexts/defaultContext.js.map +0 -1
  710. package/esm/domain/contexts/displayContext.d.ts +0 -6
  711. package/esm/domain/contexts/displayContext.js +0 -25
  712. package/esm/domain/contexts/displayContext.js.map +0 -1
  713. package/esm/domain/contexts/featureFlagContext.d.ts +0 -19
  714. package/esm/domain/contexts/featureFlagContext.js +0 -49
  715. package/esm/domain/contexts/featureFlagContext.js.map +0 -1
  716. package/esm/domain/contexts/internalContext.d.ts +0 -12
  717. package/esm/domain/contexts/internalContext.js +0 -23
  718. package/esm/domain/contexts/internalContext.js.map +0 -1
  719. package/esm/domain/contexts/pageStateHistory.d.ts +0 -23
  720. package/esm/domain/contexts/pageStateHistory.js +0 -100
  721. package/esm/domain/contexts/pageStateHistory.js.map +0 -1
  722. package/esm/domain/contexts/sessionContext.d.ts +0 -5
  723. package/esm/domain/contexts/sessionContext.js +0 -44
  724. package/esm/domain/contexts/sessionContext.js.map +0 -1
  725. package/esm/domain/contexts/syntheticsContext.d.ts +0 -2
  726. package/esm/domain/contexts/syntheticsContext.js +0 -22
  727. package/esm/domain/contexts/syntheticsContext.js.map +0 -1
  728. package/esm/domain/contexts/trackingConsentContext.d.ts +0 -3
  729. package/esm/domain/contexts/trackingConsentContext.js +0 -11
  730. package/esm/domain/contexts/trackingConsentContext.js.map +0 -1
  731. package/esm/domain/contexts/urlContexts.d.ts +0 -22
  732. package/esm/domain/contexts/urlContexts.js +0 -60
  733. package/esm/domain/contexts/urlContexts.js.map +0 -1
  734. package/esm/domain/contexts/userAgentDataContext.d.ts +0 -2
  735. package/esm/domain/contexts/userAgentDataContext.js +0 -28
  736. package/esm/domain/contexts/userAgentDataContext.js.map +0 -1
  737. package/esm/domain/contexts/viewHistory.d.ts +0 -17
  738. package/esm/domain/contexts/viewHistory.js +0 -44
  739. package/esm/domain/contexts/viewHistory.js.map +0 -1
  740. package/esm/domain/discardNegativeDuration.d.ts +0 -2
  741. package/esm/domain/discardNegativeDuration.js +0 -5
  742. package/esm/domain/discardNegativeDuration.js.map +0 -1
  743. package/esm/domain/error/errorCollection.d.ts +0 -17
  744. package/esm/domain/error/errorCollection.js +0 -70
  745. package/esm/domain/error/errorCollection.js.map +0 -1
  746. package/esm/domain/error/trackConsoleError.d.ts +0 -4
  747. package/esm/domain/error/trackConsoleError.js +0 -10
  748. package/esm/domain/error/trackConsoleError.js.map +0 -1
  749. package/esm/domain/error/trackReportError.d.ts +0 -5
  750. package/esm/domain/error/trackReportError.js +0 -13
  751. package/esm/domain/error/trackReportError.js.map +0 -1
  752. package/esm/domain/event/eventCollection.d.ts +0 -10
  753. package/esm/domain/event/eventCollection.js +0 -24
  754. package/esm/domain/event/eventCollection.js.map +0 -1
  755. package/esm/domain/getSelectorFromElement.d.ts +0 -64
  756. package/esm/domain/getSelectorFromElement.js +0 -213
  757. package/esm/domain/getSelectorFromElement.js.map +0 -1
  758. package/esm/domain/getSessionReplayUrl.d.ts +0 -9
  759. package/esm/domain/getSessionReplayUrl.js +0 -30
  760. package/esm/domain/getSessionReplayUrl.js.map +0 -1
  761. package/esm/domain/hooks.d.ts +0 -23
  762. package/esm/domain/hooks.js +0 -3
  763. package/esm/domain/hooks.js.map +0 -1
  764. package/esm/domain/lifeCycle.d.ts +0 -73
  765. package/esm/domain/lifeCycle.js +0 -3
  766. package/esm/domain/lifeCycle.js.map +0 -1
  767. package/esm/domain/limitModification.d.ts +0 -8
  768. package/esm/domain/limitModification.js +0 -43
  769. package/esm/domain/limitModification.js.map +0 -1
  770. package/esm/domain/longTask/longTaskCollection.d.ts +0 -18
  771. package/esm/domain/longTask/longTaskCollection.js +0 -87
  772. package/esm/domain/longTask/longTaskCollection.js.map +0 -1
  773. package/esm/domain/plugins.d.ts +0 -40
  774. package/esm/domain/plugins.js +0 -12
  775. package/esm/domain/plugins.js.map +0 -1
  776. package/esm/domain/privacy.d.ts +0 -44
  777. package/esm/domain/privacy.js +0 -302
  778. package/esm/domain/privacy.js.map +0 -1
  779. package/esm/domain/privacyConstants.d.ts +0 -23
  780. package/esm/domain/privacyConstants.js +0 -35
  781. package/esm/domain/privacyConstants.js.map +0 -1
  782. package/esm/domain/requestCollection.d.ts +0 -54
  783. package/esm/domain/requestCollection.js +0 -106
  784. package/esm/domain/requestCollection.js.map +0 -1
  785. package/esm/domain/resource/graphql.d.ts +0 -23
  786. package/esm/domain/resource/graphql.js +0 -91
  787. package/esm/domain/resource/graphql.js.map +0 -1
  788. package/esm/domain/resource/matchRequestResourceEntry.d.ts +0 -16
  789. package/esm/domain/resource/matchRequestResourceEntry.js +0 -46
  790. package/esm/domain/resource/matchRequestResourceEntry.js.map +0 -1
  791. package/esm/domain/resource/requestRegistry.d.ts +0 -9
  792. package/esm/domain/resource/requestRegistry.js +0 -37
  793. package/esm/domain/resource/requestRegistry.js.map +0 -1
  794. package/esm/domain/resource/resourceCollection.d.ts +0 -7
  795. package/esm/domain/resource/resourceCollection.js +0 -187
  796. package/esm/domain/resource/resourceCollection.js.map +0 -1
  797. package/esm/domain/resource/resourceUtils.d.ts +0 -55
  798. package/esm/domain/resource/resourceUtils.js +0 -244
  799. package/esm/domain/resource/resourceUtils.js.map +0 -1
  800. package/esm/domain/resource/retrieveInitialDocumentResourceTiming.d.ts +0 -4
  801. package/esm/domain/resource/retrieveInitialDocumentResourceTiming.js +0 -21
  802. package/esm/domain/resource/retrieveInitialDocumentResourceTiming.js.map +0 -1
  803. package/esm/domain/rumSessionManager.d.ts +0 -36
  804. package/esm/domain/rumSessionManager.js +0 -72
  805. package/esm/domain/rumSessionManager.js.map +0 -1
  806. package/esm/domain/sampler/sampler.d.ts +0 -10
  807. package/esm/domain/sampler/sampler.js +0 -58
  808. package/esm/domain/sampler/sampler.js.map +0 -1
  809. package/esm/domain/startCustomerDataTelemetry.d.ts +0 -4
  810. package/esm/domain/startCustomerDataTelemetry.js +0 -52
  811. package/esm/domain/startCustomerDataTelemetry.js.map +0 -1
  812. package/esm/domain/tracing/getDocumentTraceId.d.ts +0 -12
  813. package/esm/domain/tracing/getDocumentTraceId.js +0 -68
  814. package/esm/domain/tracing/getDocumentTraceId.js.map +0 -1
  815. package/esm/domain/tracing/identifier.d.ts +0 -13
  816. package/esm/domain/tracing/identifier.js +0 -50
  817. package/esm/domain/tracing/identifier.js.map +0 -1
  818. package/esm/domain/tracing/sampler.d.ts +0 -10
  819. package/esm/domain/tracing/sampler.js +0 -64
  820. package/esm/domain/tracing/sampler.js.map +0 -1
  821. package/esm/domain/tracing/tracer.d.ts +0 -30
  822. package/esm/domain/tracing/tracer.js +0 -156
  823. package/esm/domain/tracing/tracer.js.map +0 -1
  824. package/esm/domain/tracing/tracer.types.d.ts +0 -12
  825. package/esm/domain/tracing/tracer.types.js +0 -2
  826. package/esm/domain/tracing/tracer.types.js.map +0 -1
  827. package/esm/domain/trackEventCounts.d.ts +0 -17
  828. package/esm/domain/trackEventCounts.js +0 -47
  829. package/esm/domain/trackEventCounts.js.map +0 -1
  830. package/esm/domain/view/bfCacheSupport.d.ts +0 -2
  831. package/esm/domain/view/bfCacheSupport.js +0 -10
  832. package/esm/domain/view/bfCacheSupport.js.map +0 -1
  833. package/esm/domain/view/trackViewEventCounts.d.ts +0 -5
  834. package/esm/domain/view/trackViewEventCounts.js +0 -13
  835. package/esm/domain/view/trackViewEventCounts.js.map +0 -1
  836. package/esm/domain/view/trackViews.d.ts +0 -65
  837. package/esm/domain/view/trackViews.js +0 -278
  838. package/esm/domain/view/trackViews.js.map +0 -1
  839. package/esm/domain/view/viewCollection.d.ts +0 -18
  840. package/esm/domain/view/viewCollection.js +0 -150
  841. package/esm/domain/view/viewCollection.js.map +0 -1
  842. package/esm/domain/view/viewMetrics/getClsAttributionImpactedArea.d.ts +0 -6
  843. package/esm/domain/view/viewMetrics/getClsAttributionImpactedArea.js +0 -28
  844. package/esm/domain/view/viewMetrics/getClsAttributionImpactedArea.js.map +0 -1
  845. package/esm/domain/view/viewMetrics/interactionCountPolyfill.d.ts +0 -18
  846. package/esm/domain/view/viewMetrics/interactionCountPolyfill.js +0 -39
  847. package/esm/domain/view/viewMetrics/interactionCountPolyfill.js.map +0 -1
  848. package/esm/domain/view/viewMetrics/startInitialViewMetricsTelemetry.d.ts +0 -6
  849. package/esm/domain/view/viewMetrics/startInitialViewMetricsTelemetry.js +0 -41
  850. package/esm/domain/view/viewMetrics/startInitialViewMetricsTelemetry.js.map +0 -1
  851. package/esm/domain/view/viewMetrics/trackBfcacheMetrics.d.ts +0 -8
  852. package/esm/domain/view/viewMetrics/trackBfcacheMetrics.js +0 -14
  853. package/esm/domain/view/viewMetrics/trackBfcacheMetrics.js.map +0 -1
  854. package/esm/domain/view/viewMetrics/trackCommonViewMetrics.d.ts +0 -21
  855. package/esm/domain/view/viewMetrics/trackCommonViewMetrics.js +0 -34
  856. package/esm/domain/view/viewMetrics/trackCommonViewMetrics.js.map +0 -1
  857. package/esm/domain/view/viewMetrics/trackCumulativeLayoutShift.d.ts +0 -37
  858. package/esm/domain/view/viewMetrics/trackCumulativeLayoutShift.js +0 -130
  859. package/esm/domain/view/viewMetrics/trackCumulativeLayoutShift.js.map +0 -1
  860. package/esm/domain/view/viewMetrics/trackFirstContentfulPaint.d.ts +0 -13
  861. package/esm/domain/view/viewMetrics/trackFirstContentfulPaint.js +0 -34
  862. package/esm/domain/view/viewMetrics/trackFirstContentfulPaint.js.map +0 -1
  863. package/esm/domain/view/viewMetrics/trackFirstHidden.d.ts +0 -10
  864. package/esm/domain/view/viewMetrics/trackFirstHidden.js +0 -30
  865. package/esm/domain/view/viewMetrics/trackFirstHidden.js.map +0 -1
  866. package/esm/domain/view/viewMetrics/trackFirstInput.d.ts +0 -19
  867. package/esm/domain/view/viewMetrics/trackFirstInput.js +0 -40
  868. package/esm/domain/view/viewMetrics/trackFirstInput.js.map +0 -1
  869. package/esm/domain/view/viewMetrics/trackInitialViewMetrics.d.ts +0 -15
  870. package/esm/domain/view/viewMetrics/trackInitialViewMetrics.js +0 -38
  871. package/esm/domain/view/viewMetrics/trackInitialViewMetrics.js.map +0 -1
  872. package/esm/domain/view/viewMetrics/trackInteractionToNextPaint.d.ts +0 -25
  873. package/esm/domain/view/viewMetrics/trackInteractionToNextPaint.js +0 -149
  874. package/esm/domain/view/viewMetrics/trackInteractionToNextPaint.js.map +0 -1
  875. package/esm/domain/view/viewMetrics/trackLargestContentfulPaint.d.ts +0 -18
  876. package/esm/domain/view/viewMetrics/trackLargestContentfulPaint.js +0 -57
  877. package/esm/domain/view/viewMetrics/trackLargestContentfulPaint.js.map +0 -1
  878. package/esm/domain/view/viewMetrics/trackLoadingTime.d.ts +0 -14
  879. package/esm/domain/view/viewMetrics/trackLoadingTime.js +0 -47
  880. package/esm/domain/view/viewMetrics/trackLoadingTime.js.map +0 -1
  881. package/esm/domain/view/viewMetrics/trackNavigationTimings.d.ts +0 -14
  882. package/esm/domain/view/viewMetrics/trackNavigationTimings.js +0 -40
  883. package/esm/domain/view/viewMetrics/trackNavigationTimings.js.map +0 -1
  884. package/esm/domain/view/viewMetrics/trackScrollMetrics.d.ts +0 -25
  885. package/esm/domain/view/viewMetrics/trackScrollMetrics.js +0 -72
  886. package/esm/domain/view/viewMetrics/trackScrollMetrics.js.map +0 -1
  887. package/esm/domain/vital/vitalCollection.d.ts +0 -55
  888. package/esm/domain/vital/vitalCollection.js +0 -107
  889. package/esm/domain/vital/vitalCollection.js.map +0 -1
  890. package/esm/domain/waitPageActivityEnd.d.ts +0 -54
  891. package/esm/domain/waitPageActivityEnd.js +0 -123
  892. package/esm/domain/waitPageActivityEnd.js.map +0 -1
  893. package/esm/domainContext.types.d.ts +0 -39
  894. package/esm/domainContext.types.js +0 -5
  895. package/esm/domainContext.types.js.map +0 -1
  896. package/esm/index.d.ts +0 -42
  897. package/esm/index.js +0 -22
  898. package/esm/index.js.map +0 -1
  899. package/esm/rawRumEvent.types.d.ts +0 -326
  900. package/esm/rawRumEvent.types.js +0 -31
  901. package/esm/rawRumEvent.types.js.map +0 -1
  902. package/esm/rumEvent.types.d.ts +0 -2038
  903. package/esm/rumEvent.types.js +0 -6
  904. package/esm/rumEvent.types.js.map +0 -1
  905. package/esm/transport/formDataTransport.d.ts +0 -16
  906. package/esm/transport/formDataTransport.js +0 -43
  907. package/esm/transport/formDataTransport.js.map +0 -1
  908. package/esm/transport/startRumBatch.d.ts +0 -5
  909. package/esm/transport/startRumBatch.js +0 -30
  910. package/esm/transport/startRumBatch.js.map +0 -1
  911. package/esm/transport/startRumEventBridge.d.ts +0 -2
  912. package/esm/transport/startRumEventBridge.js +0 -8
  913. package/esm/transport/startRumEventBridge.js.map +0 -1
  914. package/src/browser/firstInputPolyfill.ts +0 -87
  915. package/src/domain/error/trackConsoleError.ts +0 -14
  916. package/src/domain/resource/matchRequestResourceEntry.ts +0 -68
  917. package/src/domain/resource/retrieveInitialDocumentResourceTiming.ts +0 -27
  918. package/src/domain/rumSessionManager.ts +0 -134
  919. package/src/domain/sampler/sampler.ts +0 -63
  920. package/src/domain/tracing/sampler.ts +0 -69
  921. package/src/domain/view/viewMetrics/startInitialViewMetricsTelemetry.ts +0 -70
  922. package/src/domain/view/viewMetrics/trackFirstInput.ts +0 -59
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trackInteractionToNextPaint.mjs","names":[],"sources":["../../../../src/domain/view/viewMetrics/trackInteractionToNextPaint.ts"],"sourcesContent":["import type { RelativeTime, Duration } from '@kubesense/kubesense-js-core/time'\nimport { ONE_MINUTE, elapsed } from '@kubesense/kubesense-js-core/time'\nimport { noop } from '@kubesense/kubesense-browser-core'\nimport type { RumFirstInputTiming, RumPerformanceEventTiming } from '../../../browser/performanceObservable'\nimport {\n createPerformanceObservable,\n RumPerformanceEntryType,\n supportPerformanceTimingEvent,\n} from '../../../browser/performanceObservable'\nimport { ViewLoadingType } from '../../../rawRumEvent.types'\nimport { getSelectorFromElement } from '../../getSelectorFromElement'\nimport { isElementNode } from '../../../browser/htmlDomUtils'\nimport { getInteractionSelector } from '../../action/interactionSelectorCache'\nimport type { RumConfiguration } from '../../configuration'\nimport { getInteractionCount, initInteractionCountPolyfill } from './interactionCountPolyfill'\n\n// Arbitrary value to prevent unnecessary memory usage on views with lots of interactions.\nconst MAX_INTERACTION_ENTRIES = 10\n// Arbitrary value to cap INP outliers\nexport const MAX_INP_VALUE = (1 * ONE_MINUTE) as Duration\n\n// Event Timing API rounds duration values to the nearest 8 ms\nconst RENDER_TIME_GROUPING_THRESHOLD = 8 as Duration\n\nexport interface InteractionToNextPaint {\n value: Duration\n targetSelector?: string\n time?: Duration\n subParts?: {\n inputDelay: Duration\n processingDuration: Duration\n presentationDelay: Duration\n }\n}\ninterface EntriesGroup {\n startTime: RelativeTime\n processingStart: RelativeTime\n processingEnd: RelativeTime\n // Reference time used for grouping, set once at group creation — anchors the 8ms merge window\n referenceRenderTime: RelativeTime\n}\n\n/**\n * Track the interaction to next paint (INP).\n * To avoid outliers, return the p98 worst interaction of the view.\n * Documentation: https://web.dev/inp/\n * Reference implementation: https://github.com/GoogleChrome/web-vitals/blob/main/src/onINP.ts\n */\nexport function trackInteractionToNextPaint(\n configuration: RumConfiguration,\n viewStart: RelativeTime,\n viewLoadingType: ViewLoadingType\n) {\n if (!isInteractionToNextPaintSupported()) {\n return {\n getInteractionToNextPaint: () => undefined,\n setViewEnd: noop,\n stop: noop,\n }\n }\n\n let viewEnd = Infinity as RelativeTime\n let currentInp:\n | {\n duration: Duration\n startTime: Duration\n targetSelector?: string\n subParts?: InteractionToNextPaint['subParts']\n }\n | undefined\n\n const { getViewInteractionCount, stopViewInteractionCount } = trackViewInteractionCount(viewLoadingType)\n const longestInteractions = trackLongestInteractions(getViewInteractionCount)\n const subPartsTracker = createSubPartsTracker(longestInteractions)\n const firstInputSubscription = createPerformanceObservable({\n type: RumPerformanceEntryType.FIRST_INPUT,\n buffered: true,\n }).subscribe(handleEntries)\n const eventSubscription = createPerformanceObservable({\n type: RumPerformanceEntryType.EVENT,\n // durationThreshold only impact PerformanceEventTiming entries used for INP computation which requires a threshold at 40 (default is 104ms)\n // cf: https://github.com/GoogleChrome/web-vitals/blob/3806160ffbc93c3c4abf210a167b81228172b31c/src/onINP.ts#L202-L210\n durationThreshold: 40,\n buffered: true,\n }).subscribe(handleEntries)\n\n function handleEntries(entries: Array<RumPerformanceEventTiming | RumFirstInputTiming>) {\n for (const entry of entries) {\n if (\n entry.interactionId &&\n // Check the entry start time is inside the view bounds because some view interactions can be reported after the view end (if long duration).\n entry.startTime >= viewStart &&\n entry.startTime <= viewEnd\n ) {\n longestInteractions.process(entry)\n subPartsTracker.process(entry)\n }\n }\n subPartsTracker.pruneUntracked()\n const candidate = longestInteractions.estimateP98Interaction()\n if (candidate) {\n updateCurrentInp(candidate)\n }\n }\n\n function updateCurrentInp(candidate: RumPerformanceEventTiming | RumFirstInputTiming) {\n const newStartTime = elapsed(viewStart, candidate.startTime)\n // startTime catches identity changes when the p98 switches to a different interaction with the same duration,\n // ensuring targetSelector and subParts always describe the same interaction.\n if (candidate.duration !== currentInp?.duration || newStartTime !== currentInp.startTime) {\n let targetSelector = getInteractionSelector(candidate.startTime)\n if (!targetSelector && candidate.target && isElementNode(candidate.target)) {\n targetSelector = getSelectorFromElement(candidate.target, configuration.actionNameAttribute)\n }\n currentInp = {\n duration: candidate.duration,\n startTime: newStartTime,\n targetSelector,\n }\n }\n // Recomputed on every batch: the group for the p98 interaction may have been updated\n // with new min/max timing even when the p98 identity (duration, startTime) is unchanged.\n currentInp.subParts = subPartsTracker.computeSubParts(candidate, sanitizeInpValue(currentInp.duration))\n }\n\n return {\n getInteractionToNextPaint: (): InteractionToNextPaint | undefined => {\n // If no INP duration where captured because of the performanceObserver 40ms threshold\n // but the view interaction count > 0 then report 0\n if (currentInp) {\n return {\n value: sanitizeInpValue(currentInp.duration),\n targetSelector: currentInp.targetSelector,\n time: currentInp.startTime,\n subParts: currentInp.subParts,\n }\n } else if (getViewInteractionCount()) {\n return {\n value: 0 as Duration,\n }\n }\n },\n setViewEnd: (viewEndTime: RelativeTime) => {\n viewEnd = viewEndTime\n stopViewInteractionCount()\n },\n stop: () => {\n eventSubscription.unsubscribe()\n firstInputSubscription.unsubscribe()\n subPartsTracker.stop()\n },\n }\n}\n\n/**\n * Maintains a bounded list of the slowest interactions seen so far, used to estimate the p98\n * interaction duration without keeping every entry in memory.\n */\nfunction trackLongestInteractions(getViewInteractionCount: () => number) {\n const longestInteractions: Array<RumPerformanceEventTiming | RumFirstInputTiming> = []\n\n function sortAndTrimLongestInteractions() {\n longestInteractions.sort((a, b) => b.duration - a.duration).splice(MAX_INTERACTION_ENTRIES)\n }\n\n return {\n /**\n * Process the performance entry:\n * - if its duration is long enough, add the performance entry to the list of worst interactions\n * - if an entry with the same interaction id exists and its duration is lower than the new one, then replace it in the list of worst interactions\n */\n process(entry: RumPerformanceEventTiming | RumFirstInputTiming) {\n const interactionIndex = longestInteractions.findIndex(\n (interaction) => entry.interactionId === interaction.interactionId\n )\n\n const minLongestInteraction = longestInteractions[longestInteractions.length - 1]\n\n if (interactionIndex !== -1) {\n if (entry.duration > longestInteractions[interactionIndex].duration) {\n longestInteractions[interactionIndex] = entry\n sortAndTrimLongestInteractions()\n }\n } else if (\n longestInteractions.length < MAX_INTERACTION_ENTRIES ||\n entry.duration > minLongestInteraction.duration\n ) {\n longestInteractions.push(entry)\n sortAndTrimLongestInteractions()\n }\n },\n /**\n * Compute the p98 longest interaction.\n * For better performance the computation is based on 10 longest interactions and the interaction count of the current view.\n */\n estimateP98Interaction(): RumPerformanceEventTiming | RumFirstInputTiming | undefined {\n const interactionIndex = Math.min(longestInteractions.length - 1, Math.floor(getViewInteractionCount() / 50))\n return longestInteractions[interactionIndex]\n },\n\n isTracked(interactionId: number): boolean {\n return longestInteractions.some((i) => i.interactionId === interactionId)\n },\n }\n}\n\n/**\n * Tracks the number of interactions that occurred during the current view. Freezes the count\n * when the view ends so that the p98 estimate remains stable after `setViewEnd` is called.\n */\nexport function trackViewInteractionCount(viewLoadingType: ViewLoadingType) {\n initInteractionCountPolyfill()\n const previousInteractionCount = viewLoadingType === ViewLoadingType.INITIAL_LOAD ? 0 : getInteractionCount()\n let state: { stopped: false } | { stopped: true; interactionCount: number } = { stopped: false }\n\n function computeViewInteractionCount() {\n return getInteractionCount() - previousInteractionCount\n }\n\n return {\n getViewInteractionCount: () => {\n if (state.stopped) {\n return state.interactionCount\n }\n\n return computeViewInteractionCount()\n },\n stopViewInteractionCount: () => {\n state = { stopped: true, interactionCount: computeViewInteractionCount() }\n },\n }\n}\n\n/**\n * Groups performance entries by interaction and render time to compute INP subparts\n * (input delay, processing duration, presentation delay). Entries sharing the same\n * interactionId, or whose render time falls within the 8 ms Event Timing rounding window,\n * are merged into a single group so that subparts always sum to the reported INP duration.\n */\nfunction createSubPartsTracker(longestInteractions: ReturnType<typeof trackLongestInteractions>) {\n const groupsByInteractionId = new Map<number, EntriesGroup>()\n\n function updateGroupWithEntry(group: EntriesGroup, entry: RumPerformanceEventTiming | RumFirstInputTiming) {\n group.startTime = Math.min(entry.startTime, group.startTime) as RelativeTime\n // For each group, we keep the biggest interval possible between processingStart and processingEnd\n group.processingStart = Math.min(entry.processingStart, group.processingStart) as RelativeTime\n group.processingEnd = Math.max(entry.processingEnd, group.processingEnd) as RelativeTime\n }\n\n return {\n process(entry: RumPerformanceEventTiming | RumFirstInputTiming): void {\n if (entry.interactionId === undefined || !entry.processingStart || !entry.processingEnd) {\n return\n }\n\n const renderTime = (entry.startTime + entry.duration) as RelativeTime\n const existingGroup = groupsByInteractionId.get(entry.interactionId)\n\n if (existingGroup) {\n // Update existing group with MIN/MAX values (keep original referenceRenderTime)\n updateGroupWithEntry(existingGroup, entry)\n return\n }\n\n // Try to find a group within 8ms window to merge with (different interactionId, same frame)\n for (const [, group] of groupsByInteractionId.entries()) {\n if (Math.abs(renderTime - group.referenceRenderTime) <= RENDER_TIME_GROUPING_THRESHOLD) {\n updateGroupWithEntry(group, entry)\n // Also store under this entry's interactionId for easy lookup\n groupsByInteractionId.set(entry.interactionId, group)\n return\n }\n }\n\n // Create new group\n groupsByInteractionId.set(entry.interactionId, {\n startTime: entry.startTime,\n processingStart: entry.processingStart,\n processingEnd: entry.processingEnd,\n referenceRenderTime: renderTime,\n })\n },\n\n // Prune after all entries are grouped: groups not in longestInteractions can never affect p98 subparts.\n // Keeps groupsByInteractionId capped at MAX_INTERACTION_ENTRIES\n pruneUntracked(): void {\n for (const [interactionId] of groupsByInteractionId) {\n if (!longestInteractions.isTracked(interactionId)) {\n groupsByInteractionId.delete(interactionId)\n }\n }\n },\n\n computeSubParts(\n entry: RumPerformanceEventTiming | RumFirstInputTiming,\n inpDuration: Duration\n ): InteractionToNextPaint['subParts'] | undefined {\n if (!entry.processingStart || !entry.processingEnd || entry.interactionId === undefined) {\n return undefined\n }\n\n const group = groupsByInteractionId.get(entry.interactionId)\n // Shouldn't happen since entries are grouped before p98 calculation.\n if (!group) {\n return undefined\n }\n\n // Use group.startTime consistently to ensure subparts sum to inpDuration\n // Math.max prevents nextPaintTime from being before processingStart (Chrome implementation)\n const nextPaintTime = Math.max(group.startTime + inpDuration, group.processingStart) as RelativeTime\n\n // Clamp processingEnd to not exceed nextPaintTime\n const processingEnd = Math.min(group.processingEnd, nextPaintTime) as RelativeTime\n\n return {\n inputDelay: elapsed(group.startTime, group.processingStart),\n processingDuration: elapsed(group.processingStart, processingEnd),\n presentationDelay: elapsed(processingEnd, nextPaintTime),\n }\n },\n\n stop(): void {\n groupsByInteractionId.clear()\n },\n }\n}\n\nexport function isInteractionToNextPaintSupported() {\n return (\n supportPerformanceTimingEvent(RumPerformanceEntryType.EVENT) &&\n window.PerformanceEventTiming &&\n 'interactionId' in PerformanceEventTiming.prototype\n )\n}\n\nfunction sanitizeInpValue(inpValue: Duration) {\n return Math.min(inpValue, MAX_INP_VALUE) as Duration\n}\n"],"mappings":";;;;;;;;;AAiBA,MAAM,0BAA0B;AAEhC,MAAa,gBAAiB,IAAI;AAGlC,MAAM,iCAAiC;;;;;;;AA0BvC,SAAgB,4BACd,eACA,WACA,iBACA;CACA,IAAI,CAAC,kCAAkC,GACrC,OAAO;EACL,iCAAiC,KAAA;EACjC,YAAY;EACZ,MAAM;CACR;CAGF,IAAI,UAAU;CACd,IAAI;CASJ,MAAM,EAAE,yBAAyB,6BAA6B,0BAA0B,eAAe;CACvG,MAAM,sBAAsB,yBAAyB,uBAAuB;CAC5E,MAAM,kBAAkB,sBAAsB,mBAAmB;CACjE,MAAM,yBAAyB,4BAA4B;EACzD,MAAA;EACA,UAAU;CACZ,CAAC,CAAC,CAAC,UAAU,aAAa;CAC1B,MAAM,oBAAoB,4BAA4B;EACpD,MAAA;EAGA,mBAAmB;EACnB,UAAU;CACZ,CAAC,CAAC,CAAC,UAAU,aAAa;CAE1B,SAAS,cAAc,SAAiE;EACtF,KAAK,MAAM,SAAS,SAClB,IACE,MAAM,iBAEN,MAAM,aAAa,aACnB,MAAM,aAAa,SACnB;GACA,oBAAoB,QAAQ,KAAK;GACjC,gBAAgB,QAAQ,KAAK;EAC/B;EAEF,gBAAgB,eAAe;EAC/B,MAAM,YAAY,oBAAoB,uBAAuB;EAC7D,IAAI,WACF,iBAAiB,SAAS;CAE9B;CAEA,SAAS,iBAAiB,WAA4D;EACpF,MAAM,eAAe,QAAQ,WAAW,UAAU,SAAS;EAG3D,IAAI,UAAU,aAAa,YAAY,YAAY,iBAAiB,WAAW,WAAW;GACxF,IAAI,iBAAiB,uBAAuB,UAAU,SAAS;GAC/D,IAAI,CAAC,kBAAkB,UAAU,UAAU,cAAc,UAAU,MAAM,GACvE,iBAAiB,uBAAuB,UAAU,QAAQ,cAAc,mBAAmB;GAE7F,aAAa;IACX,UAAU,UAAU;IACpB,WAAW;IACX;GACF;EACF;EAGA,WAAW,WAAW,gBAAgB,gBAAgB,WAAW,iBAAiB,WAAW,QAAQ,CAAC;CACxG;CAEA,OAAO;EACL,iCAAqE;GAGnE,IAAI,YACF,OAAO;IACL,OAAO,iBAAiB,WAAW,QAAQ;IAC3C,gBAAgB,WAAW;IAC3B,MAAM,WAAW;IACjB,UAAU,WAAW;GACvB;QACK,IAAI,wBAAwB,GACjC,OAAO,EACL,OAAO,EACT;EAEJ;EACA,aAAa,gBAA8B;GACzC,UAAU;GACV,yBAAyB;EAC3B;EACA,YAAY;GACV,kBAAkB,YAAY;GAC9B,uBAAuB,YAAY;GACnC,gBAAgB,KAAK;EACvB;CACF;AACF;;;;;AAMA,SAAS,yBAAyB,yBAAuC;CACvE,MAAM,sBAA8E,CAAC;CAErF,SAAS,iCAAiC;EACxC,oBAAoB,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,OAAO,uBAAuB;CAC5F;CAEA,OAAO;;;;;;EAML,QAAQ,OAAwD;GAC9D,MAAM,mBAAmB,oBAAoB,WAC1C,gBAAgB,MAAM,kBAAkB,YAAY,aACvD;GAEA,MAAM,wBAAwB,oBAAoB,oBAAoB,SAAS;GAE/E,IAAI,qBAAqB,IACnB;QAAA,MAAM,WAAW,oBAAoB,iBAAiB,CAAC,UAAU;KACnE,oBAAoB,oBAAoB;KACxC,+BAA+B;IACjC;UACK,IACL,oBAAoB,SAAS,2BAC7B,MAAM,WAAW,sBAAsB,UACvC;IACA,oBAAoB,KAAK,KAAK;IAC9B,+BAA+B;GACjC;EACF;;;;;EAKA,yBAAsF;GACpF,MAAM,mBAAmB,KAAK,IAAI,oBAAoB,SAAS,GAAG,KAAK,MAAM,wBAAwB,IAAI,EAAE,CAAC;GAC5G,OAAO,oBAAoB;EAC7B;EAEA,UAAU,eAAgC;GACxC,OAAO,oBAAoB,MAAM,MAAM,EAAE,kBAAkB,aAAa;EAC1E;CACF;AACF;;;;;AAMA,SAAgB,0BAA0B,iBAAkC;CAC1E,6BAA6B;CAC7B,MAAM,2BAA2B,oBAAoB,gBAAgB,eAAe,IAAI,oBAAoB;CAC5G,IAAI,QAA0E,EAAE,SAAS,MAAM;CAE/F,SAAS,8BAA8B;EACrC,OAAO,oBAAoB,IAAI;CACjC;CAEA,OAAO;EACL,+BAA+B;GAC7B,IAAI,MAAM,SACR,OAAO,MAAM;GAGf,OAAO,4BAA4B;EACrC;EACA,gCAAgC;GAC9B,QAAQ;IAAE,SAAS;IAAM,kBAAkB,4BAA4B;GAAE;EAC3E;CACF;AACF;;;;;;;AAQA,SAAS,sBAAsB,qBAAkE;CAC/F,MAAM,wCAAwB,IAAI,IAA0B;CAE5D,SAAS,qBAAqB,OAAqB,OAAwD;EACzG,MAAM,YAAY,KAAK,IAAI,MAAM,WAAW,MAAM,SAAS;EAE3D,MAAM,kBAAkB,KAAK,IAAI,MAAM,iBAAiB,MAAM,eAAe;EAC7E,MAAM,gBAAgB,KAAK,IAAI,MAAM,eAAe,MAAM,aAAa;CACzE;CAEA,OAAO;EACL,QAAQ,OAA8D;GACpE,IAAI,MAAM,kBAAkB,KAAA,KAAa,CAAC,MAAM,mBAAmB,CAAC,MAAM,eACxE;GAGF,MAAM,aAAc,MAAM,YAAY,MAAM;GAC5C,MAAM,gBAAgB,sBAAsB,IAAI,MAAM,aAAa;GAEnE,IAAI,eAAe;IAEjB,qBAAqB,eAAe,KAAK;IACzC;GACF;GAGA,KAAK,MAAM,GAAG,UAAU,sBAAsB,QAAQ,GACpD,IAAI,KAAK,IAAI,aAAa,MAAM,mBAAmB,KAAK,gCAAgC;IACtF,qBAAqB,OAAO,KAAK;IAEjC,sBAAsB,IAAI,MAAM,eAAe,KAAK;IACpD;GACF;GAIF,sBAAsB,IAAI,MAAM,eAAe;IAC7C,WAAW,MAAM;IACjB,iBAAiB,MAAM;IACvB,eAAe,MAAM;IACrB,qBAAqB;GACvB,CAAC;EACH;EAIA,iBAAuB;GACrB,KAAK,MAAM,CAAC,kBAAkB,uBAC5B,IAAI,CAAC,oBAAoB,UAAU,aAAa,GAC9C,sBAAsB,OAAO,aAAa;EAGhD;EAEA,gBACE,OACA,aACgD;GAChD,IAAI,CAAC,MAAM,mBAAmB,CAAC,MAAM,iBAAiB,MAAM,kBAAkB,KAAA,GAC5E;GAGF,MAAM,QAAQ,sBAAsB,IAAI,MAAM,aAAa;GAE3D,IAAI,CAAC,OACH;GAKF,MAAM,gBAAgB,KAAK,IAAI,MAAM,YAAY,aAAa,MAAM,eAAe;GAGnF,MAAM,gBAAgB,KAAK,IAAI,MAAM,eAAe,aAAa;GAEjE,OAAO;IACL,YAAY,QAAQ,MAAM,WAAW,MAAM,eAAe;IAC1D,oBAAoB,QAAQ,MAAM,iBAAiB,aAAa;IAChE,mBAAmB,QAAQ,eAAe,aAAa;GACzD;EACF;EAEA,OAAa;GACX,sBAAsB,MAAM;EAC9B;CACF;AACF;AAEA,SAAgB,oCAAoC;CAClD,OACE,8BAAA,OAA2D,KAC3D,OAAO,0BACP,mBAAmB,uBAAuB;AAE9C;AAEA,SAAS,iBAAiB,UAAoB;CAC5C,OAAO,KAAK,IAAI,UAAU,aAAa;AACzC"}
@@ -0,0 +1,70 @@
1
+ import { createPerformanceObservable } from "../../../browser/performanceObservable.mjs";
2
+ import { getSelectorFromElement } from "../../getSelectorFromElement.mjs";
3
+ import { findLcpResourceEntry, getNavigationEntry, sanitizeFirstByte } from "../../../browser/performanceUtils.mjs";
4
+ import { ONE_MINUTE } from "@kubesense/kubesense-js-core/time";
5
+ import { DOM_EVENT, addEventListeners, findLast } from "@kubesense/kubesense-browser-core";
6
+ //#region src/domain/view/viewMetrics/trackLargestContentfulPaint.ts
7
+ const LCP_MAXIMUM_DELAY = 10 * ONE_MINUTE;
8
+ /**
9
+ * Track the largest contentful paint (LCP) occurring during the initial View. This can yield
10
+ * multiple values, only the most recent one should be used.
11
+ * Documentation: https://web.dev/lcp/
12
+ * Reference implementation: https://github.com/GoogleChrome/web-vitals/blob/master/src/onLCP.ts
13
+ */
14
+ function trackLargestContentfulPaint(configuration, firstHidden, eventTarget, callback) {
15
+ let firstInteractionTimestamp = Infinity;
16
+ const { stop: stopEventListener } = addEventListeners(eventTarget, [DOM_EVENT.POINTER_DOWN, DOM_EVENT.KEY_DOWN], (event) => {
17
+ firstInteractionTimestamp = event.timeStamp;
18
+ }, {
19
+ capture: true,
20
+ once: true
21
+ });
22
+ let biggestLcpSize = 0;
23
+ const performanceLcpSubscription = createPerformanceObservable({
24
+ type: "largest-contentful-paint",
25
+ buffered: true
26
+ }).subscribe((entries) => {
27
+ const lcpEntry = findLast(entries, (entry) => entry.entryType === "largest-contentful-paint" && entry.startTime < firstInteractionTimestamp && entry.startTime < firstHidden.timeStamp && entry.startTime < LCP_MAXIMUM_DELAY && entry.size > biggestLcpSize);
28
+ if (lcpEntry) {
29
+ let lcpTargetSelector;
30
+ if (lcpEntry.element) lcpTargetSelector = getSelectorFromElement(lcpEntry.element, configuration.actionNameAttribute);
31
+ const resourceUrl = computeLcpEntryUrl(lcpEntry);
32
+ const lcpValue = lcpEntry.startTime;
33
+ const subParts = computeLcpSubParts(resourceUrl, lcpValue);
34
+ callback({
35
+ value: lcpValue,
36
+ targetSelector: lcpTargetSelector,
37
+ resourceUrl,
38
+ subParts
39
+ });
40
+ biggestLcpSize = lcpEntry.size;
41
+ }
42
+ });
43
+ return { stop: () => {
44
+ stopEventListener();
45
+ performanceLcpSubscription.unsubscribe();
46
+ } };
47
+ }
48
+ function computeLcpEntryUrl(entry) {
49
+ return entry.url === "" ? void 0 : entry.url;
50
+ }
51
+ /**
52
+ * Compute the LCP sub-parts breakdown (loadDelay, loadTime, renderDelay).
53
+ * Returns undefined if navigation timing data or TTFB is unavailable.
54
+ */
55
+ function computeLcpSubParts(resourceUrl, lcpValue) {
56
+ const firstByte = sanitizeFirstByte(getNavigationEntry());
57
+ if (firstByte === void 0) return;
58
+ const lcpResourceEntry = resourceUrl ? findLcpResourceEntry(resourceUrl, lcpValue) : void 0;
59
+ const lcpRequestStart = lcpResourceEntry ? Math.max(firstByte, lcpResourceEntry.requestStart || lcpResourceEntry.startTime) : firstByte;
60
+ const lcpResponseEnd = Math.min(lcpValue, Math.max(lcpRequestStart, lcpResourceEntry?.responseEnd || 0));
61
+ return {
62
+ loadDelay: lcpRequestStart - firstByte,
63
+ loadTime: lcpResponseEnd - lcpRequestStart,
64
+ renderDelay: lcpValue - lcpResponseEnd
65
+ };
66
+ }
67
+ //#endregion
68
+ export { LCP_MAXIMUM_DELAY, trackLargestContentfulPaint };
69
+
70
+ //# sourceMappingURL=trackLargestContentfulPaint.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trackLargestContentfulPaint.mjs","names":[],"sources":["../../../../src/domain/view/viewMetrics/trackLargestContentfulPaint.ts"],"sourcesContent":["import type { RelativeTime } from '@kubesense/kubesense-js-core/time'\nimport { ONE_MINUTE } from '@kubesense/kubesense-js-core/time'\nimport { DOM_EVENT, addEventListeners, findLast } from '@kubesense/kubesense-browser-core'\nimport type { RumConfiguration } from '../../configuration'\nimport { createPerformanceObservable, RumPerformanceEntryType } from '../../../browser/performanceObservable'\nimport { findLcpResourceEntry, getNavigationEntry, sanitizeFirstByte } from '../../../browser/performanceUtils'\nimport type { RumLargestContentfulPaintTiming } from '../../../browser/performanceObservable'\nimport { getSelectorFromElement } from '../../getSelectorFromElement'\nimport type { FirstHidden } from './trackFirstHidden'\n\n// Discard LCP timings above a certain delay to avoid incorrect data\n// It happens in some cases like sleep mode or some browser implementations\nexport const LCP_MAXIMUM_DELAY = 10 * ONE_MINUTE\n\nexport interface LargestContentfulPaint {\n value: RelativeTime\n targetSelector?: string\n resourceUrl?: string\n subParts?: {\n loadDelay: RelativeTime\n loadTime: RelativeTime\n renderDelay: RelativeTime\n }\n}\n\n/**\n * Track the largest contentful paint (LCP) occurring during the initial View. This can yield\n * multiple values, only the most recent one should be used.\n * Documentation: https://web.dev/lcp/\n * Reference implementation: https://github.com/GoogleChrome/web-vitals/blob/master/src/onLCP.ts\n */\nexport function trackLargestContentfulPaint(\n configuration: RumConfiguration,\n firstHidden: FirstHidden,\n eventTarget: Window,\n callback: (largestContentfulPaint: LargestContentfulPaint) => void\n) {\n // Ignore entries that come after the first user interaction. According to the documentation, the\n // browser should not send largest-contentful-paint entries after a user interact with the page,\n // but the web-vitals reference implementation uses this as a safeguard.\n let firstInteractionTimestamp = Infinity\n const { stop: stopEventListener } = addEventListeners(\n eventTarget,\n [DOM_EVENT.POINTER_DOWN, DOM_EVENT.KEY_DOWN],\n (event) => {\n firstInteractionTimestamp = event.timeStamp\n },\n { capture: true, once: true }\n )\n\n let biggestLcpSize = 0\n const performanceLcpSubscription = createPerformanceObservable({\n type: RumPerformanceEntryType.LARGEST_CONTENTFUL_PAINT,\n buffered: true,\n }).subscribe((entries) => {\n const lcpEntry = findLast(\n entries,\n (entry): entry is RumLargestContentfulPaintTiming =>\n entry.entryType === RumPerformanceEntryType.LARGEST_CONTENTFUL_PAINT &&\n entry.startTime < firstInteractionTimestamp &&\n entry.startTime < firstHidden.timeStamp &&\n entry.startTime < LCP_MAXIMUM_DELAY &&\n // Ensure to get the LCP entry with the biggest size, see\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1516655\n entry.size > biggestLcpSize\n )\n if (lcpEntry) {\n let lcpTargetSelector\n if (lcpEntry.element) {\n lcpTargetSelector = getSelectorFromElement(lcpEntry.element, configuration.actionNameAttribute)\n }\n\n const resourceUrl = computeLcpEntryUrl(lcpEntry)\n const lcpValue = lcpEntry.startTime\n\n const subParts = computeLcpSubParts(resourceUrl, lcpValue)\n\n callback({\n value: lcpValue,\n targetSelector: lcpTargetSelector,\n resourceUrl,\n subParts,\n })\n biggestLcpSize = lcpEntry.size\n }\n })\n\n return {\n stop: () => {\n stopEventListener()\n performanceLcpSubscription.unsubscribe()\n },\n }\n}\n\n// The property url report an empty string if the value is not available, we shouldn't report it in this case.\nfunction computeLcpEntryUrl(entry: RumLargestContentfulPaintTiming) {\n return entry.url === '' ? undefined : entry.url\n}\n\n/**\n * Compute the LCP sub-parts breakdown (loadDelay, loadTime, renderDelay).\n * Returns undefined if navigation timing data or TTFB is unavailable.\n */\nfunction computeLcpSubParts(\n resourceUrl: string | undefined,\n lcpValue: RelativeTime\n): LargestContentfulPaint['subParts'] {\n const firstByte = sanitizeFirstByte(getNavigationEntry())\n\n if (firstByte === undefined) {\n return undefined\n }\n\n const lcpResourceEntry = resourceUrl ? findLcpResourceEntry(resourceUrl, lcpValue) : undefined\n const lcpRequestStart = lcpResourceEntry\n ? (Math.max(firstByte, lcpResourceEntry.requestStart || lcpResourceEntry.startTime) as RelativeTime)\n : firstByte\n\n // Cap at LCP time to handle resources that continue downloading after LCP (e.g., videos)\n const lcpResponseEnd = Math.min(lcpValue, Math.max(lcpRequestStart, lcpResourceEntry?.responseEnd || 0))\n\n return {\n loadDelay: (lcpRequestStart - firstByte) as RelativeTime,\n loadTime: (lcpResponseEnd - lcpRequestStart) as RelativeTime,\n renderDelay: (lcpValue - lcpResponseEnd) as RelativeTime,\n }\n}\n"],"mappings":";;;;;;AAYA,MAAa,oBAAoB,KAAK;;;;;;;AAmBtC,SAAgB,4BACd,eACA,aACA,aACA,UACA;CAIA,IAAI,4BAA4B;CAChC,MAAM,EAAE,MAAM,sBAAsB,kBAClC,aACA,CAAC,UAAU,cAAc,UAAU,QAAQ,IAC1C,UAAU;EACT,4BAA4B,MAAM;CACpC,GACA;EAAE,SAAS;EAAM,MAAM;CAAK,CAC9B;CAEA,IAAI,iBAAiB;CACrB,MAAM,6BAA6B,4BAA4B;EAC7D,MAAA;EACA,UAAU;CACZ,CAAC,CAAC,CAAC,WAAW,YAAY;EACxB,MAAM,WAAW,SACf,UACC,UACC,MAAM,cAAA,8BACN,MAAM,YAAY,6BAClB,MAAM,YAAY,YAAY,aAC9B,MAAM,YAAY,qBAGlB,MAAM,OAAO,cACjB;EACA,IAAI,UAAU;GACZ,IAAI;GACJ,IAAI,SAAS,SACX,oBAAoB,uBAAuB,SAAS,SAAS,cAAc,mBAAmB;GAGhG,MAAM,cAAc,mBAAmB,QAAQ;GAC/C,MAAM,WAAW,SAAS;GAE1B,MAAM,WAAW,mBAAmB,aAAa,QAAQ;GAEzD,SAAS;IACP,OAAO;IACP,gBAAgB;IAChB;IACA;GACF,CAAC;GACD,iBAAiB,SAAS;EAC5B;CACF,CAAC;CAED,OAAO,EACL,YAAY;EACV,kBAAkB;EAClB,2BAA2B,YAAY;CACzC,EACF;AACF;AAGA,SAAS,mBAAmB,OAAwC;CAClE,OAAO,MAAM,QAAQ,KAAK,KAAA,IAAY,MAAM;AAC9C;;;;;AAMA,SAAS,mBACP,aACA,UACoC;CACpC,MAAM,YAAY,kBAAkB,mBAAmB,CAAC;CAExD,IAAI,cAAc,KAAA,GAChB;CAGF,MAAM,mBAAmB,cAAc,qBAAqB,aAAa,QAAQ,IAAI,KAAA;CACrF,MAAM,kBAAkB,mBACnB,KAAK,IAAI,WAAW,iBAAiB,gBAAgB,iBAAiB,SAAS,IAChF;CAGJ,MAAM,iBAAiB,KAAK,IAAI,UAAU,KAAK,IAAI,iBAAiB,kBAAkB,eAAe,CAAC,CAAC;CAEvG,OAAO;EACL,WAAY,kBAAkB;EAC9B,UAAW,iBAAiB;EAC5B,aAAc,WAAW;CAC3B;AACF"}
@@ -0,0 +1,46 @@
1
+ import { ViewLoadingType } from "../../../rawRumEvent.types.mjs";
2
+ import { waitPageActivityEnd } from "../../waitPageActivityEnd.mjs";
3
+ import { trackFirstHidden } from "./trackFirstHidden.mjs";
4
+ import { elapsed } from "@kubesense/kubesense-js-core/time";
5
+ //#region src/domain/view/viewMetrics/trackLoadingTime.ts
6
+ /**
7
+ * For non-initial views (such as route changes or BFCache restores), the regular load event does not fire
8
+ * In these cases, trackLoadingTime can only emit a loadingTime if waitPageActivityEnd detects some post-restore activity.
9
+ * If nothing happens after the view starts,no candidate is recorded and loadingTime stays undefined.
10
+ */
11
+ function trackLoadingTime(lifeCycle, domMutationObservable, windowOpenObservable, configuration, loadType, viewStart, callback) {
12
+ let isWaitingForLoadEvent = loadType === ViewLoadingType.INITIAL_LOAD;
13
+ let isWaitingForActivityLoadingTime = true;
14
+ const loadingTimeCandidates = [];
15
+ const firstHidden = trackFirstHidden(viewStart);
16
+ function invokeCallbackIfAllCandidatesAreReceived() {
17
+ if (!isWaitingForActivityLoadingTime && !isWaitingForLoadEvent && loadingTimeCandidates.length > 0) {
18
+ const loadingTime = Math.max(...loadingTimeCandidates);
19
+ if (loadingTime < firstHidden.timeStamp - viewStart.relative) callback(loadingTime);
20
+ }
21
+ }
22
+ const { stop } = waitPageActivityEnd(lifeCycle, domMutationObservable, windowOpenObservable, configuration, (event) => {
23
+ if (isWaitingForActivityLoadingTime) {
24
+ isWaitingForActivityLoadingTime = false;
25
+ if (event.hadActivity) loadingTimeCandidates.push(elapsed(viewStart.timeStamp, event.end));
26
+ invokeCallbackIfAllCandidatesAreReceived();
27
+ }
28
+ });
29
+ return {
30
+ stop: () => {
31
+ stop();
32
+ firstHidden.stop();
33
+ },
34
+ setLoadEvent: (loadEvent) => {
35
+ if (isWaitingForLoadEvent) {
36
+ isWaitingForLoadEvent = false;
37
+ loadingTimeCandidates.push(loadEvent);
38
+ invokeCallbackIfAllCandidatesAreReceived();
39
+ }
40
+ }
41
+ };
42
+ }
43
+ //#endregion
44
+ export { trackLoadingTime };
45
+
46
+ //# sourceMappingURL=trackLoadingTime.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trackLoadingTime.mjs","names":[],"sources":["../../../../src/domain/view/viewMetrics/trackLoadingTime.ts"],"sourcesContent":["import type { ClocksState, Duration } from '@kubesense/kubesense-js-core/time'\nimport type { Observable } from '@kubesense/kubesense-browser-core'\nimport { elapsed } from '@kubesense/kubesense-js-core/time'\nimport { waitPageActivityEnd } from '../../waitPageActivityEnd'\nimport type { RumConfiguration } from '../../configuration'\nimport type { LifeCycle } from '../../lifeCycle'\nimport { ViewLoadingType } from '../../../rawRumEvent.types'\nimport type { RumMutationRecord } from '../../../browser/domMutationObservable'\nimport { trackFirstHidden } from './trackFirstHidden'\n\n/**\n * For non-initial views (such as route changes or BFCache restores), the regular load event does not fire\n * In these cases, trackLoadingTime can only emit a loadingTime if waitPageActivityEnd detects some post-restore activity.\n * If nothing happens after the view starts,no candidate is recorded and loadingTime stays undefined.\n */\n\nexport function trackLoadingTime(\n lifeCycle: LifeCycle,\n domMutationObservable: Observable<RumMutationRecord[]>,\n windowOpenObservable: Observable<void>,\n configuration: RumConfiguration,\n loadType: ViewLoadingType,\n viewStart: ClocksState,\n callback: (loadingTime: Duration) => void\n) {\n let isWaitingForLoadEvent = loadType === ViewLoadingType.INITIAL_LOAD\n let isWaitingForActivityLoadingTime = true\n const loadingTimeCandidates: Duration[] = []\n const firstHidden = trackFirstHidden(viewStart)\n\n function invokeCallbackIfAllCandidatesAreReceived() {\n if (!isWaitingForActivityLoadingTime && !isWaitingForLoadEvent && loadingTimeCandidates.length > 0) {\n const loadingTime = Math.max(...loadingTimeCandidates)\n // firstHidden is a relative time from time origin, so we use the relative start time of the view to compare with the loading time\n if (loadingTime < firstHidden.timeStamp - viewStart.relative) {\n callback(loadingTime as Duration)\n }\n }\n }\n\n const { stop } = waitPageActivityEnd(\n lifeCycle,\n domMutationObservable,\n windowOpenObservable,\n configuration,\n (event) => {\n if (isWaitingForActivityLoadingTime) {\n isWaitingForActivityLoadingTime = false\n if (event.hadActivity) {\n loadingTimeCandidates.push(elapsed(viewStart.timeStamp, event.end))\n }\n invokeCallbackIfAllCandidatesAreReceived()\n }\n }\n )\n\n return {\n stop: () => {\n stop()\n firstHidden.stop()\n },\n setLoadEvent: (loadEvent: Duration) => {\n if (isWaitingForLoadEvent) {\n isWaitingForLoadEvent = false\n loadingTimeCandidates.push(loadEvent)\n invokeCallbackIfAllCandidatesAreReceived()\n }\n },\n }\n}\n"],"mappings":";;;;;;;;;;AAgBA,SAAgB,iBACd,WACA,uBACA,sBACA,eACA,UACA,WACA,UACA;CACA,IAAI,wBAAwB,aAAa,gBAAgB;CACzD,IAAI,kCAAkC;CACtC,MAAM,wBAAoC,CAAC;CAC3C,MAAM,cAAc,iBAAiB,SAAS;CAE9C,SAAS,2CAA2C;EAClD,IAAI,CAAC,mCAAmC,CAAC,yBAAyB,sBAAsB,SAAS,GAAG;GAClG,MAAM,cAAc,KAAK,IAAI,GAAG,qBAAqB;GAErD,IAAI,cAAc,YAAY,YAAY,UAAU,UAClD,SAAS,WAAuB;EAEpC;CACF;CAEA,MAAM,EAAE,SAAS,oBACf,WACA,uBACA,sBACA,gBACC,UAAU;EACT,IAAI,iCAAiC;GACnC,kCAAkC;GAClC,IAAI,MAAM,aACR,sBAAsB,KAAK,QAAQ,UAAU,WAAW,MAAM,GAAG,CAAC;GAEpE,yCAAyC;EAC3C;CACF,CACF;CAEA,OAAO;EACL,YAAY;GACV,KAAK;GACL,YAAY,KAAK;EACnB;EACA,eAAe,cAAwB;GACrC,IAAI,uBAAuB;IACzB,wBAAwB;IACxB,sBAAsB,KAAK,SAAS;IACpC,yCAAyC;GAC3C;EACF;CACF;AACF"}
@@ -0,0 +1,35 @@
1
+ import { getNavigationEntry, sanitizeFirstByte } from "../../../browser/performanceUtils.mjs";
2
+ import { clearTimeout, mockable, runOnReadyState, setTimeout } from "@kubesense/kubesense-browser-core";
3
+ //#region src/domain/view/viewMetrics/trackNavigationTimings.ts
4
+ function trackNavigationTimings(callback) {
5
+ return waitAfterLoadEvent(() => {
6
+ const entry = mockable(getNavigationEntry)();
7
+ if (!isIncompleteNavigation(entry)) callback(processNavigationEntry(entry));
8
+ });
9
+ }
10
+ function processNavigationEntry(entry) {
11
+ return {
12
+ domComplete: entry.domComplete,
13
+ domContentLoaded: entry.domContentLoadedEventEnd,
14
+ domInteractive: entry.domInteractive,
15
+ loadEvent: entry.loadEventEnd,
16
+ firstByte: sanitizeFirstByte(entry)
17
+ };
18
+ }
19
+ function isIncompleteNavigation(entry) {
20
+ return entry.loadEventEnd <= 0;
21
+ }
22
+ function waitAfterLoadEvent(callback) {
23
+ let timeoutId;
24
+ const { stop: stopOnReadyState } = runOnReadyState("complete", () => {
25
+ timeoutId = setTimeout(() => callback());
26
+ });
27
+ return { stop: () => {
28
+ stopOnReadyState();
29
+ clearTimeout(timeoutId);
30
+ } };
31
+ }
32
+ //#endregion
33
+ export { trackNavigationTimings };
34
+
35
+ //# sourceMappingURL=trackNavigationTimings.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trackNavigationTimings.mjs","names":[],"sources":["../../../../src/domain/view/viewMetrics/trackNavigationTimings.ts"],"sourcesContent":["import type { TimeoutId } from '@kubesense/kubesense-browser-core'\nimport type { Duration } from '@kubesense/kubesense-js-core/time'\nimport { setTimeout, runOnReadyState, clearTimeout, mockable } from '@kubesense/kubesense-browser-core'\nimport type { RumPerformanceNavigationTiming } from '../../../browser/performanceObservable'\nimport { getNavigationEntry, sanitizeFirstByte } from '../../../browser/performanceUtils'\n\nexport interface NavigationTimings {\n domComplete: Duration\n domContentLoaded: Duration\n domInteractive: Duration\n loadEvent: Duration\n firstByte: Duration | undefined\n}\n\n// This is a subset of \"RumPerformanceNavigationTiming\" that only contains the relevant fields for\n// computing navigation timings. This is useful to mock the navigation entry in tests.\nexport type RelevantNavigationTiming = Pick<\n RumPerformanceNavigationTiming,\n 'domComplete' | 'domContentLoadedEventEnd' | 'domInteractive' | 'loadEventEnd' | 'responseStart'\n>\n\nexport function trackNavigationTimings(callback: (timings: NavigationTimings) => void) {\n return waitAfterLoadEvent(() => {\n const entry = mockable(getNavigationEntry)()\n\n if (!isIncompleteNavigation(entry)) {\n callback(processNavigationEntry(entry))\n }\n })\n}\n\nfunction processNavigationEntry(entry: RelevantNavigationTiming): NavigationTimings {\n return {\n domComplete: entry.domComplete,\n domContentLoaded: entry.domContentLoadedEventEnd,\n domInteractive: entry.domInteractive,\n loadEvent: entry.loadEventEnd,\n firstByte: sanitizeFirstByte(entry),\n }\n}\n\nfunction isIncompleteNavigation(entry: RelevantNavigationTiming) {\n return entry.loadEventEnd <= 0\n}\n\nfunction waitAfterLoadEvent(callback: () => void) {\n let timeoutId: TimeoutId | undefined\n const { stop: stopOnReadyState } = runOnReadyState('complete', () => {\n // Invoke the callback a bit after the actual load event, so the \"loadEventEnd\" timing is accurate\n timeoutId = setTimeout(() => callback())\n })\n return {\n stop: () => {\n stopOnReadyState()\n clearTimeout(timeoutId)\n },\n }\n}\n"],"mappings":";;;AAqBA,SAAgB,uBAAuB,UAAgD;CACrF,OAAO,yBAAyB;EAC9B,MAAM,QAAQ,SAAS,kBAAkB,CAAC,CAAC;EAE3C,IAAI,CAAC,uBAAuB,KAAK,GAC/B,SAAS,uBAAuB,KAAK,CAAC;CAE1C,CAAC;AACH;AAEA,SAAS,uBAAuB,OAAoD;CAClF,OAAO;EACL,aAAa,MAAM;EACnB,kBAAkB,MAAM;EACxB,gBAAgB,MAAM;EACtB,WAAW,MAAM;EACjB,WAAW,kBAAkB,KAAK;CACpC;AACF;AAEA,SAAS,uBAAuB,OAAiC;CAC/D,OAAO,MAAM,gBAAgB;AAC/B;AAEA,SAAS,mBAAmB,UAAsB;CAChD,IAAI;CACJ,MAAM,EAAE,MAAM,qBAAqB,gBAAgB,kBAAkB;EAEnE,YAAY,iBAAiB,SAAS,CAAC;CACzC,CAAC;CACD,OAAO,EACL,YAAY;EACV,iBAAiB;EACjB,aAAa,SAAS;CACxB,EACF;AACF"}
@@ -0,0 +1,66 @@
1
+ import { getScrollY } from "../../../browser/scroll.mjs";
2
+ import { getViewportDimension } from "../../../browser/viewportObservable.mjs";
3
+ import { ONE_SECOND, elapsed, relativeNow } from "@kubesense/kubesense-js-core/time";
4
+ import { DOM_EVENT, Observable, addEventListener, throttle } from "@kubesense/kubesense-browser-core";
5
+ import { monitor } from "@kubesense/kubesense-js-core/monitor";
6
+ //#region src/domain/view/viewMetrics/trackScrollMetrics.ts
7
+ /** Arbitrary scroll throttle duration */
8
+ const THROTTLE_SCROLL_DURATION = ONE_SECOND;
9
+ function trackScrollMetrics(viewStart, callback, scrollValues = createScrollValuesObservable()) {
10
+ let maxScrollDepth = 0;
11
+ let maxScrollHeight = 0;
12
+ let maxScrollHeightTime = 0;
13
+ const subscription = scrollValues.subscribe(({ scrollDepth, scrollTop, scrollHeight }) => {
14
+ let shouldUpdate = false;
15
+ if (scrollDepth > maxScrollDepth) {
16
+ maxScrollDepth = scrollDepth;
17
+ shouldUpdate = true;
18
+ }
19
+ if (scrollHeight > maxScrollHeight) {
20
+ maxScrollHeight = scrollHeight;
21
+ const now = relativeNow();
22
+ maxScrollHeightTime = elapsed(viewStart.relative, now);
23
+ shouldUpdate = true;
24
+ }
25
+ if (shouldUpdate) callback({
26
+ maxDepth: Math.min(maxScrollDepth, maxScrollHeight),
27
+ maxDepthScrollTop: scrollTop,
28
+ maxScrollHeight,
29
+ maxScrollHeightTime
30
+ });
31
+ });
32
+ return { stop: () => subscription.unsubscribe() };
33
+ }
34
+ function computeScrollValues() {
35
+ const scrollTop = getScrollY();
36
+ const { height } = getViewportDimension();
37
+ return {
38
+ scrollHeight: Math.round((document.scrollingElement || document.documentElement).scrollHeight),
39
+ scrollDepth: Math.round(height + scrollTop),
40
+ scrollTop
41
+ };
42
+ }
43
+ function createScrollValuesObservable(throttleDuration = THROTTLE_SCROLL_DURATION) {
44
+ return new Observable((observable) => {
45
+ function notify() {
46
+ observable.notify(computeScrollValues());
47
+ }
48
+ const throttledNotify = throttle(notify, throttleDuration, {
49
+ leading: false,
50
+ trailing: true
51
+ });
52
+ const observerTarget = document.scrollingElement || document.documentElement;
53
+ const resizeObserver = new ResizeObserver(monitor(throttledNotify.throttled));
54
+ if (observerTarget) resizeObserver.observe(observerTarget);
55
+ const eventListener = addEventListener(window, DOM_EVENT.SCROLL, throttledNotify.throttled, { passive: true });
56
+ return () => {
57
+ throttledNotify.cancel();
58
+ resizeObserver.disconnect();
59
+ eventListener.stop();
60
+ };
61
+ });
62
+ }
63
+ //#endregion
64
+ export { THROTTLE_SCROLL_DURATION, computeScrollValues, createScrollValuesObservable, trackScrollMetrics };
65
+
66
+ //# sourceMappingURL=trackScrollMetrics.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trackScrollMetrics.mjs","names":[],"sources":["../../../../src/domain/view/viewMetrics/trackScrollMetrics.ts"],"sourcesContent":["import { ONE_SECOND, elapsed, relativeNow } from '@kubesense/kubesense-js-core/time'\nimport type { Duration, ClocksState } from '@kubesense/kubesense-js-core/time'\nimport { monitor } from '@kubesense/kubesense-js-core/monitor'\nimport { Observable, throttle, addEventListener, DOM_EVENT } from '@kubesense/kubesense-browser-core'\nimport { getScrollY } from '../../../browser/scroll'\nimport { getViewportDimension } from '../../../browser/viewportObservable'\n\n/** Arbitrary scroll throttle duration */\nexport const THROTTLE_SCROLL_DURATION = ONE_SECOND\n\nexport interface ScrollMetrics {\n maxDepth: number\n maxScrollHeight: number\n maxDepthScrollTop: number\n maxScrollHeightTime: Duration\n}\n\nexport function trackScrollMetrics(\n viewStart: ClocksState,\n callback: (scrollMetrics: ScrollMetrics) => void,\n scrollValues = createScrollValuesObservable()\n) {\n let maxScrollDepth = 0\n let maxScrollHeight = 0\n let maxScrollHeightTime = 0 as Duration\n\n const subscription = scrollValues.subscribe(({ scrollDepth, scrollTop, scrollHeight }) => {\n let shouldUpdate = false\n\n if (scrollDepth > maxScrollDepth) {\n maxScrollDepth = scrollDepth\n shouldUpdate = true\n }\n\n if (scrollHeight > maxScrollHeight) {\n maxScrollHeight = scrollHeight\n const now = relativeNow()\n maxScrollHeightTime = elapsed(viewStart.relative, now)\n shouldUpdate = true\n }\n\n if (shouldUpdate) {\n callback({\n maxDepth: Math.min(maxScrollDepth, maxScrollHeight),\n maxDepthScrollTop: scrollTop,\n maxScrollHeight,\n maxScrollHeightTime,\n })\n }\n })\n\n return {\n stop: () => subscription.unsubscribe(),\n }\n}\n\nexport interface ScrollValues {\n scrollDepth: number\n scrollTop: number\n scrollHeight: number\n}\n\nexport function computeScrollValues() {\n const scrollTop = getScrollY()\n\n const { height } = getViewportDimension()\n\n const scrollHeight = Math.round((document.scrollingElement || document.documentElement).scrollHeight)\n\n const scrollDepth = Math.round(height + scrollTop)\n\n return {\n scrollHeight,\n scrollDepth,\n scrollTop,\n }\n}\n\nexport function createScrollValuesObservable(throttleDuration = THROTTLE_SCROLL_DURATION): Observable<ScrollValues> {\n return new Observable<ScrollValues>((observable) => {\n function notify() {\n observable.notify(computeScrollValues())\n }\n\n const throttledNotify = throttle(notify, throttleDuration, {\n leading: false,\n trailing: true,\n })\n\n const observerTarget = document.scrollingElement || document.documentElement\n const resizeObserver = new ResizeObserver(monitor(throttledNotify.throttled))\n if (observerTarget) {\n resizeObserver.observe(observerTarget)\n }\n const eventListener = addEventListener(window, DOM_EVENT.SCROLL, throttledNotify.throttled, {\n passive: true,\n })\n\n return () => {\n throttledNotify.cancel()\n resizeObserver.disconnect()\n eventListener.stop()\n }\n })\n}\n"],"mappings":";;;;;;;AAQA,MAAa,2BAA2B;AASxC,SAAgB,mBACd,WACA,UACA,eAAe,6BAA6B,GAC5C;CACA,IAAI,iBAAiB;CACrB,IAAI,kBAAkB;CACtB,IAAI,sBAAsB;CAE1B,MAAM,eAAe,aAAa,WAAW,EAAE,aAAa,WAAW,mBAAmB;EACxF,IAAI,eAAe;EAEnB,IAAI,cAAc,gBAAgB;GAChC,iBAAiB;GACjB,eAAe;EACjB;EAEA,IAAI,eAAe,iBAAiB;GAClC,kBAAkB;GAClB,MAAM,MAAM,YAAY;GACxB,sBAAsB,QAAQ,UAAU,UAAU,GAAG;GACrD,eAAe;EACjB;EAEA,IAAI,cACF,SAAS;GACP,UAAU,KAAK,IAAI,gBAAgB,eAAe;GAClD,mBAAmB;GACnB;GACA;EACF,CAAC;CAEL,CAAC;CAED,OAAO,EACL,YAAY,aAAa,YAAY,EACvC;AACF;AAQA,SAAgB,sBAAsB;CACpC,MAAM,YAAY,WAAW;CAE7B,MAAM,EAAE,WAAW,qBAAqB;CAMxC,OAAO;EACL,cALmB,KAAK,OAAO,SAAS,oBAAoB,SAAS,gBAAA,CAAiB,YAK3E;EACX,aAJkB,KAAK,MAAM,SAAS,SAI5B;EACV;CACF;AACF;AAEA,SAAgB,6BAA6B,mBAAmB,0BAAoD;CAClH,OAAO,IAAI,YAA0B,eAAe;EAClD,SAAS,SAAS;GAChB,WAAW,OAAO,oBAAoB,CAAC;EACzC;EAEA,MAAM,kBAAkB,SAAS,QAAQ,kBAAkB;GACzD,SAAS;GACT,UAAU;EACZ,CAAC;EAED,MAAM,iBAAiB,SAAS,oBAAoB,SAAS;EAC7D,MAAM,iBAAiB,IAAI,eAAe,QAAQ,gBAAgB,SAAS,CAAC;EAC5E,IAAI,gBACF,eAAe,QAAQ,cAAc;EAEvC,MAAM,gBAAgB,iBAAiB,QAAQ,UAAU,QAAQ,gBAAgB,WAAW,EAC1F,SAAS,KACX,CAAC;EAED,aAAa;GACX,gBAAgB,OAAO;GACvB,eAAe,WAAW;GAC1B,cAAc,KAAK;EACrB;CACF,CAAC;AACH"}
@@ -0,0 +1,85 @@
1
+ import { RumEventType, VitalType } from "../../rawRumEvent.types.mjs";
2
+ import "../lifeCycle.mjs";
3
+ import { startEventTracker } from "../eventTracker.mjs";
4
+ import "../contexts/pageStateHistory.mjs";
5
+ import { clocksNow, toServerDuration } from "@kubesense/kubesense-js-core/time";
6
+ import { generateUUID, sanitize } from "@kubesense/kubesense-browser-core";
7
+ //#region src/domain/vital/vitalCollection.ts
8
+ function startVitalCollection(lifeCycle, pageStateHistory) {
9
+ const vitalTracker = startEventTracker(lifeCycle);
10
+ function isValid(vital) {
11
+ return !pageStateHistory.wasInPageStateDuringPeriod("frozen", vital.startClocks.relative, vital.duration);
12
+ }
13
+ function addDurationVital(vital) {
14
+ if (isValid(vital)) lifeCycle.notify(13, processVital(vital));
15
+ }
16
+ function addOperationStepVital(name, stepType, options, failureReason) {
17
+ const { operationKey, context, description, handlingStack } = options || {};
18
+ const vital = {
19
+ name,
20
+ type: VitalType.OPERATION_STEP,
21
+ operationKey,
22
+ failureReason,
23
+ stepType,
24
+ startClocks: clocksNow(),
25
+ context: sanitize(context),
26
+ description,
27
+ handlingStack
28
+ };
29
+ lifeCycle.notify(13, processVital(vital));
30
+ }
31
+ function startDurationVital(name, options = {}, startClocks = clocksNow()) {
32
+ const { id } = vitalTracker.start(options.vitalKey ?? name, startClocks, {
33
+ name,
34
+ ...options
35
+ });
36
+ lifeCycle.notify(17, {
37
+ id,
38
+ name,
39
+ startClocks,
40
+ ...options
41
+ });
42
+ }
43
+ function stopDurationVital(name, options = {}, stopClocks = clocksNow()) {
44
+ const stopped = vitalTracker.stop(options.vitalKey ?? name, stopClocks, options);
45
+ if (stopped) addDurationVital({
46
+ type: VitalType.DURATION,
47
+ ...stopped
48
+ });
49
+ }
50
+ return {
51
+ addOperationStepVital,
52
+ addDurationVital,
53
+ startDurationVital,
54
+ stopDurationVital
55
+ };
56
+ }
57
+ function processVital(vital) {
58
+ const { startClocks, type, name, description, context, handlingStack } = vital;
59
+ const vitalData = {
60
+ id: (vital.type === VitalType.DURATION ? vital.id : void 0) ?? generateUUID(),
61
+ type,
62
+ name,
63
+ description,
64
+ ...type === VitalType.DURATION ? { duration: toServerDuration(vital.duration) } : {
65
+ step_type: vital.stepType,
66
+ operation_key: vital.operationKey,
67
+ failure_reason: vital.failureReason
68
+ }
69
+ };
70
+ return {
71
+ rawRumEvent: {
72
+ date: startClocks.timeStamp,
73
+ vital: vitalData,
74
+ type: RumEventType.VITAL,
75
+ context
76
+ },
77
+ startClocks,
78
+ duration: type === VitalType.DURATION ? vital.duration : void 0,
79
+ domainContext: handlingStack ? { handlingStack } : {}
80
+ };
81
+ }
82
+ //#endregion
83
+ export { startVitalCollection };
84
+
85
+ //# sourceMappingURL=vitalCollection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitalCollection.mjs","names":[],"sources":["../../../src/domain/vital/vitalCollection.ts"],"sourcesContent":["import type { ClocksState, Duration } from '@kubesense/kubesense-js-core/time'\nimport { toServerDuration, clocksNow } from '@kubesense/kubesense-js-core/time'\nimport { generateUUID, sanitize } from '@kubesense/kubesense-browser-core'\nimport type { LifeCycle, RawRumEventCollectedData } from '../lifeCycle'\nimport { LifeCycleEventType } from '../lifeCycle'\nimport type { RawRumVitalEvent } from '../../rawRumEvent.types'\nimport { RumEventType, VitalType } from '../../rawRumEvent.types'\nimport type { PageStateHistory } from '../contexts/pageStateHistory'\nimport { PageState } from '../contexts/pageStateHistory'\nimport { startEventTracker } from '../eventTracker'\n\n/**\n * Vital options\n */\nexport interface VitalOptions {\n /**\n * Vital context\n */\n context?: any\n\n /**\n * Vital description\n */\n description?: string\n}\n\n/**\n * Duration vital options\n */\nexport interface DurationVitalOptions extends VitalOptions {\n /**\n * Vital key, used to identify a specific vital instance when multiple vitals with the same name\n * are tracked simultaneously\n */\n vitalKey?: string\n}\n\nexport interface OperationOptions extends VitalOptions {\n operationKey?: string\n}\n\n/** @deprecated Use {@link OperationOptions} instead. */\nexport type FeatureOperationOptions = OperationOptions\n\nexport type FailureReason = 'error' | 'abandoned' | 'other'\n\n/**\n * Add duration vital options\n */\nexport interface AddDurationVitalOptions extends DurationVitalOptions {\n /**\n * Vital start time, expects a UNIX timestamp in milliseconds (the number of milliseconds since January 1, 1970)\n */\n startTime: number\n\n /**\n * Vital duration, expects a duration in milliseconds\n */\n duration: number\n}\n\nexport interface DurationVitalStart extends DurationVitalOptions {\n id: string\n name: string\n startClocks: ClocksState\n handlingStack?: string\n}\n\ninterface BaseVital extends VitalOptions {\n name: string\n startClocks: ClocksState\n handlingStack?: string\n}\nexport interface DurationVital extends BaseVital {\n id: string\n type: typeof VitalType.DURATION\n duration: Duration\n}\n\nexport interface OperationStepVital extends BaseVital {\n type: typeof VitalType.OPERATION_STEP\n stepType: 'start' | 'end'\n operationKey?: string\n failureReason?: string\n}\n\ninterface DurationVitalData {\n name: string\n context?: any\n description?: string\n handlingStack?: string\n}\n\nexport function startVitalCollection(lifeCycle: LifeCycle, pageStateHistory: PageStateHistory) {\n const vitalTracker = startEventTracker<DurationVitalData>(lifeCycle)\n\n function isValid(vital: DurationVital) {\n return !pageStateHistory.wasInPageStateDuringPeriod(PageState.FROZEN, vital.startClocks.relative, vital.duration)\n }\n\n function addDurationVital(vital: DurationVital) {\n if (isValid(vital)) {\n lifeCycle.notify(LifeCycleEventType.RAW_RUM_EVENT_COLLECTED, processVital(vital))\n }\n }\n\n function addOperationStepVital(\n name: string,\n stepType: 'start' | 'end',\n options?: OperationOptions & { handlingStack?: string },\n failureReason?: FailureReason\n ) {\n const { operationKey, context, description, handlingStack } = options || {}\n\n const vital: OperationStepVital = {\n name,\n type: VitalType.OPERATION_STEP,\n operationKey,\n failureReason,\n stepType,\n startClocks: clocksNow(),\n context: sanitize(context),\n description,\n handlingStack,\n }\n lifeCycle.notify(LifeCycleEventType.RAW_RUM_EVENT_COLLECTED, processVital(vital))\n }\n\n function startDurationVital(\n name: string,\n options: DurationVitalOptions & { handlingStack?: string } = {},\n startClocks = clocksNow()\n ) {\n const { id } = vitalTracker.start(options.vitalKey ?? name, startClocks, {\n name,\n ...options,\n })\n lifeCycle.notify(LifeCycleEventType.DURATION_VITAL_STARTED, { id, name, startClocks, ...options })\n }\n\n function stopDurationVital(name: string, options: DurationVitalOptions = {}, stopClocks = clocksNow()) {\n const stopped = vitalTracker.stop(options.vitalKey ?? name, stopClocks, options)\n if (stopped) {\n addDurationVital({\n type: VitalType.DURATION,\n ...stopped,\n })\n }\n }\n\n return {\n addOperationStepVital,\n addDurationVital,\n startDurationVital,\n stopDurationVital,\n }\n}\n\nfunction processVital(vital: DurationVital | OperationStepVital): RawRumEventCollectedData<RawRumVitalEvent> {\n const { startClocks, type, name, description, context, handlingStack } = vital\n const vitalId = vital.type === VitalType.DURATION ? vital.id : undefined\n\n const vitalData = {\n id: vitalId ?? generateUUID(),\n type,\n name,\n description,\n ...(type === VitalType.DURATION\n ? { duration: toServerDuration(vital.duration) }\n : {\n step_type: vital.stepType,\n operation_key: vital.operationKey,\n failure_reason: vital.failureReason,\n }),\n }\n\n return {\n rawRumEvent: {\n date: startClocks.timeStamp,\n vital: vitalData,\n type: RumEventType.VITAL,\n context,\n },\n startClocks,\n duration: type === VitalType.DURATION ? vital.duration : undefined,\n domainContext: handlingStack ? { handlingStack } : {},\n }\n}\n"],"mappings":";;;;;;;AA6FA,SAAgB,qBAAqB,WAAsB,kBAAoC;CAC7F,MAAM,eAAe,kBAAqC,SAAS;CAEnE,SAAS,QAAQ,OAAsB;EACrC,OAAO,CAAC,iBAAiB,2BAAA,UAA6C,MAAM,YAAY,UAAU,MAAM,QAAQ;CAClH;CAEA,SAAS,iBAAiB,OAAsB;EAC9C,IAAI,QAAQ,KAAK,GACf,UAAU,OAAA,IAAmD,aAAa,KAAK,CAAC;CAEpF;CAEA,SAAS,sBACP,MACA,UACA,SACA,eACA;EACA,MAAM,EAAE,cAAc,SAAS,aAAa,kBAAkB,WAAW,CAAC;EAE1E,MAAM,QAA4B;GAChC;GACA,MAAM,UAAU;GAChB;GACA;GACA;GACA,aAAa,UAAU;GACvB,SAAS,SAAS,OAAO;GACzB;GACA;EACF;EACA,UAAU,OAAA,IAAmD,aAAa,KAAK,CAAC;CAClF;CAEA,SAAS,mBACP,MACA,UAA6D,CAAC,GAC9D,cAAc,UAAU,GACxB;EACA,MAAM,EAAE,OAAO,aAAa,MAAM,QAAQ,YAAY,MAAM,aAAa;GACvE;GACA,GAAG;EACL,CAAC;EACD,UAAU,OAAA,IAAkD;GAAE;GAAI;GAAM;GAAa,GAAG;EAAQ,CAAC;CACnG;CAEA,SAAS,kBAAkB,MAAc,UAAgC,CAAC,GAAG,aAAa,UAAU,GAAG;EACrG,MAAM,UAAU,aAAa,KAAK,QAAQ,YAAY,MAAM,YAAY,OAAO;EAC/E,IAAI,SACF,iBAAiB;GACf,MAAM,UAAU;GAChB,GAAG;EACL,CAAC;CAEL;CAEA,OAAO;EACL;EACA;EACA;EACA;CACF;AACF;AAEA,SAAS,aAAa,OAAuF;CAC3G,MAAM,EAAE,aAAa,MAAM,MAAM,aAAa,SAAS,kBAAkB;CAGzE,MAAM,YAAY;EAChB,KAHc,MAAM,SAAS,UAAU,WAAW,MAAM,KAAK,KAAA,MAG9C,aAAa;EAC5B;EACA;EACA;EACA,GAAI,SAAS,UAAU,WACnB,EAAE,UAAU,iBAAiB,MAAM,QAAQ,EAAE,IAC7C;GACE,WAAW,MAAM;GACjB,eAAe,MAAM;GACrB,gBAAgB,MAAM;EACxB;CACN;CAEA,OAAO;EACL,aAAa;GACX,MAAM,YAAY;GAClB,OAAO;GACP,MAAM,aAAa;GACnB;EACF;EACA;EACA,UAAU,SAAS,UAAU,WAAW,MAAM,WAAW,KAAA;EACzD,eAAe,gBAAgB,EAAE,cAAc,IAAI,CAAC;CACtD;AACF"}
@@ -0,0 +1,107 @@
1
+ import "./lifeCycle.mjs";
2
+ import { isElementNode } from "../browser/htmlDomUtils.mjs";
3
+ import { createPerformanceObservable } from "../browser/performanceObservable.mjs";
4
+ import { timeStampNow } from "@kubesense/kubesense-js-core/time";
5
+ import { Observable, clearTimeout, matchList, mockable, setTimeout } from "@kubesense/kubesense-browser-core";
6
+ import { monitor } from "@kubesense/kubesense-js-core/monitor";
7
+ const EXCLUDED_MUTATIONS_ATTRIBUTE = "data-kubesense-excluded-activity-mutations";
8
+ /**
9
+ * Wait for the page activity end
10
+ *
11
+ * Detection lifecycle:
12
+ * ```
13
+ * Wait page activity end
14
+ * .-------------------'--------------------.
15
+ * v v
16
+ * [Wait for a page activity ] [Wait for a maximum duration]
17
+ * [timeout: VALIDATION_DELAY] [ timeout: maxDuration ]
18
+ * / \ |
19
+ * v v |
20
+ * [No page activity] [Page activity] |
21
+ * | |,----------------------. |
22
+ * v v | |
23
+ * (Discard) [Wait for a page activity] | |
24
+ * [ timeout: END_DELAY ] | |
25
+ * / \ | |
26
+ * v v | |
27
+ * [No page activity] [Page activity] | |
28
+ * | | | |
29
+ * | '------------' |
30
+ * '-----------. ,--------------------'
31
+ * v
32
+ * (End)
33
+ * ```
34
+ *
35
+ * Note: by assuming that maxDuration is greater than VALIDATION_DELAY, we are sure that if the
36
+ * process is still alive after maxDuration, it has been validated.
37
+ */
38
+ function waitPageActivityEnd(lifeCycle, domMutationObservable, windowOpenObservable, configuration, pageActivityEndCallback, maxDuration) {
39
+ const pageActivityObservable = mockable(createPageActivityObservable)(lifeCycle, domMutationObservable, windowOpenObservable, configuration);
40
+ let pageActivityEndTimeoutId;
41
+ let hasCompleted = false;
42
+ const validationTimeoutId = setTimeout(monitor(() => complete({ hadActivity: false })), 100);
43
+ const maxDurationTimeoutId = maxDuration !== void 0 ? setTimeout(monitor(() => complete({
44
+ hadActivity: true,
45
+ end: timeStampNow()
46
+ })), maxDuration) : void 0;
47
+ const pageActivitySubscription = pageActivityObservable.subscribe(({ isBusy }) => {
48
+ clearTimeout(validationTimeoutId);
49
+ clearTimeout(pageActivityEndTimeoutId);
50
+ const lastChangeTime = timeStampNow();
51
+ if (!isBusy) pageActivityEndTimeoutId = setTimeout(monitor(() => complete({
52
+ hadActivity: true,
53
+ end: lastChangeTime
54
+ })), 100);
55
+ });
56
+ const stop = () => {
57
+ hasCompleted = true;
58
+ clearTimeout(validationTimeoutId);
59
+ clearTimeout(pageActivityEndTimeoutId);
60
+ clearTimeout(maxDurationTimeoutId);
61
+ pageActivitySubscription.unsubscribe();
62
+ };
63
+ function complete(event) {
64
+ if (hasCompleted) return;
65
+ stop();
66
+ pageActivityEndCallback(event);
67
+ }
68
+ return { stop };
69
+ }
70
+ function createPageActivityObservable(lifeCycle, domMutationObservable, windowOpenObservable, configuration) {
71
+ return new Observable((observable) => {
72
+ const subscriptions = [];
73
+ let firstRequestIndex;
74
+ let pendingRequestsCount = 0;
75
+ subscriptions.push(domMutationObservable.subscribe((mutations) => {
76
+ if (!mutations.every(isExcludedMutation)) notifyPageActivity();
77
+ }), windowOpenObservable.subscribe(notifyPageActivity), createPerformanceObservable({ type: "resource" }).subscribe((entries) => {
78
+ if (entries.some((entry) => !isExcludedUrl(configuration, entry.name))) notifyPageActivity();
79
+ }), lifeCycle.subscribe(7, (startEvent) => {
80
+ if (isExcludedUrl(configuration, startEvent.url)) return;
81
+ if (firstRequestIndex === void 0) firstRequestIndex = startEvent.requestIndex;
82
+ pendingRequestsCount += 1;
83
+ notifyPageActivity();
84
+ }), lifeCycle.subscribe(8, (request) => {
85
+ if (isExcludedUrl(configuration, request.url) || firstRequestIndex === void 0 || request.requestIndex < firstRequestIndex) return;
86
+ pendingRequestsCount -= 1;
87
+ notifyPageActivity();
88
+ }));
89
+ return () => {
90
+ subscriptions.forEach((s) => s.unsubscribe());
91
+ };
92
+ function notifyPageActivity() {
93
+ observable.notify({ isBusy: pendingRequestsCount > 0 });
94
+ }
95
+ });
96
+ }
97
+ function isExcludedUrl(configuration, requestUrl) {
98
+ return matchList(configuration.excludedActivityUrls, requestUrl);
99
+ }
100
+ function isExcludedMutation(mutation) {
101
+ const targetElement = mutation.type === "characterData" ? mutation.target.parentElement : mutation.target;
102
+ return Boolean(targetElement && isElementNode(targetElement) && targetElement.matches(`[data-kubesense-excluded-activity-mutations], [data-kubesense-excluded-activity-mutations] *`));
103
+ }
104
+ //#endregion
105
+ export { EXCLUDED_MUTATIONS_ATTRIBUTE, createPageActivityObservable, waitPageActivityEnd };
106
+
107
+ //# sourceMappingURL=waitPageActivityEnd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitPageActivityEnd.mjs","names":[],"sources":["../../src/domain/waitPageActivityEnd.ts"],"sourcesContent":["import type { Subscription, TimeoutId } from '@kubesense/kubesense-browser-core'\nimport { timeStampNow } from '@kubesense/kubesense-js-core/time'\nimport type { TimeStamp } from '@kubesense/kubesense-js-core/time'\nimport { monitor } from '@kubesense/kubesense-js-core/monitor'\nimport { matchList, Observable, setTimeout, clearTimeout, mockable } from '@kubesense/kubesense-browser-core'\nimport { createPerformanceObservable, RumPerformanceEntryType } from '../browser/performanceObservable'\nimport type { RumMutationRecord } from '../browser/domMutationObservable'\nimport { isElementNode } from '../browser/htmlDomUtils'\nimport type { RumConfiguration } from './configuration'\nimport type { LifeCycle } from './lifeCycle'\nimport { LifeCycleEventType } from './lifeCycle'\n\n// Delay to wait for a page activity to validate the tracking process\nexport const PAGE_ACTIVITY_VALIDATION_DELAY = 100\n// Delay to wait after a page activity to end the tracking process\nexport const PAGE_ACTIVITY_END_DELAY = 100\n\nexport const EXCLUDED_MUTATIONS_ATTRIBUTE = 'data-kubesense-excluded-activity-mutations'\n\nexport interface PageActivityEvent {\n isBusy: boolean\n}\n\nexport type PageActivityEndEvent = { hadActivity: true; end: TimeStamp } | { hadActivity: false }\n\n/**\n * Wait for the page activity end\n *\n * Detection lifecycle:\n * ```\n * Wait page activity end\n * .-------------------'--------------------.\n * v v\n * [Wait for a page activity ] [Wait for a maximum duration]\n * [timeout: VALIDATION_DELAY] [ timeout: maxDuration ]\n * / \\ |\n * v v |\n * [No page activity] [Page activity] |\n * | |,----------------------. |\n * v v | |\n * (Discard) [Wait for a page activity] | |\n * [ timeout: END_DELAY ] | |\n * / \\ | |\n * v v | |\n * [No page activity] [Page activity] | |\n * | | | |\n * | '------------' |\n * '-----------. ,--------------------'\n * v\n * (End)\n * ```\n *\n * Note: by assuming that maxDuration is greater than VALIDATION_DELAY, we are sure that if the\n * process is still alive after maxDuration, it has been validated.\n */\nexport function waitPageActivityEnd(\n lifeCycle: LifeCycle,\n domMutationObservable: Observable<RumMutationRecord[]>,\n windowOpenObservable: Observable<void>,\n configuration: RumConfiguration,\n pageActivityEndCallback: (event: PageActivityEndEvent) => void,\n maxDuration?: number\n) {\n const pageActivityObservable = mockable(createPageActivityObservable)(\n lifeCycle,\n domMutationObservable,\n windowOpenObservable,\n configuration\n )\n\n let pageActivityEndTimeoutId: TimeoutId\n let hasCompleted = false\n\n const validationTimeoutId = setTimeout(\n monitor(() => complete({ hadActivity: false })),\n PAGE_ACTIVITY_VALIDATION_DELAY\n )\n const maxDurationTimeoutId =\n maxDuration !== undefined\n ? setTimeout(\n monitor(() => complete({ hadActivity: true, end: timeStampNow() })),\n maxDuration\n )\n : undefined\n\n const pageActivitySubscription = pageActivityObservable.subscribe(({ isBusy }) => {\n clearTimeout(validationTimeoutId)\n clearTimeout(pageActivityEndTimeoutId)\n const lastChangeTime = timeStampNow()\n if (!isBusy) {\n pageActivityEndTimeoutId = setTimeout(\n monitor(() => complete({ hadActivity: true, end: lastChangeTime })),\n PAGE_ACTIVITY_END_DELAY\n )\n }\n })\n\n const stop = () => {\n hasCompleted = true\n clearTimeout(validationTimeoutId)\n clearTimeout(pageActivityEndTimeoutId)\n clearTimeout(maxDurationTimeoutId)\n pageActivitySubscription.unsubscribe()\n }\n\n function complete(event: PageActivityEndEvent) {\n if (hasCompleted) {\n return\n }\n stop()\n pageActivityEndCallback(event)\n }\n return { stop }\n}\n\nexport function createPageActivityObservable(\n lifeCycle: LifeCycle,\n domMutationObservable: Observable<RumMutationRecord[]>,\n windowOpenObservable: Observable<void>,\n configuration: RumConfiguration\n): Observable<PageActivityEvent> {\n return new Observable<PageActivityEvent>((observable) => {\n const subscriptions: Subscription[] = []\n let firstRequestIndex: undefined | number\n let pendingRequestsCount = 0\n\n subscriptions.push(\n domMutationObservable.subscribe((mutations) => {\n if (!mutations.every(isExcludedMutation)) {\n notifyPageActivity()\n }\n }),\n windowOpenObservable.subscribe(notifyPageActivity),\n createPerformanceObservable({ type: RumPerformanceEntryType.RESOURCE }).subscribe((entries) => {\n if (entries.some((entry) => !isExcludedUrl(configuration, entry.name))) {\n notifyPageActivity()\n }\n }),\n lifeCycle.subscribe(LifeCycleEventType.REQUEST_STARTED, (startEvent) => {\n if (isExcludedUrl(configuration, startEvent.url)) {\n return\n }\n if (firstRequestIndex === undefined) {\n firstRequestIndex = startEvent.requestIndex\n }\n pendingRequestsCount += 1\n notifyPageActivity()\n }),\n lifeCycle.subscribe(LifeCycleEventType.REQUEST_COMPLETED, (request) => {\n if (\n isExcludedUrl(configuration, request.url) ||\n firstRequestIndex === undefined ||\n // If the request started before the tracking start, ignore it\n request.requestIndex < firstRequestIndex\n ) {\n return\n }\n pendingRequestsCount -= 1\n notifyPageActivity()\n })\n )\n\n return () => {\n subscriptions.forEach((s) => s.unsubscribe())\n }\n\n function notifyPageActivity() {\n observable.notify({ isBusy: pendingRequestsCount > 0 })\n }\n })\n}\n\nfunction isExcludedUrl(configuration: RumConfiguration, requestUrl: string): boolean {\n return matchList(configuration.excludedActivityUrls, requestUrl)\n}\n\nfunction isExcludedMutation(mutation: RumMutationRecord): boolean {\n const targetElement = mutation.type === 'characterData' ? mutation.target.parentElement : mutation.target\n\n return Boolean(\n targetElement &&\n isElementNode(targetElement) &&\n targetElement.matches(`[${EXCLUDED_MUTATIONS_ATTRIBUTE}], [${EXCLUDED_MUTATIONS_ATTRIBUTE}] *`)\n )\n}\n"],"mappings":";;;;;;AAiBA,MAAa,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsC5C,SAAgB,oBACd,WACA,uBACA,sBACA,eACA,yBACA,aACA;CACA,MAAM,yBAAyB,SAAS,4BAA4B,CAAC,CACnE,WACA,uBACA,sBACA,aACF;CAEA,IAAI;CACJ,IAAI,eAAe;CAEnB,MAAM,sBAAsB,WAC1B,cAAc,SAAS,EAAE,aAAa,MAAM,CAAC,CAAC,GAAA,GAEhD;CACA,MAAM,uBACJ,gBAAgB,KAAA,IACZ,WACE,cAAc,SAAS;EAAE,aAAa;EAAM,KAAK,aAAa;CAAE,CAAC,CAAC,GAClE,WACF,IACA,KAAA;CAEN,MAAM,2BAA2B,uBAAuB,WAAW,EAAE,aAAa;EAChF,aAAa,mBAAmB;EAChC,aAAa,wBAAwB;EACrC,MAAM,iBAAiB,aAAa;EACpC,IAAI,CAAC,QACH,2BAA2B,WACzB,cAAc,SAAS;GAAE,aAAa;GAAM,KAAK;EAAe,CAAC,CAAC,GAAA,GAEpE;CAEJ,CAAC;CAED,MAAM,aAAa;EACjB,eAAe;EACf,aAAa,mBAAmB;EAChC,aAAa,wBAAwB;EACrC,aAAa,oBAAoB;EACjC,yBAAyB,YAAY;CACvC;CAEA,SAAS,SAAS,OAA6B;EAC7C,IAAI,cACF;EAEF,KAAK;EACL,wBAAwB,KAAK;CAC/B;CACA,OAAO,EAAE,KAAK;AAChB;AAEA,SAAgB,6BACd,WACA,uBACA,sBACA,eAC+B;CAC/B,OAAO,IAAI,YAA+B,eAAe;EACvD,MAAM,gBAAgC,CAAC;EACvC,IAAI;EACJ,IAAI,uBAAuB;EAE3B,cAAc,KACZ,sBAAsB,WAAW,cAAc;GAC7C,IAAI,CAAC,UAAU,MAAM,kBAAkB,GACrC,mBAAmB;EAEvB,CAAC,GACD,qBAAqB,UAAU,kBAAkB,GACjD,4BAA4B,EAAE,MAAA,WAAuC,CAAC,CAAC,CAAC,WAAW,YAAY;GAC7F,IAAI,QAAQ,MAAM,UAAU,CAAC,cAAc,eAAe,MAAM,IAAI,CAAC,GACnE,mBAAmB;EAEvB,CAAC,GACD,UAAU,UAAA,IAA+C,eAAe;GACtE,IAAI,cAAc,eAAe,WAAW,GAAG,GAC7C;GAEF,IAAI,sBAAsB,KAAA,GACxB,oBAAoB,WAAW;GAEjC,wBAAwB;GACxB,mBAAmB;EACrB,CAAC,GACD,UAAU,UAAA,IAAiD,YAAY;GACrE,IACE,cAAc,eAAe,QAAQ,GAAG,KACxC,sBAAsB,KAAA,KAEtB,QAAQ,eAAe,mBAEvB;GAEF,wBAAwB;GACxB,mBAAmB;EACrB,CAAC,CACH;EAEA,aAAa;GACX,cAAc,SAAS,MAAM,EAAE,YAAY,CAAC;EAC9C;EAEA,SAAS,qBAAqB;GAC5B,WAAW,OAAO,EAAE,QAAQ,uBAAuB,EAAE,CAAC;EACxD;CACF,CAAC;AACH;AAEA,SAAS,cAAc,eAAiC,YAA6B;CACnF,OAAO,UAAU,cAAc,sBAAsB,UAAU;AACjE;AAEA,SAAS,mBAAmB,UAAsC;CAChE,MAAM,gBAAgB,SAAS,SAAS,kBAAkB,SAAS,OAAO,gBAAgB,SAAS;CAEnG,OAAO,QACL,iBACA,cAAc,aAAa,KAC3B,cAAc,QAAQ,8FAAwE,CAChG;AACF"}
package/esm/index.mjs ADDED
@@ -0,0 +1,23 @@
1
+ import { ActionType, FrustrationType, RumEventType, RumLongTaskEntryType, VitalType } from "./rawRumEvent.types.mjs";
2
+ import { CanvasRecordingQuality, DEFAULT_TRACKED_RESOURCE_HEADERS } from "./domain/configuration/configuration.mjs";
3
+ import { getRoutePath, isRouteRecordable } from "./domain/configuration/sessionReplayRoutes.mjs";
4
+ import "./domain/configuration/index.mjs";
5
+ import { createHooks } from "./domain/hooks.mjs";
6
+ import { getMutationObserverConstructor } from "./browser/domMutationObservable.mjs";
7
+ import { LifeCycle, LifeCycleEventType } from "./domain/lifeCycle.mjs";
8
+ import { startViewHistory } from "./domain/contexts/viewHistory.mjs";
9
+ import { sanitizeIfLongDataUrl } from "./domain/resource/resourceUtils.mjs";
10
+ import { forEachChildNodes, getParentElement, getParentNode, hasChildNodes, isCommentNode, isElementNode, isNodeShadowHost, isNodeShadowRoot, isTextNode } from "./browser/htmlDomUtils.mjs";
11
+ import { RumPerformanceEntryType, supportPerformanceTimingEvent } from "./browser/performanceObservable.mjs";
12
+ import { DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE } from "./domain/action/actionNameConstants.mjs";
13
+ import { STABLE_ATTRIBUTES } from "./domain/getSelectorFromElement.mjs";
14
+ import { CENSORED_IMG_MARK, CENSORED_STRING_MARK, FORM_PRIVATE_TAG_NAMES, NodePrivacyLevel, PRIVACY_ATTR_NAME, PRIVACY_ATTR_VALUE_ALLOW, PRIVACY_ATTR_VALUE_HIDDEN, PRIVACY_ATTR_VALUE_MASK, PRIVACY_ATTR_VALUE_MASK_UNLESS_ALLOWLISTED, PRIVACY_ATTR_VALUE_MASK_USER_INPUT, PRIVACY_CLASS_PREFIX, TEXT_MASKING_CHAR, getPrivacySelector } from "./domain/privacyConstants.mjs";
15
+ import { censorText, getNodePrivacyLevel, getNodeSelfPrivacyLevel, getTextContent, isAllowlisted, maskDisallowedTextContent, reducePrivacyLevel, shouldIgnoreElement, shouldMaskAttribute, shouldMaskNode } from "./domain/privacy.mjs";
16
+ import { getScrollX, getScrollY } from "./browser/scroll.mjs";
17
+ import { getViewportDimension, initViewportObservable } from "./browser/viewportObservable.mjs";
18
+ import { SessionReplayState, computeSessionReplayState } from "./domain/sessionReplayState.mjs";
19
+ import { startRum } from "./boot/startRum.mjs";
20
+ import { makeRumPublicApi } from "./boot/rumPublicApi.mjs";
21
+ import { getSessionReplayUrl } from "./domain/getSessionReplayUrl.mjs";
22
+ import { createFormDataTransport } from "./transport/formDataTransport.mjs";
23
+ export { ActionType, CENSORED_IMG_MARK, CENSORED_STRING_MARK, CanvasRecordingQuality, DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE, DEFAULT_TRACKED_RESOURCE_HEADERS, FORM_PRIVATE_TAG_NAMES, FrustrationType, LifeCycle, LifeCycleEventType, NodePrivacyLevel, PRIVACY_ATTR_NAME, PRIVACY_ATTR_VALUE_ALLOW, PRIVACY_ATTR_VALUE_HIDDEN, PRIVACY_ATTR_VALUE_MASK, PRIVACY_ATTR_VALUE_MASK_UNLESS_ALLOWLISTED, PRIVACY_ATTR_VALUE_MASK_USER_INPUT, PRIVACY_CLASS_PREFIX, RumEventType, RumLongTaskEntryType, RumPerformanceEntryType, STABLE_ATTRIBUTES, SessionReplayState, TEXT_MASKING_CHAR, VitalType, censorText, computeSessionReplayState, createFormDataTransport, createHooks, forEachChildNodes, getMutationObserverConstructor, getNodePrivacyLevel, getNodeSelfPrivacyLevel, getParentElement, getParentNode, getPrivacySelector, getRoutePath, getScrollX, getScrollY, getSessionReplayUrl, getTextContent, getViewportDimension, hasChildNodes, initViewportObservable, isAllowlisted, isCommentNode, isElementNode, isNodeShadowHost, isNodeShadowRoot, isRouteRecordable, isTextNode, makeRumPublicApi, maskDisallowedTextContent, reducePrivacyLevel, sanitizeIfLongDataUrl, shouldIgnoreElement, shouldMaskAttribute, shouldMaskNode, startRum, startViewHistory, supportPerformanceTimingEvent };
@@ -0,0 +1,42 @@
1
+ //#region src/rawRumEvent.types.ts
2
+ const RumEventType = {
3
+ ACTION: "action",
4
+ ERROR: "error",
5
+ LONG_TASK: "long_task",
6
+ VIEW: "view",
7
+ VIEW_UPDATE: "view_update",
8
+ RESOURCE: "resource",
9
+ VITAL: "vital"
10
+ };
11
+ const RumLongTaskEntryType = {
12
+ LONG_TASK: "long-task",
13
+ LONG_ANIMATION_FRAME: "long-animation-frame"
14
+ };
15
+ const ViewLoadingType = {
16
+ INITIAL_LOAD: "initial_load",
17
+ ROUTE_CHANGE: "route_change",
18
+ SESSION_RENEWAL: "session_renewal",
19
+ BF_CACHE: "bf_cache"
20
+ };
21
+ const ActionType = {
22
+ CLICK: "click",
23
+ CUSTOM: "custom",
24
+ TAP: "tap",
25
+ SCROLL: "scroll",
26
+ SWIPE: "swipe",
27
+ APPLICATION_START: "application_start",
28
+ BACK: "back"
29
+ };
30
+ const FrustrationType = {
31
+ RAGE_CLICK: "rage_click",
32
+ ERROR_CLICK: "error_click",
33
+ DEAD_CLICK: "dead_click"
34
+ };
35
+ const VitalType = {
36
+ DURATION: "duration",
37
+ OPERATION_STEP: "operation_step"
38
+ };
39
+ //#endregion
40
+ export { ActionType, FrustrationType, RumEventType, RumLongTaskEntryType, ViewLoadingType, VitalType };
41
+
42
+ //# sourceMappingURL=rawRumEvent.types.mjs.map