@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,161 @@
1
+ import { getParentNode, isElementNode, isTextNode } from "../browser/htmlDomUtils.mjs";
2
+ import { STABLE_ATTRIBUTES } from "./getSelectorFromElement.mjs";
3
+ import { FORM_PRIVATE_TAG_NAMES, NodePrivacyLevel, getPrivacySelector } from "./privacyConstants.mjs";
4
+ //#region src/domain/privacy.ts
5
+ /**
6
+ * Get node privacy level by iterating over its ancestors. When the direct parent privacy level is
7
+ * know, it is best to use something like:
8
+ *
9
+ * derivePrivacyLevelGivenParent(getNodeSelfPrivacyLevel(node), parentNodePrivacyLevel)
10
+ */
11
+ function getNodePrivacyLevel(node, defaultPrivacyLevel, cache) {
12
+ if (cache?.has(node)) return cache.get(node);
13
+ const parentNode = getParentNode(node);
14
+ const parentNodePrivacyLevel = parentNode ? getNodePrivacyLevel(parentNode, defaultPrivacyLevel, cache) : defaultPrivacyLevel;
15
+ const nodePrivacyLevel = reducePrivacyLevel(getNodeSelfPrivacyLevel(node), parentNodePrivacyLevel);
16
+ if (cache) cache.set(node, nodePrivacyLevel);
17
+ return nodePrivacyLevel;
18
+ }
19
+ /**
20
+ * Reduces the next privacy level based on self + parent privacy levels
21
+ */
22
+ function reducePrivacyLevel(childPrivacyLevel, parentNodePrivacyLevel) {
23
+ switch (parentNodePrivacyLevel) {
24
+ case NodePrivacyLevel.HIDDEN:
25
+ case NodePrivacyLevel.IGNORE: return parentNodePrivacyLevel;
26
+ }
27
+ switch (childPrivacyLevel) {
28
+ case NodePrivacyLevel.ALLOW:
29
+ case NodePrivacyLevel.MASK:
30
+ case NodePrivacyLevel.MASK_USER_INPUT:
31
+ case NodePrivacyLevel.MASK_UNLESS_ALLOWLISTED:
32
+ case NodePrivacyLevel.HIDDEN:
33
+ case NodePrivacyLevel.IGNORE: return childPrivacyLevel;
34
+ default: return parentNodePrivacyLevel;
35
+ }
36
+ }
37
+ /**
38
+ * Determines the node's own privacy level without checking for ancestors.
39
+ */
40
+ function getNodeSelfPrivacyLevel(node) {
41
+ if (!isElementNode(node)) return;
42
+ if (node.tagName === "BASE") return NodePrivacyLevel.ALLOW;
43
+ if (node.tagName === "INPUT") {
44
+ const inputElement = node;
45
+ if (inputElement.type === "password" || inputElement.type === "email" || inputElement.type === "tel") return NodePrivacyLevel.MASK;
46
+ if (inputElement.type === "hidden") return NodePrivacyLevel.MASK;
47
+ const autocomplete = inputElement.getAttribute("autocomplete");
48
+ if (autocomplete && (autocomplete.startsWith("cc-") || autocomplete.endsWith("-password"))) return NodePrivacyLevel.MASK;
49
+ }
50
+ if (node.matches(getPrivacySelector(NodePrivacyLevel.HIDDEN))) return NodePrivacyLevel.HIDDEN;
51
+ if (node.matches(getPrivacySelector(NodePrivacyLevel.MASK))) return NodePrivacyLevel.MASK;
52
+ if (node.matches(getPrivacySelector(NodePrivacyLevel.MASK_UNLESS_ALLOWLISTED))) return NodePrivacyLevel.MASK_UNLESS_ALLOWLISTED;
53
+ if (node.matches(getPrivacySelector(NodePrivacyLevel.MASK_USER_INPUT))) return NodePrivacyLevel.MASK_USER_INPUT;
54
+ if (node.matches(getPrivacySelector(NodePrivacyLevel.ALLOW))) return NodePrivacyLevel.ALLOW;
55
+ if (shouldIgnoreElement(node)) return NodePrivacyLevel.IGNORE;
56
+ }
57
+ /**
58
+ * Helper aiming to unify `mask` and `mask-user-input` privacy levels:
59
+ *
60
+ * In the `mask` case, it is trivial: we should mask the element.
61
+ *
62
+ * In the `mask-user-input` case, we should mask the element only if it is a "form" element or the
63
+ * direct parent is a form element for text nodes).
64
+ *
65
+ * Other `shouldMaskNode` cases are edge cases that should not matter too much (ex: should we mask a
66
+ * node if it is ignored or hidden? it doesn't matter since it won't be serialized).
67
+ */
68
+ function shouldMaskNode(node, privacyLevel) {
69
+ switch (privacyLevel) {
70
+ case NodePrivacyLevel.MASK:
71
+ case NodePrivacyLevel.HIDDEN:
72
+ case NodePrivacyLevel.IGNORE: return true;
73
+ case NodePrivacyLevel.MASK_UNLESS_ALLOWLISTED:
74
+ if (isTextNode(node)) return isFormElement(node.parentNode) ? true : !isAllowlisted(node.textContent || "");
75
+ return isFormElement(node);
76
+ case NodePrivacyLevel.MASK_USER_INPUT: return isTextNode(node) ? isFormElement(node.parentNode) : isFormElement(node);
77
+ default: return false;
78
+ }
79
+ }
80
+ function shouldMaskAttribute(tagName, attributeName, attributeValue, nodePrivacyLevel, configuration) {
81
+ if (nodePrivacyLevel !== NodePrivacyLevel.MASK && nodePrivacyLevel !== NodePrivacyLevel.MASK_UNLESS_ALLOWLISTED) return false;
82
+ if (attributeName === "data-kubesense-privacy" || STABLE_ATTRIBUTES.includes(attributeName) || attributeName === configuration.actionNameAttribute) return false;
83
+ switch (attributeName) {
84
+ case "title":
85
+ case "alt":
86
+ case "placeholder":
87
+ case "aria-label":
88
+ case "name": return true;
89
+ }
90
+ if (tagName === "A" && attributeName === "href") return true;
91
+ if (tagName === "IFRAME" && attributeName === "srcdoc") return true;
92
+ if (attributeValue && attributeName.startsWith("data-")) return true;
93
+ if ((tagName === "IMG" || tagName === "SOURCE") && (attributeName === "src" || attributeName === "srcset")) return true;
94
+ return false;
95
+ }
96
+ function isFormElement(node) {
97
+ if (!node || node.nodeType !== node.ELEMENT_NODE) return false;
98
+ const element = node;
99
+ if (element.tagName === "INPUT") switch (element.type) {
100
+ case "button":
101
+ case "color":
102
+ case "reset":
103
+ case "submit": return false;
104
+ }
105
+ return !!FORM_PRIVATE_TAG_NAMES[element.tagName];
106
+ }
107
+ /**
108
+ * Text censoring non-destructively maintains whitespace characters in order to preserve text shape
109
+ * during replay.
110
+ */
111
+ function censorText(text) {
112
+ return text.replace(/\S/g, "x");
113
+ }
114
+ function getTextContent(textNode, parentNodePrivacyLevel) {
115
+ const parentTagName = textNode.parentElement?.tagName;
116
+ let textContent = textNode.textContent || "";
117
+ const nodePrivacyLevel = parentNodePrivacyLevel;
118
+ if (parentTagName === "SCRIPT") textContent = "***";
119
+ else if (nodePrivacyLevel === NodePrivacyLevel.HIDDEN) textContent = "***";
120
+ else if (shouldMaskNode(textNode, nodePrivacyLevel)) {
121
+ if (parentTagName === "DATALIST" || parentTagName === "SELECT" || parentTagName === "OPTGROUP") {} else if (parentTagName === "OPTION") textContent = "***";
122
+ else textContent = censorText(textContent);
123
+ }
124
+ if (parentTagName === "HEAD" && !textContent.trim()) return "";
125
+ return textContent;
126
+ }
127
+ /**
128
+ * TODO: Preserve CSS element order, and record the presence of the tag, just don't render
129
+ * We don't need this logic on the recorder side.
130
+ * For security related meta's, customer can mask themmanually given they
131
+ * are easy to identify in the HEAD tag.
132
+ */
133
+ function shouldIgnoreElement(element) {
134
+ if (element.nodeName === "SCRIPT") return true;
135
+ if (element.nodeName === "LINK") {
136
+ const relAttribute = getLowerCaseAttribute("rel");
137
+ return /preload|prefetch/i.test(relAttribute) && getLowerCaseAttribute("as") === "script" || relAttribute === "shortcut icon" || relAttribute === "icon";
138
+ }
139
+ if (element.nodeName === "META") {
140
+ const nameAttribute = getLowerCaseAttribute("name");
141
+ const relAttribute = getLowerCaseAttribute("rel");
142
+ const propertyAttribute = getLowerCaseAttribute("property");
143
+ return /^msapplication-tile(image|color)$/.test(nameAttribute) || nameAttribute === "application-name" || relAttribute === "icon" || relAttribute === "apple-touch-icon" || relAttribute === "shortcut icon" || nameAttribute === "keywords" || nameAttribute === "description" || /^(og|twitter|fb):/.test(propertyAttribute) || /^(og|twitter):/.test(nameAttribute) || nameAttribute === "pinterest" || nameAttribute === "robots" || nameAttribute === "googlebot" || nameAttribute === "bingbot" || element.hasAttribute("http-equiv") || nameAttribute === "author" || nameAttribute === "generator" || nameAttribute === "framework" || nameAttribute === "publisher" || nameAttribute === "progid" || /^article:/.test(propertyAttribute) || /^product:/.test(propertyAttribute) || nameAttribute === "google-site-verification" || nameAttribute === "yandex-verification" || nameAttribute === "csrf-token" || nameAttribute === "p:domain_verify" || nameAttribute === "verify-v1" || nameAttribute === "verification" || nameAttribute === "shopify-checkout-api-token";
144
+ }
145
+ function getLowerCaseAttribute(name) {
146
+ return (element.getAttribute(name) || "").toLowerCase();
147
+ }
148
+ return false;
149
+ }
150
+ function isAllowlisted(text) {
151
+ if (!text?.trim()) return true;
152
+ return window.$KUBESENSE_ALLOW?.has(text.toLocaleLowerCase()) || false;
153
+ }
154
+ function maskDisallowedTextContent(text, fixedMask) {
155
+ if (isAllowlisted(text)) return text;
156
+ return fixedMask || censorText(text);
157
+ }
158
+ //#endregion
159
+ export { censorText, getNodePrivacyLevel, getNodeSelfPrivacyLevel, getTextContent, isAllowlisted, maskDisallowedTextContent, reducePrivacyLevel, shouldIgnoreElement, shouldMaskAttribute, shouldMaskNode };
160
+
161
+ //# sourceMappingURL=privacy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy.mjs","names":[],"sources":["../../src/domain/privacy.ts"],"sourcesContent":["import { isElementNode, getParentNode, isTextNode } from '../browser/htmlDomUtils'\nimport {\n NodePrivacyLevel,\n FORM_PRIVATE_TAG_NAMES,\n CENSORED_STRING_MARK,\n getPrivacySelector,\n TEXT_MASKING_CHAR,\n PRIVACY_ATTR_NAME,\n} from './privacyConstants'\nimport { STABLE_ATTRIBUTES } from './getSelectorFromElement'\nimport type { RumConfiguration } from './configuration'\n\nexport type NodePrivacyLevelCache = Map<Node, NodePrivacyLevel>\n\n/**\n * Get node privacy level by iterating over its ancestors. When the direct parent privacy level is\n * know, it is best to use something like:\n *\n * derivePrivacyLevelGivenParent(getNodeSelfPrivacyLevel(node), parentNodePrivacyLevel)\n */\nexport function getNodePrivacyLevel(\n node: Node,\n defaultPrivacyLevel: NodePrivacyLevel,\n cache?: NodePrivacyLevelCache\n): NodePrivacyLevel {\n if (cache?.has(node)) {\n return cache.get(node)!\n }\n const parentNode = getParentNode(node)\n const parentNodePrivacyLevel = parentNode\n ? getNodePrivacyLevel(parentNode, defaultPrivacyLevel, cache)\n : defaultPrivacyLevel\n const selfNodePrivacyLevel = getNodeSelfPrivacyLevel(node)\n const nodePrivacyLevel = reducePrivacyLevel(selfNodePrivacyLevel, parentNodePrivacyLevel)\n if (cache) {\n cache.set(node, nodePrivacyLevel)\n }\n return nodePrivacyLevel\n}\n\n/**\n * Reduces the next privacy level based on self + parent privacy levels\n */\nexport function reducePrivacyLevel(\n childPrivacyLevel: NodePrivacyLevel | undefined,\n parentNodePrivacyLevel: NodePrivacyLevel\n): NodePrivacyLevel {\n switch (parentNodePrivacyLevel) {\n // These values cannot be overridden\n case NodePrivacyLevel.HIDDEN:\n case NodePrivacyLevel.IGNORE:\n return parentNodePrivacyLevel\n }\n switch (childPrivacyLevel) {\n case NodePrivacyLevel.ALLOW:\n case NodePrivacyLevel.MASK:\n case NodePrivacyLevel.MASK_USER_INPUT:\n case NodePrivacyLevel.MASK_UNLESS_ALLOWLISTED:\n case NodePrivacyLevel.HIDDEN:\n case NodePrivacyLevel.IGNORE:\n return childPrivacyLevel\n default:\n return parentNodePrivacyLevel\n }\n}\n\n/**\n * Determines the node's own privacy level without checking for ancestors.\n */\nexport function getNodeSelfPrivacyLevel(node: Node): NodePrivacyLevel | undefined {\n // Only Element types can have a privacy level set\n if (!isElementNode(node)) {\n return\n }\n\n // Overrules for replay purpose\n if (node.tagName === 'BASE') {\n return NodePrivacyLevel.ALLOW\n }\n\n // Overrules to enforce end-user protection\n if (node.tagName === 'INPUT') {\n const inputElement = node as HTMLInputElement\n if (inputElement.type === 'password' || inputElement.type === 'email' || inputElement.type === 'tel') {\n return NodePrivacyLevel.MASK\n }\n if (inputElement.type === 'hidden') {\n return NodePrivacyLevel.MASK\n }\n const autocomplete = inputElement.getAttribute('autocomplete')\n // Handle input[autocomplete=cc-number/cc-csc/cc-exp/cc-exp-month/cc-exp-year/new-password/current-password]\n if (autocomplete && (autocomplete.startsWith('cc-') || autocomplete.endsWith('-password'))) {\n return NodePrivacyLevel.MASK\n }\n }\n\n // Check HTML privacy attributes and classes\n if (node.matches(getPrivacySelector(NodePrivacyLevel.HIDDEN))) {\n return NodePrivacyLevel.HIDDEN\n }\n\n if (node.matches(getPrivacySelector(NodePrivacyLevel.MASK))) {\n return NodePrivacyLevel.MASK\n }\n\n if (node.matches(getPrivacySelector(NodePrivacyLevel.MASK_UNLESS_ALLOWLISTED))) {\n return NodePrivacyLevel.MASK_UNLESS_ALLOWLISTED\n }\n\n if (node.matches(getPrivacySelector(NodePrivacyLevel.MASK_USER_INPUT))) {\n return NodePrivacyLevel.MASK_USER_INPUT\n }\n\n if (node.matches(getPrivacySelector(NodePrivacyLevel.ALLOW))) {\n return NodePrivacyLevel.ALLOW\n }\n\n if (shouldIgnoreElement(node)) {\n return NodePrivacyLevel.IGNORE\n }\n}\n\n/**\n * Helper aiming to unify `mask` and `mask-user-input` privacy levels:\n *\n * In the `mask` case, it is trivial: we should mask the element.\n *\n * In the `mask-user-input` case, we should mask the element only if it is a \"form\" element or the\n * direct parent is a form element for text nodes).\n *\n * Other `shouldMaskNode` cases are edge cases that should not matter too much (ex: should we mask a\n * node if it is ignored or hidden? it doesn't matter since it won't be serialized).\n */\nexport function shouldMaskNode(node: Node, privacyLevel: NodePrivacyLevel) {\n switch (privacyLevel) {\n case NodePrivacyLevel.MASK:\n case NodePrivacyLevel.HIDDEN:\n case NodePrivacyLevel.IGNORE:\n return true\n case NodePrivacyLevel.MASK_UNLESS_ALLOWLISTED:\n if (isTextNode(node)) {\n // Always return true if our parent is a form element, like MASK_USER_INPUT.\n // Otherwise, decide whether to mask based on the allowlist.\n return isFormElement(node.parentNode) ? true : !isAllowlisted(node.textContent || '')\n }\n // Always return true if we're a form element, like MASK_USER_INPUT.\n // Otherwise, return false; MASK_UNLESS_ALLOWLISTED only directly masks text nodes.\n return isFormElement(node)\n case NodePrivacyLevel.MASK_USER_INPUT:\n return isTextNode(node) ? isFormElement(node.parentNode) : isFormElement(node)\n default:\n return false\n }\n}\n\nexport function shouldMaskAttribute(\n tagName: string,\n attributeName: string,\n attributeValue: string | null,\n nodePrivacyLevel: NodePrivacyLevel,\n configuration: RumConfiguration\n) {\n if (nodePrivacyLevel !== NodePrivacyLevel.MASK && nodePrivacyLevel !== NodePrivacyLevel.MASK_UNLESS_ALLOWLISTED) {\n return false\n }\n if (\n attributeName === PRIVACY_ATTR_NAME ||\n STABLE_ATTRIBUTES.includes(attributeName) ||\n attributeName === configuration.actionNameAttribute\n ) {\n return false\n }\n\n switch (attributeName) {\n case 'title':\n case 'alt':\n case 'placeholder':\n case 'aria-label':\n case 'name':\n return true\n }\n if (tagName === 'A' && attributeName === 'href') {\n return true\n }\n if (tagName === 'IFRAME' && attributeName === 'srcdoc') {\n return true\n }\n if (attributeValue && attributeName.startsWith('data-')) {\n return true\n }\n if ((tagName === 'IMG' || tagName === 'SOURCE') && (attributeName === 'src' || attributeName === 'srcset')) {\n return true\n }\n\n return false\n}\n\nfunction isFormElement(node: Node | null): boolean {\n if (!node || node.nodeType !== node.ELEMENT_NODE) {\n return false\n }\n const element = node as HTMLInputElement\n if (element.tagName === 'INPUT') {\n switch (element.type) {\n case 'button':\n case 'color':\n case 'reset':\n case 'submit':\n return false\n }\n }\n return !!FORM_PRIVATE_TAG_NAMES[element.tagName]\n}\n\n/**\n * Text censoring non-destructively maintains whitespace characters in order to preserve text shape\n * during replay.\n */\nexport function censorText(text: string): string {\n return text.replace(/\\S/g, TEXT_MASKING_CHAR)\n}\n\nexport function getTextContent(textNode: Node, parentNodePrivacyLevel: NodePrivacyLevel): string {\n // The parent node may not be a html element which has a tagName attribute.\n // So just let it be undefined which is ok in this use case.\n const parentTagName = textNode.parentElement?.tagName\n let textContent = textNode.textContent || ''\n const nodePrivacyLevel = parentNodePrivacyLevel\n\n if (parentTagName === 'SCRIPT') {\n // For perf reasons, we don't record script (heuristic)\n textContent = CENSORED_STRING_MARK\n } else if (nodePrivacyLevel === NodePrivacyLevel.HIDDEN) {\n // Should never occur, but just in case, we set to CENSORED_MARK.\n textContent = CENSORED_STRING_MARK\n } else if (shouldMaskNode(textNode, nodePrivacyLevel)) {\n if (parentTagName === 'DATALIST' || parentTagName === 'SELECT' || parentTagName === 'OPTGROUP') {\n // Masking the child list breaks text nodes for DATALIST/SELECT/OPTGROUP.\n // TODO: Reinvestigate this.\n } else if (parentTagName === 'OPTION') {\n // <Option> has low entropy in charset + text length, so use `CENSORED_STRING_MARK` when masked\n textContent = CENSORED_STRING_MARK\n } else {\n textContent = censorText(textContent)\n }\n }\n\n const shouldCollapseWhiteSpace = parentTagName === 'HEAD'\n if (shouldCollapseWhiteSpace && !textContent.trim()) {\n return ''\n }\n\n return textContent\n}\n\n/**\n * TODO: Preserve CSS element order, and record the presence of the tag, just don't render\n * We don't need this logic on the recorder side.\n * For security related meta's, customer can mask themmanually given they\n * are easy to identify in the HEAD tag.\n */\nexport function shouldIgnoreElement(element: Element): boolean {\n if (element.nodeName === 'SCRIPT') {\n return true\n }\n\n if (element.nodeName === 'LINK') {\n const relAttribute = getLowerCaseAttribute('rel')\n return (\n // Link as script - Ignore only when rel=preload, modulepreload or prefetch\n (/preload|prefetch/i.test(relAttribute) && getLowerCaseAttribute('as') === 'script') ||\n // Favicons\n relAttribute === 'shortcut icon' ||\n relAttribute === 'icon'\n )\n }\n\n if (element.nodeName === 'META') {\n const nameAttribute = getLowerCaseAttribute('name')\n const relAttribute = getLowerCaseAttribute('rel')\n const propertyAttribute = getLowerCaseAttribute('property')\n return (\n // Favicons\n /^msapplication-tile(image|color)$/.test(nameAttribute) ||\n nameAttribute === 'application-name' ||\n relAttribute === 'icon' ||\n relAttribute === 'apple-touch-icon' ||\n relAttribute === 'shortcut icon' ||\n // Description\n nameAttribute === 'keywords' ||\n nameAttribute === 'description' ||\n // Social\n /^(og|twitter|fb):/.test(propertyAttribute) ||\n /^(og|twitter):/.test(nameAttribute) ||\n nameAttribute === 'pinterest' ||\n // Robots\n nameAttribute === 'robots' ||\n nameAttribute === 'googlebot' ||\n nameAttribute === 'bingbot' ||\n // Http headers. Ex: X-UA-Compatible, Content-Type, Content-Language, cache-control,\n // X-Translated-By\n element.hasAttribute('http-equiv') ||\n // Authorship\n nameAttribute === 'author' ||\n nameAttribute === 'generator' ||\n nameAttribute === 'framework' ||\n nameAttribute === 'publisher' ||\n nameAttribute === 'progid' ||\n /^article:/.test(propertyAttribute) ||\n /^product:/.test(propertyAttribute) ||\n // Verification\n nameAttribute === 'google-site-verification' ||\n nameAttribute === 'yandex-verification' ||\n nameAttribute === 'csrf-token' ||\n nameAttribute === 'p:domain_verify' ||\n nameAttribute === 'verify-v1' ||\n nameAttribute === 'verification' ||\n nameAttribute === 'shopify-checkout-api-token'\n )\n }\n\n function getLowerCaseAttribute(name: string) {\n return (element.getAttribute(name) || '').toLowerCase()\n }\n\n return false\n}\n\nexport interface BrowserWindow extends Window {\n $KUBESENSE_ALLOW?: Set<string>\n}\n\nexport function isAllowlisted(text: string): boolean {\n if (!text?.trim()) {\n return true\n }\n // We are using toLocaleLowerCase when adding to the allowlist to avoid case sensitivity\n // so we need to do the same here\n return (window as BrowserWindow).$KUBESENSE_ALLOW?.has(text.toLocaleLowerCase()) || false\n}\n\nexport function maskDisallowedTextContent(text: string, fixedMask?: string): string {\n if (isAllowlisted(text)) {\n return text\n }\n return fixedMask || censorText(text)\n}\n"],"mappings":";;;;;;;;;;AAoBA,SAAgB,oBACd,MACA,qBACA,OACkB;CAClB,IAAI,OAAO,IAAI,IAAI,GACjB,OAAO,MAAM,IAAI,IAAI;CAEvB,MAAM,aAAa,cAAc,IAAI;CACrC,MAAM,yBAAyB,aAC3B,oBAAoB,YAAY,qBAAqB,KAAK,IAC1D;CAEJ,MAAM,mBAAmB,mBADI,wBAAwB,IACU,GAAG,sBAAsB;CACxF,IAAI,OACF,MAAM,IAAI,MAAM,gBAAgB;CAElC,OAAO;AACT;;;;AAKA,SAAgB,mBACd,mBACA,wBACkB;CAClB,QAAQ,wBAAR;EAEE,KAAK,iBAAiB;EACtB,KAAK,iBAAiB,QACpB,OAAO;CACX;CACA,QAAQ,mBAAR;EACE,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB,QACpB,OAAO;EACT,SACE,OAAO;CACX;AACF;;;;AAKA,SAAgB,wBAAwB,MAA0C;CAEhF,IAAI,CAAC,cAAc,IAAI,GACrB;CAIF,IAAI,KAAK,YAAY,QACnB,OAAO,iBAAiB;CAI1B,IAAI,KAAK,YAAY,SAAS;EAC5B,MAAM,eAAe;EACrB,IAAI,aAAa,SAAS,cAAc,aAAa,SAAS,WAAW,aAAa,SAAS,OAC7F,OAAO,iBAAiB;EAE1B,IAAI,aAAa,SAAS,UACxB,OAAO,iBAAiB;EAE1B,MAAM,eAAe,aAAa,aAAa,cAAc;EAE7D,IAAI,iBAAiB,aAAa,WAAW,KAAK,KAAK,aAAa,SAAS,WAAW,IACtF,OAAO,iBAAiB;CAE5B;CAGA,IAAI,KAAK,QAAQ,mBAAmB,iBAAiB,MAAM,CAAC,GAC1D,OAAO,iBAAiB;CAG1B,IAAI,KAAK,QAAQ,mBAAmB,iBAAiB,IAAI,CAAC,GACxD,OAAO,iBAAiB;CAG1B,IAAI,KAAK,QAAQ,mBAAmB,iBAAiB,uBAAuB,CAAC,GAC3E,OAAO,iBAAiB;CAG1B,IAAI,KAAK,QAAQ,mBAAmB,iBAAiB,eAAe,CAAC,GACnE,OAAO,iBAAiB;CAG1B,IAAI,KAAK,QAAQ,mBAAmB,iBAAiB,KAAK,CAAC,GACzD,OAAO,iBAAiB;CAG1B,IAAI,oBAAoB,IAAI,GAC1B,OAAO,iBAAiB;AAE5B;;;;;;;;;;;;AAaA,SAAgB,eAAe,MAAY,cAAgC;CACzE,QAAQ,cAAR;EACE,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB,QACpB,OAAO;EACT,KAAK,iBAAiB;GACpB,IAAI,WAAW,IAAI,GAGjB,OAAO,cAAc,KAAK,UAAU,IAAI,OAAO,CAAC,cAAc,KAAK,eAAe,EAAE;GAItF,OAAO,cAAc,IAAI;EAC3B,KAAK,iBAAiB,iBACpB,OAAO,WAAW,IAAI,IAAI,cAAc,KAAK,UAAU,IAAI,cAAc,IAAI;EAC/E,SACE,OAAO;CACX;AACF;AAEA,SAAgB,oBACd,SACA,eACA,gBACA,kBACA,eACA;CACA,IAAI,qBAAqB,iBAAiB,QAAQ,qBAAqB,iBAAiB,yBACtF,OAAO;CAET,IACE,kBAAA,4BACA,kBAAkB,SAAS,aAAa,KACxC,kBAAkB,cAAc,qBAEhC,OAAO;CAGT,QAAQ,eAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,QACH,OAAO;CACX;CACA,IAAI,YAAY,OAAO,kBAAkB,QACvC,OAAO;CAET,IAAI,YAAY,YAAY,kBAAkB,UAC5C,OAAO;CAET,IAAI,kBAAkB,cAAc,WAAW,OAAO,GACpD,OAAO;CAET,KAAK,YAAY,SAAS,YAAY,cAAc,kBAAkB,SAAS,kBAAkB,WAC/F,OAAO;CAGT,OAAO;AACT;AAEA,SAAS,cAAc,MAA4B;CACjD,IAAI,CAAC,QAAQ,KAAK,aAAa,KAAK,cAClC,OAAO;CAET,MAAM,UAAU;CAChB,IAAI,QAAQ,YAAY,SACtB,QAAQ,QAAQ,MAAhB;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,UACH,OAAO;CACX;CAEF,OAAO,CAAC,CAAC,uBAAuB,QAAQ;AAC1C;;;;;AAMA,SAAgB,WAAW,MAAsB;CAC/C,OAAO,KAAK,QAAQ,OAAA,GAAwB;AAC9C;AAEA,SAAgB,eAAe,UAAgB,wBAAkD;CAG/F,MAAM,gBAAgB,SAAS,eAAe;CAC9C,IAAI,cAAc,SAAS,eAAe;CAC1C,MAAM,mBAAmB;CAEzB,IAAI,kBAAkB,UAEpB,cAAA;MACK,IAAI,qBAAqB,iBAAiB,QAE/C,cAAA;MACK,IAAI,eAAe,UAAU,gBAAgB,GAAG;EACrD,IAAI,kBAAkB,cAAc,kBAAkB,YAAY,kBAAkB,YAAY,CAGhG,OAAO,IAAI,kBAAkB,UAE3B,cAAA;OAEA,cAAc,WAAW,WAAW;CAExC;CAGA,IADiC,kBAAkB,UACnB,CAAC,YAAY,KAAK,GAChD,OAAO;CAGT,OAAO;AACT;;;;;;;AAQA,SAAgB,oBAAoB,SAA2B;CAC7D,IAAI,QAAQ,aAAa,UACvB,OAAO;CAGT,IAAI,QAAQ,aAAa,QAAQ;EAC/B,MAAM,eAAe,sBAAsB,KAAK;EAChD,OAEG,oBAAoB,KAAK,YAAY,KAAK,sBAAsB,IAAI,MAAM,YAE3E,iBAAiB,mBACjB,iBAAiB;CAErB;CAEA,IAAI,QAAQ,aAAa,QAAQ;EAC/B,MAAM,gBAAgB,sBAAsB,MAAM;EAClD,MAAM,eAAe,sBAAsB,KAAK;EAChD,MAAM,oBAAoB,sBAAsB,UAAU;EAC1D,OAEE,oCAAoC,KAAK,aAAa,KACtD,kBAAkB,sBAClB,iBAAiB,UACjB,iBAAiB,sBACjB,iBAAiB,mBAEjB,kBAAkB,cAClB,kBAAkB,iBAElB,oBAAoB,KAAK,iBAAiB,KAC1C,iBAAiB,KAAK,aAAa,KACnC,kBAAkB,eAElB,kBAAkB,YAClB,kBAAkB,eAClB,kBAAkB,aAGlB,QAAQ,aAAa,YAAY,KAEjC,kBAAkB,YAClB,kBAAkB,eAClB,kBAAkB,eAClB,kBAAkB,eAClB,kBAAkB,YAClB,YAAY,KAAK,iBAAiB,KAClC,YAAY,KAAK,iBAAiB,KAElC,kBAAkB,8BAClB,kBAAkB,yBAClB,kBAAkB,gBAClB,kBAAkB,qBAClB,kBAAkB,eAClB,kBAAkB,kBAClB,kBAAkB;CAEtB;CAEA,SAAS,sBAAsB,MAAc;EAC3C,QAAQ,QAAQ,aAAa,IAAI,KAAK,GAAA,CAAI,YAAY;CACxD;CAEA,OAAO;AACT;AAMA,SAAgB,cAAc,MAAuB;CACnD,IAAI,CAAC,MAAM,KAAK,GACd,OAAO;CAIT,OAAQ,OAAyB,kBAAkB,IAAI,KAAK,kBAAkB,CAAC,KAAK;AACtF;AAEA,SAAgB,0BAA0B,MAAc,WAA4B;CAClF,IAAI,cAAc,IAAI,GACpB,OAAO;CAET,OAAO,aAAa,WAAW,IAAI;AACrC"}
@@ -0,0 +1,36 @@
1
+ import { DefaultPrivacyLevel } from "@kubesense/kubesense-browser-core";
2
+ //#region src/domain/privacyConstants.ts
3
+ const NodePrivacyLevel = {
4
+ IGNORE: "ignore",
5
+ HIDDEN: "hidden",
6
+ ALLOW: DefaultPrivacyLevel.ALLOW,
7
+ MASK: DefaultPrivacyLevel.MASK,
8
+ MASK_USER_INPUT: DefaultPrivacyLevel.MASK_USER_INPUT,
9
+ MASK_UNLESS_ALLOWLISTED: DefaultPrivacyLevel.MASK_UNLESS_ALLOWLISTED
10
+ };
11
+ const PRIVACY_ATTR_NAME = "data-kubesense-privacy";
12
+ const PRIVACY_ATTR_VALUE_ALLOW = "allow";
13
+ const PRIVACY_ATTR_VALUE_MASK = "mask";
14
+ const PRIVACY_ATTR_VALUE_MASK_USER_INPUT = "mask-user-input";
15
+ const PRIVACY_ATTR_VALUE_MASK_UNLESS_ALLOWLISTED = "mask-unless-allowlisted";
16
+ const PRIVACY_ATTR_VALUE_HIDDEN = "hidden";
17
+ const PRIVACY_CLASS_PREFIX = "kubesense-privacy-";
18
+ const CENSORED_STRING_MARK = "***";
19
+ const CENSORED_IMG_MARK = "data:image/gif;base64,R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==";
20
+ const FORM_PRIVATE_TAG_NAMES = {
21
+ INPUT: true,
22
+ OUTPUT: true,
23
+ TEXTAREA: true,
24
+ SELECT: true,
25
+ OPTION: true,
26
+ DATALIST: true,
27
+ OPTGROUP: true
28
+ };
29
+ const TEXT_MASKING_CHAR = "x";
30
+ function getPrivacySelector(privacyLevel) {
31
+ return `[${PRIVACY_ATTR_NAME}="${privacyLevel}"], .${PRIVACY_CLASS_PREFIX}${privacyLevel}`;
32
+ }
33
+ //#endregion
34
+ export { 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 };
35
+
36
+ //# sourceMappingURL=privacyConstants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacyConstants.mjs","names":[],"sources":["../../src/domain/privacyConstants.ts"],"sourcesContent":["import { DefaultPrivacyLevel } from '@kubesense/kubesense-browser-core'\n\nexport const NodePrivacyLevel = {\n IGNORE: 'ignore',\n HIDDEN: 'hidden',\n ALLOW: DefaultPrivacyLevel.ALLOW,\n MASK: DefaultPrivacyLevel.MASK,\n MASK_USER_INPUT: DefaultPrivacyLevel.MASK_USER_INPUT,\n MASK_UNLESS_ALLOWLISTED: DefaultPrivacyLevel.MASK_UNLESS_ALLOWLISTED,\n} as const\nexport type NodePrivacyLevel = (typeof NodePrivacyLevel)[keyof typeof NodePrivacyLevel]\n\nexport const PRIVACY_ATTR_NAME = 'data-kubesense-privacy'\n\n// Privacy Attrs\nexport const PRIVACY_ATTR_VALUE_ALLOW = 'allow'\nexport const PRIVACY_ATTR_VALUE_MASK = 'mask'\nexport const PRIVACY_ATTR_VALUE_MASK_USER_INPUT = 'mask-user-input'\nexport const PRIVACY_ATTR_VALUE_MASK_UNLESS_ALLOWLISTED = 'mask-unless-allowlisted'\nexport const PRIVACY_ATTR_VALUE_HIDDEN = 'hidden'\n\n// Privacy Classes - not all customers can set plain HTML attributes, so support classes too\nexport const PRIVACY_CLASS_PREFIX = 'kubesense-privacy-'\n\n// Private Replacement Templates\nexport const CENSORED_STRING_MARK = '***'\nexport const CENSORED_IMG_MARK = 'data:image/gif;base64,R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw=='\n\nexport const FORM_PRIVATE_TAG_NAMES: { [tagName: string]: true } = {\n INPUT: true,\n OUTPUT: true,\n TEXTAREA: true,\n SELECT: true,\n OPTION: true,\n DATALIST: true,\n OPTGROUP: true,\n}\n\nexport const TEXT_MASKING_CHAR = 'x'\n\nexport function getPrivacySelector(privacyLevel: string) {\n return `[${PRIVACY_ATTR_NAME}=\"${privacyLevel}\"], .${PRIVACY_CLASS_PREFIX}${privacyLevel}`\n}\n"],"mappings":";;AAEA,MAAa,mBAAmB;CAC9B,QAAQ;CACR,QAAQ;CACR,OAAO,oBAAoB;CAC3B,MAAM,oBAAoB;CAC1B,iBAAiB,oBAAoB;CACrC,yBAAyB,oBAAoB;AAC/C;AAGA,MAAa,oBAAoB;AAGjC,MAAa,2BAA2B;AACxC,MAAa,0BAA0B;AACvC,MAAa,qCAAqC;AAClD,MAAa,6CAA6C;AAC1D,MAAa,4BAA4B;AAGzC,MAAa,uBAAuB;AAGpC,MAAa,uBAAuB;AACpC,MAAa,oBAAoB;AAEjC,MAAa,yBAAsD;CACjE,OAAO;CACP,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,UAAU;AACZ;AAEA,MAAa,oBAAoB;AAEjC,SAAgB,mBAAmB,cAAsB;CACvD,OAAO,IAAI,kBAAkB,IAAI,aAAa,OAAO,uBAAuB;AAC9E"}
@@ -0,0 +1,86 @@
1
+ import "./lifeCycle.mjs";
2
+ import { isAllowedRequestUrl } from "./resource/resourceUtils.mjs";
3
+ import { startTracer } from "./tracing/tracer.mjs";
4
+ import { findGraphQlConfiguration } from "./resource/graphql.mjs";
5
+ import { elapsed, timeStampNow } from "@kubesense/kubesense-js-core/time";
6
+ import { BufferedDataType, RequestType, ResponseBodyAction, initFetchObservable, initXhrObservable } from "@kubesense/kubesense-browser-core";
7
+ //#region src/domain/requestCollection.ts
8
+ let nextRequestIndex = 1;
9
+ function startRequestCollection(lifeCycle, configuration, sessionManager, userContext, accountContext, bufferedDataObservable) {
10
+ const tracer = startTracer(configuration, sessionManager, userContext, accountContext);
11
+ trackXhr(lifeCycle, tracer, bufferedDataObservable);
12
+ trackFetch(lifeCycle, configuration, tracer, bufferedDataObservable);
13
+ }
14
+ function trackXhr(lifeCycle, tracer, bufferedDataObservable) {
15
+ const subscriptions = [];
16
+ subscriptions.push(initXhrObservable().subscribe((context) => {
17
+ if (context.state === "start" && isAllowedRequestUrl(context.url)) {
18
+ tracer.traceXhr(context, context.xhr);
19
+ assignRequestIndex(context);
20
+ }
21
+ }));
22
+ subscriptions.push(bufferedDataObservable.subscribe(({ data, type }) => {
23
+ if (type !== BufferedDataType.XHR) return;
24
+ const context = data;
25
+ if (!isAllowedRequestUrl(context.url)) return;
26
+ switch (context.state) {
27
+ case "start":
28
+ assignRequestIndex(context);
29
+ lifeCycle.notify(7, {
30
+ requestIndex: context.requestIndex,
31
+ url: context.url
32
+ });
33
+ break;
34
+ case "complete":
35
+ tracer.clearTracingIfNeeded(context);
36
+ lifeCycle.notify(8, {
37
+ ...context,
38
+ type: RequestType.XHR,
39
+ isAbortedOnStart: false
40
+ });
41
+ }
42
+ }));
43
+ return { stop: () => subscriptions.forEach((subscription) => subscription.unsubscribe()) };
44
+ }
45
+ function trackFetch(lifeCycle, configuration, tracer, bufferedDataObservable) {
46
+ const subscriptions = [];
47
+ subscriptions.push(initFetchObservable({ responseBodyAction: (context) => {
48
+ if (findGraphQlConfiguration(context.url, configuration)?.trackResponseErrors) return ResponseBodyAction.COLLECT;
49
+ return ResponseBodyAction.IGNORE;
50
+ } }).subscribe((context) => {
51
+ if (context.state === "start" && isAllowedRequestUrl(context.url)) {
52
+ tracer.traceFetch(context);
53
+ assignRequestIndex(context);
54
+ }
55
+ }));
56
+ subscriptions.push(bufferedDataObservable.subscribe(({ data, type }) => {
57
+ if (type !== BufferedDataType.FETCH) return;
58
+ const context = data;
59
+ if (!isAllowedRequestUrl(context.url)) return;
60
+ switch (context.state) {
61
+ case "start":
62
+ assignRequestIndex(context);
63
+ lifeCycle.notify(7, {
64
+ requestIndex: context.requestIndex,
65
+ url: context.url
66
+ });
67
+ break;
68
+ case "resolve":
69
+ tracer.clearTracingIfNeeded(context);
70
+ lifeCycle.notify(8, {
71
+ ...context,
72
+ duration: elapsed(context.startClocks.timeStamp, timeStampNow()),
73
+ type: RequestType.FETCH,
74
+ requestBody: context.init?.body
75
+ });
76
+ }
77
+ }));
78
+ return { stop: () => subscriptions.forEach((subscription) => subscription.unsubscribe()) };
79
+ }
80
+ function assignRequestIndex(context) {
81
+ if (!context.requestIndex) context.requestIndex = nextRequestIndex++;
82
+ }
83
+ //#endregion
84
+ export { startRequestCollection, trackFetch, trackXhr };
85
+
86
+ //# sourceMappingURL=requestCollection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestCollection.mjs","names":[],"sources":["../../src/domain/requestCollection.ts"],"sourcesContent":["import { elapsed, timeStampNow } from '@kubesense/kubesense-js-core/time'\nimport type { Duration, ClocksState } from '@kubesense/kubesense-js-core/time'\nimport type {\n XhrCompleteContext,\n XhrStartContext,\n FetchStartContext,\n FetchResolveContext,\n ContextManager,\n SessionManager,\n Observable,\n BufferedData,\n Subscription,\n} from '@kubesense/kubesense-browser-core'\nimport {\n RequestType,\n ResponseBodyAction,\n BufferedDataType,\n initFetchObservable,\n initXhrObservable,\n} from '@kubesense/kubesense-browser-core'\nimport type { RumConfiguration } from './configuration'\nimport type { LifeCycle } from './lifeCycle'\nimport { LifeCycleEventType } from './lifeCycle'\nimport { isAllowedRequestUrl } from './resource/resourceUtils'\nimport type { Tracer } from './tracing/tracer'\nimport { startTracer } from './tracing/tracer'\nimport type { SpanIdentifier, TraceIdentifier } from './tracing/identifier'\nimport { findGraphQlConfiguration } from './resource/graphql'\n\nexport interface CustomContext {\n requestIndex: number\n spanId?: SpanIdentifier\n traceId?: TraceIdentifier\n traceSampled?: boolean\n}\nexport interface RumFetchStartContext extends FetchStartContext, CustomContext {}\nexport interface RumFetchResolveContext extends FetchResolveContext, CustomContext {}\nexport interface RumXhrStartContext extends XhrStartContext, CustomContext {}\nexport interface RumXhrCompleteContext extends XhrCompleteContext, CustomContext {}\n\nexport interface RequestStartEvent {\n requestIndex: number\n url: string\n}\nexport interface RequestCompleteEvent {\n requestIndex: number\n type: RequestType\n method: string\n url: string\n status: number\n responseType?: string\n startClocks: ClocksState\n duration: Duration\n spanId?: SpanIdentifier\n traceId?: TraceIdentifier\n traceSampled?: boolean\n xhr?: XMLHttpRequest\n response?: Response\n input?: unknown\n init?: RequestInit\n error?: Error\n isAborted: boolean\n isAbortedOnStart: boolean\n handlingStack?: string\n requestBody?: unknown\n responseBody?: string\n}\n\nlet nextRequestIndex = 1\n\nexport function startRequestCollection(\n lifeCycle: LifeCycle,\n configuration: RumConfiguration,\n sessionManager: SessionManager,\n userContext: ContextManager,\n accountContext: ContextManager,\n bufferedDataObservable: Observable<BufferedData>\n) {\n const tracer = startTracer(configuration, sessionManager, userContext, accountContext)\n trackXhr(lifeCycle, tracer, bufferedDataObservable)\n trackFetch(lifeCycle, configuration, tracer, bufferedDataObservable)\n}\n\nexport function trackXhr(lifeCycle: LifeCycle, tracer: Tracer, bufferedDataObservable: Observable<BufferedData>) {\n const subscriptions: Subscription[] = []\n\n subscriptions.push(\n initXhrObservable().subscribe((context) => {\n if (context.state === 'start' && isAllowedRequestUrl(context.url)) {\n tracer.traceXhr(context, context.xhr)\n assignRequestIndex(context as RumXhrStartContext)\n }\n })\n )\n\n subscriptions.push(\n bufferedDataObservable.subscribe(({ data, type }) => {\n if (type !== BufferedDataType.XHR) {\n return\n }\n const context = data as RumXhrStartContext | RumXhrCompleteContext\n if (!isAllowedRequestUrl(context.url)) {\n return\n }\n\n switch (context.state) {\n case 'start':\n assignRequestIndex(context)\n lifeCycle.notify(LifeCycleEventType.REQUEST_STARTED, {\n requestIndex: context.requestIndex,\n url: context.url,\n })\n break\n case 'complete':\n tracer.clearTracingIfNeeded(context)\n lifeCycle.notify(LifeCycleEventType.REQUEST_COMPLETED, {\n ...context,\n type: RequestType.XHR,\n isAbortedOnStart: false,\n })\n break\n }\n })\n )\n\n return { stop: () => subscriptions.forEach((subscription) => subscription.unsubscribe()) }\n}\n\nexport function trackFetch(\n lifeCycle: LifeCycle,\n configuration: RumConfiguration,\n tracer: Tracer,\n bufferedDataObservable: Observable<BufferedData>\n) {\n const subscriptions: Subscription[] = []\n\n subscriptions.push(\n initFetchObservable({\n responseBodyAction: (context) => {\n if (findGraphQlConfiguration(context.url, configuration)?.trackResponseErrors) {\n return ResponseBodyAction.COLLECT\n }\n return ResponseBodyAction.IGNORE\n },\n }).subscribe((context) => {\n if (context.state === 'start' && isAllowedRequestUrl(context.url)) {\n tracer.traceFetch(context)\n assignRequestIndex(context as RumFetchStartContext)\n }\n })\n )\n\n subscriptions.push(\n bufferedDataObservable.subscribe(({ data, type }) => {\n if (type !== BufferedDataType.FETCH) {\n return\n }\n const context = data as RumFetchResolveContext | RumFetchStartContext\n if (!isAllowedRequestUrl(context.url)) {\n return\n }\n\n switch (context.state) {\n case 'start':\n assignRequestIndex(context)\n lifeCycle.notify(LifeCycleEventType.REQUEST_STARTED, {\n requestIndex: context.requestIndex,\n url: context.url,\n })\n break\n case 'resolve':\n tracer.clearTracingIfNeeded(context)\n lifeCycle.notify(LifeCycleEventType.REQUEST_COMPLETED, {\n ...context,\n duration: elapsed(context.startClocks.timeStamp, timeStampNow()),\n type: RequestType.FETCH,\n requestBody: context.init?.body,\n })\n break\n }\n })\n )\n return { stop: () => subscriptions.forEach((subscription) => subscription.unsubscribe()) }\n}\n\nfunction assignRequestIndex(context: CustomContext) {\n if (!context.requestIndex) {\n context.requestIndex = nextRequestIndex++\n }\n}\n"],"mappings":";;;;;;;AAoEA,IAAI,mBAAmB;AAEvB,SAAgB,uBACd,WACA,eACA,gBACA,aACA,gBACA,wBACA;CACA,MAAM,SAAS,YAAY,eAAe,gBAAgB,aAAa,cAAc;CACrF,SAAS,WAAW,QAAQ,sBAAsB;CAClD,WAAW,WAAW,eAAe,QAAQ,sBAAsB;AACrE;AAEA,SAAgB,SAAS,WAAsB,QAAgB,wBAAkD;CAC/G,MAAM,gBAAgC,CAAC;CAEvC,cAAc,KACZ,kBAAkB,CAAC,CAAC,WAAW,YAAY;EACzC,IAAI,QAAQ,UAAU,WAAW,oBAAoB,QAAQ,GAAG,GAAG;GACjE,OAAO,SAAS,SAAS,QAAQ,GAAG;GACpC,mBAAmB,OAA6B;EAClD;CACF,CAAC,CACH;CAEA,cAAc,KACZ,uBAAuB,WAAW,EAAE,MAAM,WAAW;EACnD,IAAI,SAAS,iBAAiB,KAC5B;EAEF,MAAM,UAAU;EAChB,IAAI,CAAC,oBAAoB,QAAQ,GAAG,GAClC;EAGF,QAAQ,QAAQ,OAAhB;GACE,KAAK;IACH,mBAAmB,OAAO;IAC1B,UAAU,OAAA,GAA2C;KACnD,cAAc,QAAQ;KACtB,KAAK,QAAQ;IACf,CAAC;IACD;GACF,KAAK;IACH,OAAO,qBAAqB,OAAO;IACnC,UAAU,OAAA,GAA6C;KACrD,GAAG;KACH,MAAM,YAAY;KAClB,kBAAkB;IACpB,CAAC;EAEL;CACF,CAAC,CACH;CAEA,OAAO,EAAE,YAAY,cAAc,SAAS,iBAAiB,aAAa,YAAY,CAAC,EAAE;AAC3F;AAEA,SAAgB,WACd,WACA,eACA,QACA,wBACA;CACA,MAAM,gBAAgC,CAAC;CAEvC,cAAc,KACZ,oBAAoB,EAClB,qBAAqB,YAAY;EAC/B,IAAI,yBAAyB,QAAQ,KAAK,aAAa,CAAC,EAAE,qBACxD,OAAO,mBAAmB;EAE5B,OAAO,mBAAmB;CAC5B,EACF,CAAC,CAAC,CAAC,WAAW,YAAY;EACxB,IAAI,QAAQ,UAAU,WAAW,oBAAoB,QAAQ,GAAG,GAAG;GACjE,OAAO,WAAW,OAAO;GACzB,mBAAmB,OAA+B;EACpD;CACF,CAAC,CACH;CAEA,cAAc,KACZ,uBAAuB,WAAW,EAAE,MAAM,WAAW;EACnD,IAAI,SAAS,iBAAiB,OAC5B;EAEF,MAAM,UAAU;EAChB,IAAI,CAAC,oBAAoB,QAAQ,GAAG,GAClC;EAGF,QAAQ,QAAQ,OAAhB;GACE,KAAK;IACH,mBAAmB,OAAO;IAC1B,UAAU,OAAA,GAA2C;KACnD,cAAc,QAAQ;KACtB,KAAK,QAAQ;IACf,CAAC;IACD;GACF,KAAK;IACH,OAAO,qBAAqB,OAAO;IACnC,UAAU,OAAA,GAA6C;KACrD,GAAG;KACH,UAAU,QAAQ,QAAQ,YAAY,WAAW,aAAa,CAAC;KAC/D,MAAM,YAAY;KAClB,aAAa,QAAQ,MAAM;IAC7B,CAAC;EAEL;CACF,CAAC,CACH;CACA,OAAO,EAAE,YAAY,cAAc,SAAS,iBAAiB,aAAa,YAAY,CAAC,EAAE;AAC3F;AAEA,SAAS,mBAAmB,SAAwB;CAClD,IAAI,CAAC,QAAQ,cACX,QAAQ,eAAe;AAE3B"}
@@ -0,0 +1,93 @@
1
+ import { buildUrl } from "@kubesense/kubesense-js-core/util";
2
+ import { ONE_KIBI_BYTE, isNonEmptyArray, matchList, safeTruncate, tryJsonParse } from "@kubesense/kubesense-browser-core";
3
+ //#region src/domain/resource/graphql.ts
4
+ /**
5
+ * arbitrary value, byte precision not needed
6
+ */
7
+ const GRAPHQL_PAYLOAD_LIMIT = 32 * ONE_KIBI_BYTE;
8
+ function extractGraphQlMetadata(request, graphQlConfig) {
9
+ const metadata = extractGraphQlRequestMetadata(request, graphQlConfig.trackPayload);
10
+ if (!metadata) return;
11
+ if (graphQlConfig.trackResponseErrors && request.responseBody) {
12
+ const responseErrors = parseGraphQlResponse(request.responseBody);
13
+ if (responseErrors) {
14
+ metadata.error_count = responseErrors.length;
15
+ metadata.errors = responseErrors;
16
+ }
17
+ }
18
+ return metadata;
19
+ }
20
+ function parseGraphQlResponse(responseText) {
21
+ const response = tryJsonParse(responseText);
22
+ if (!response || typeof response !== "object") return;
23
+ const responseObj = response;
24
+ if (!isNonEmptyArray(responseObj.errors)) return;
25
+ return responseObj.errors.map((error) => {
26
+ return {
27
+ message: error.message,
28
+ path: error.path,
29
+ locations: error.locations,
30
+ code: error.extensions?.code
31
+ };
32
+ });
33
+ }
34
+ function findGraphQlConfiguration(url, configuration) {
35
+ return configuration.allowedGraphQlUrls.find((graphQlOption) => matchList([graphQlOption.match], url));
36
+ }
37
+ function extractGraphQlRequestMetadata(request, trackPayload = false) {
38
+ let rawMetadata;
39
+ if (request.method === "POST") rawMetadata = extractFromBody(request.requestBody);
40
+ else if (request.method === "GET") rawMetadata = extractFromUrlQueryParams(request.url);
41
+ if (!rawMetadata) return;
42
+ return sanitizeGraphQlMetadata(rawMetadata, trackPayload);
43
+ }
44
+ function extractFromBody(requestBody) {
45
+ if (!requestBody || typeof requestBody !== "string") return;
46
+ const graphqlBody = tryJsonParse(requestBody);
47
+ if (!graphqlBody) return;
48
+ return {
49
+ query: graphqlBody.query,
50
+ operationName: graphqlBody.operationName,
51
+ variables: graphqlBody.variables ? JSON.stringify(graphqlBody.variables) : void 0,
52
+ operationType: graphqlBody.operationType
53
+ };
54
+ }
55
+ function extractFromUrlQueryParams(url) {
56
+ const searchParams = buildUrl(url).searchParams;
57
+ const variablesParam = searchParams.get("variables");
58
+ const variables = variablesParam && tryJsonParse(variablesParam) !== void 0 ? variablesParam : void 0;
59
+ return {
60
+ query: searchParams.get("query") || void 0,
61
+ operationName: searchParams.get("operationName") || void 0,
62
+ variables,
63
+ operationType: searchParams.get("operationType") || void 0
64
+ };
65
+ }
66
+ function sanitizeGraphQlMetadata(rawMetadata, trackPayload) {
67
+ let operationType;
68
+ let payload;
69
+ let variables;
70
+ if (rawMetadata.query) {
71
+ const trimmedQuery = rawMetadata.query.trim();
72
+ operationType = getOperationType(trimmedQuery);
73
+ if (trackPayload) payload = safeTruncate(trimmedQuery, GRAPHQL_PAYLOAD_LIMIT, "...");
74
+ }
75
+ if (!operationType) {
76
+ const bodyType = rawMetadata.operationType;
77
+ if (bodyType === "query" || bodyType === "mutation" || bodyType === "subscription") operationType = bodyType;
78
+ }
79
+ if (rawMetadata.variables) variables = rawMetadata.variables;
80
+ return {
81
+ operationType,
82
+ operationName: rawMetadata.operationName,
83
+ variables,
84
+ payload
85
+ };
86
+ }
87
+ function getOperationType(query) {
88
+ return query.match(/^\s*(query|mutation|subscription)\b/i)?.[1];
89
+ }
90
+ //#endregion
91
+ export { extractGraphQlMetadata, extractGraphQlRequestMetadata, findGraphQlConfiguration, parseGraphQlResponse };
92
+
93
+ //# sourceMappingURL=graphql.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.mjs","names":[],"sources":["../../../src/domain/resource/graphql.ts"],"sourcesContent":["import {\n isNonEmptyArray,\n matchList,\n ONE_KIBI_BYTE,\n safeTruncate,\n tryJsonParse,\n} from '@kubesense/kubesense-browser-core'\nimport { buildUrl } from '@kubesense/kubesense-js-core/util'\nimport type { RumConfiguration, GraphQlUrlOption } from '../configuration'\nimport type { RequestCompleteEvent } from '../requestCollection'\n\n/**\n * arbitrary value, byte precision not needed\n */\nconst GRAPHQL_PAYLOAD_LIMIT = 32 * ONE_KIBI_BYTE\n\ninterface RawGraphQlMetadata {\n query?: string\n operationName?: string\n variables?: string\n operationType?: string\n}\n\nexport interface GraphQlError {\n message: string\n code?: string\n locations?: Array<{ line: number; column: number }>\n path?: Array<string | number>\n}\n\nexport interface GraphQlMetadata {\n operationType?: 'query' | 'mutation' | 'subscription'\n operationName?: string\n variables?: string\n payload?: string\n error_count?: number\n errors?: GraphQlError[]\n}\n\nexport function extractGraphQlMetadata(\n request: RequestCompleteEvent,\n graphQlConfig: GraphQlUrlOption\n): GraphQlMetadata | undefined {\n const metadata = extractGraphQlRequestMetadata(request, graphQlConfig.trackPayload)\n if (!metadata) {\n return\n }\n\n if (graphQlConfig.trackResponseErrors && request.responseBody) {\n const responseErrors = parseGraphQlResponse(request.responseBody)\n if (responseErrors) {\n metadata.error_count = responseErrors.length\n metadata.errors = responseErrors\n }\n }\n\n return metadata\n}\n\nexport function parseGraphQlResponse(responseText: string): GraphQlError[] | undefined {\n const response = tryJsonParse(responseText)\n\n if (!response || typeof response !== 'object') {\n return\n }\n\n const responseObj = response as Record<string, unknown>\n\n if (!isNonEmptyArray(responseObj.errors)) {\n return\n }\n\n const errors = (responseObj.errors as Array<Record<string, unknown>>).map((error) => {\n const graphqlError: GraphQlError = {\n message: error.message as string,\n path: error.path as Array<string | number>,\n locations: error.locations as Array<{ line: number; column: number }>,\n code: (error.extensions as Record<string, unknown> | undefined)?.code as string,\n }\n\n return graphqlError\n })\n\n return errors\n}\n\nexport function findGraphQlConfiguration(url: string, configuration: RumConfiguration): GraphQlUrlOption | undefined {\n return configuration.allowedGraphQlUrls.find((graphQlOption) => matchList([graphQlOption.match], url))\n}\n\nexport function extractGraphQlRequestMetadata(\n request: Pick<RequestCompleteEvent, 'method' | 'url' | 'requestBody'>,\n trackPayload: boolean = false\n): GraphQlMetadata | undefined {\n let rawMetadata: RawGraphQlMetadata | undefined\n\n if (request.method === 'POST') {\n rawMetadata = extractFromBody(request.requestBody)\n } else if (request.method === 'GET') {\n rawMetadata = extractFromUrlQueryParams(request.url)\n }\n\n if (!rawMetadata) {\n return\n }\n\n return sanitizeGraphQlMetadata(rawMetadata, trackPayload)\n}\n\nfunction extractFromBody(requestBody: unknown): RawGraphQlMetadata | undefined {\n if (!requestBody || typeof requestBody !== 'string') {\n return\n }\n\n const graphqlBody = tryJsonParse<{\n query?: string\n operationName?: string\n variables?: unknown\n operationType?: string\n }>(requestBody)\n\n if (!graphqlBody) {\n return\n }\n\n return {\n query: graphqlBody.query,\n operationName: graphqlBody.operationName,\n variables: graphqlBody.variables ? JSON.stringify(graphqlBody.variables) : undefined,\n operationType: graphqlBody.operationType,\n }\n}\n\nfunction extractFromUrlQueryParams(url: string): RawGraphQlMetadata {\n const searchParams = buildUrl(url).searchParams\n const variablesParam = searchParams.get('variables')\n const variables = variablesParam && tryJsonParse(variablesParam) !== undefined ? variablesParam : undefined\n\n return {\n query: searchParams.get('query') || undefined,\n operationName: searchParams.get('operationName') || undefined,\n variables,\n operationType: searchParams.get('operationType') || undefined,\n }\n}\n\nfunction sanitizeGraphQlMetadata(rawMetadata: RawGraphQlMetadata, trackPayload: boolean): GraphQlMetadata {\n let operationType: 'query' | 'mutation' | 'subscription' | undefined\n let payload: string | undefined\n let variables: string | undefined\n\n if (rawMetadata.query) {\n const trimmedQuery = rawMetadata.query.trim()\n operationType = getOperationType(trimmedQuery)\n if (trackPayload) {\n payload = safeTruncate(trimmedQuery, GRAPHQL_PAYLOAD_LIMIT, '...')\n }\n }\n\n if (!operationType) {\n const bodyType = rawMetadata.operationType\n if (bodyType === 'query' || bodyType === 'mutation' || bodyType === 'subscription') {\n operationType = bodyType\n }\n }\n\n if (rawMetadata.variables) {\n variables = rawMetadata.variables\n }\n\n return {\n operationType,\n operationName: rawMetadata.operationName,\n variables,\n payload,\n }\n}\n\nfunction getOperationType(query: string) {\n return query.match(/^\\s*(query|mutation|subscription)\\b/i)?.[1] as 'query' | 'mutation' | 'subscription' | undefined\n}\n"],"mappings":";;;;;;AAcA,MAAM,wBAAwB,KAAK;AAyBnC,SAAgB,uBACd,SACA,eAC6B;CAC7B,MAAM,WAAW,8BAA8B,SAAS,cAAc,YAAY;CAClF,IAAI,CAAC,UACH;CAGF,IAAI,cAAc,uBAAuB,QAAQ,cAAc;EAC7D,MAAM,iBAAiB,qBAAqB,QAAQ,YAAY;EAChE,IAAI,gBAAgB;GAClB,SAAS,cAAc,eAAe;GACtC,SAAS,SAAS;EACpB;CACF;CAEA,OAAO;AACT;AAEA,SAAgB,qBAAqB,cAAkD;CACrF,MAAM,WAAW,aAAa,YAAY;CAE1C,IAAI,CAAC,YAAY,OAAO,aAAa,UACnC;CAGF,MAAM,cAAc;CAEpB,IAAI,CAAC,gBAAgB,YAAY,MAAM,GACrC;CAcF,OAXgB,YAAY,OAA0C,KAAK,UAAU;EAQnF,OAAO;GANL,SAAS,MAAM;GACf,MAAM,MAAM;GACZ,WAAW,MAAM;GACjB,MAAO,MAAM,YAAoD;EAGjD;CACpB,CAEY;AACd;AAEA,SAAgB,yBAAyB,KAAa,eAA+D;CACnH,OAAO,cAAc,mBAAmB,MAAM,kBAAkB,UAAU,CAAC,cAAc,KAAK,GAAG,GAAG,CAAC;AACvG;AAEA,SAAgB,8BACd,SACA,eAAwB,OACK;CAC7B,IAAI;CAEJ,IAAI,QAAQ,WAAW,QACrB,cAAc,gBAAgB,QAAQ,WAAW;MAC5C,IAAI,QAAQ,WAAW,OAC5B,cAAc,0BAA0B,QAAQ,GAAG;CAGrD,IAAI,CAAC,aACH;CAGF,OAAO,wBAAwB,aAAa,YAAY;AAC1D;AAEA,SAAS,gBAAgB,aAAsD;CAC7E,IAAI,CAAC,eAAe,OAAO,gBAAgB,UACzC;CAGF,MAAM,cAAc,aAKjB,WAAW;CAEd,IAAI,CAAC,aACH;CAGF,OAAO;EACL,OAAO,YAAY;EACnB,eAAe,YAAY;EAC3B,WAAW,YAAY,YAAY,KAAK,UAAU,YAAY,SAAS,IAAI,KAAA;EAC3E,eAAe,YAAY;CAC7B;AACF;AAEA,SAAS,0BAA0B,KAAiC;CAClE,MAAM,eAAe,SAAS,GAAG,CAAC,CAAC;CACnC,MAAM,iBAAiB,aAAa,IAAI,WAAW;CACnD,MAAM,YAAY,kBAAkB,aAAa,cAAc,MAAM,KAAA,IAAY,iBAAiB,KAAA;CAElG,OAAO;EACL,OAAO,aAAa,IAAI,OAAO,KAAK,KAAA;EACpC,eAAe,aAAa,IAAI,eAAe,KAAK,KAAA;EACpD;EACA,eAAe,aAAa,IAAI,eAAe,KAAK,KAAA;CACtD;AACF;AAEA,SAAS,wBAAwB,aAAiC,cAAwC;CACxG,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,IAAI,YAAY,OAAO;EACrB,MAAM,eAAe,YAAY,MAAM,KAAK;EAC5C,gBAAgB,iBAAiB,YAAY;EAC7C,IAAI,cACF,UAAU,aAAa,cAAc,uBAAuB,KAAK;CAErE;CAEA,IAAI,CAAC,eAAe;EAClB,MAAM,WAAW,YAAY;EAC7B,IAAI,aAAa,WAAW,aAAa,cAAc,aAAa,gBAClE,gBAAgB;CAEpB;CAEA,IAAI,YAAY,WACd,YAAY,YAAY;CAG1B,OAAO;EACL;EACA,eAAe,YAAY;EAC3B;EACA;CACF;AACF;AAEA,SAAS,iBAAiB,OAAe;CACvC,OAAO,MAAM,MAAM,sCAAsC,CAAC,GAAG;AAC/D"}
@@ -0,0 +1,32 @@
1
+ import "../lifeCycle.mjs";
2
+ //#region src/domain/resource/requestRegistry.ts
3
+ const MAX_REQUESTS = 1e3;
4
+ function createRequestRegistry(lifeCycle) {
5
+ const requests = /* @__PURE__ */ new Set();
6
+ const subscription = lifeCycle.subscribe(8, (request) => {
7
+ requests.add(request);
8
+ if (requests.size > 1e3) requests.delete(requests.values().next().value);
9
+ });
10
+ return {
11
+ getMatchingRequest(entry) {
12
+ let minTimeDifference = Infinity;
13
+ let closestRequest;
14
+ for (const request of requests) {
15
+ const timeDifference = entry.startTime - request.startClocks.relative;
16
+ if (0 <= timeDifference && timeDifference < minTimeDifference && request.url === entry.name) {
17
+ minTimeDifference = Math.abs(timeDifference);
18
+ closestRequest = request;
19
+ }
20
+ }
21
+ if (closestRequest) requests.delete(closestRequest);
22
+ return closestRequest;
23
+ },
24
+ stop() {
25
+ subscription.unsubscribe();
26
+ }
27
+ };
28
+ }
29
+ //#endregion
30
+ export { MAX_REQUESTS, createRequestRegistry };
31
+
32
+ //# sourceMappingURL=requestRegistry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestRegistry.mjs","names":[],"sources":["../../../src/domain/resource/requestRegistry.ts"],"sourcesContent":["import type { RumPerformanceResourceTiming } from '../../browser/performanceObservable'\nimport type { LifeCycle } from '../lifeCycle'\nimport { LifeCycleEventType } from '../lifeCycle'\nimport type { RequestCompleteEvent } from '../requestCollection'\n\nexport interface RequestRegistry {\n getMatchingRequest(entry: RumPerformanceResourceTiming): RequestCompleteEvent | undefined\n stop(): void\n}\n\n// Maximum number of requests to keep in the registry. Requests should be removed quite quickly in\n// general, this is just a safety limit to avoid memory leaks in case of a bug.\nexport const MAX_REQUESTS = 1000\n\nexport function createRequestRegistry(lifeCycle: LifeCycle): RequestRegistry {\n const requests = new Set<RequestCompleteEvent>()\n\n const subscription = lifeCycle.subscribe(LifeCycleEventType.REQUEST_COMPLETED, (request) => {\n requests.add(request)\n\n if (requests.size > MAX_REQUESTS) {\n requests.delete(requests.values().next().value!)\n }\n })\n\n return {\n getMatchingRequest(entry) {\n // Returns the closest request object that happened before the entry\n let minTimeDifference = Infinity\n let closestRequest: RequestCompleteEvent | undefined\n for (const request of requests) {\n const timeDifference = entry.startTime - request.startClocks.relative\n if (0 <= timeDifference && timeDifference < minTimeDifference && request.url === entry.name) {\n minTimeDifference = Math.abs(timeDifference)\n closestRequest = request\n }\n }\n\n if (closestRequest) {\n requests.delete(closestRequest)\n }\n\n return closestRequest\n },\n\n stop() {\n subscription.unsubscribe()\n },\n }\n}\n"],"mappings":";;AAYA,MAAa,eAAe;AAE5B,SAAgB,sBAAsB,WAAuC;CAC3E,MAAM,2BAAW,IAAI,IAA0B;CAE/C,MAAM,eAAe,UAAU,UAAA,IAAiD,YAAY;EAC1F,SAAS,IAAI,OAAO;EAEpB,IAAI,SAAS,OAAA,KACX,SAAS,OAAO,SAAS,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAM;CAEnD,CAAC;CAED,OAAO;EACL,mBAAmB,OAAO;GAExB,IAAI,oBAAoB;GACxB,IAAI;GACJ,KAAK,MAAM,WAAW,UAAU;IAC9B,MAAM,iBAAiB,MAAM,YAAY,QAAQ,YAAY;IAC7D,IAAI,KAAK,kBAAkB,iBAAiB,qBAAqB,QAAQ,QAAQ,MAAM,MAAM;KAC3F,oBAAoB,KAAK,IAAI,cAAc;KAC3C,iBAAiB;IACnB;GACF;GAEA,IAAI,gBACF,SAAS,OAAO,cAAc;GAGhC,OAAO;EACT;EAEA,OAAO;GACL,aAAa,YAAY;EAC3B;CACF;AACF"}