@kubesense/kubesense-browser-rum 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +34 -0
  3. package/bundle/chunks/profiler-b64730a2109c3ddbc539-kubesense-rum.js +1 -0
  4. package/bundle/chunks/recorder-9ae532a18bac5f4280da-kubesense-rum.js +1 -0
  5. package/bundle/kubesense-rum.js +1 -0
  6. package/cjs/boot/isBrowserSupported.d.ts +4 -0
  7. package/cjs/boot/isBrowserSupported.js +17 -0
  8. package/cjs/boot/isBrowserSupported.js.map +1 -0
  9. package/cjs/boot/lazyLoadProfiler.d.ts +4 -0
  10. package/cjs/boot/lazyLoadProfiler.js +54 -0
  11. package/cjs/boot/lazyLoadProfiler.js.map +1 -0
  12. package/cjs/boot/lazyLoadRecorder.d.ts +4 -0
  13. package/cjs/boot/lazyLoadRecorder.js +54 -0
  14. package/cjs/boot/lazyLoadRecorder.js.map +1 -0
  15. package/cjs/boot/postStartStrategy.d.ts +33 -0
  16. package/cjs/boot/postStartStrategy.js +98 -0
  17. package/cjs/boot/postStartStrategy.js.map +1 -0
  18. package/cjs/boot/preStartStrategy.d.ts +6 -0
  19. package/cjs/boot/preStartStrategy.js +24 -0
  20. package/cjs/boot/preStartStrategy.js.map +1 -0
  21. package/cjs/boot/profilerApi.d.ts +2 -0
  22. package/cjs/boot/profilerApi.js +53 -0
  23. package/cjs/boot/profilerApi.js.map +1 -0
  24. package/cjs/boot/recorderApi.d.ts +4 -0
  25. package/cjs/boot/recorderApi.js +73 -0
  26. package/cjs/boot/recorderApi.js.map +1 -0
  27. package/cjs/boot/startRecording.d.ts +6 -0
  28. package/cjs/boot/startRecording.js +45 -0
  29. package/cjs/boot/startRecording.js.map +1 -0
  30. package/cjs/domain/deflate/deflateEncoder.d.ts +3 -0
  31. package/cjs/domain/deflate/deflateEncoder.js +110 -0
  32. package/cjs/domain/deflate/deflateEncoder.js.map +1 -0
  33. package/cjs/domain/deflate/deflateWorker.d.ts +30 -0
  34. package/cjs/domain/deflate/deflateWorker.js +104 -0
  35. package/cjs/domain/deflate/deflateWorker.js.map +1 -0
  36. package/cjs/domain/deflate/index.d.ts +3 -0
  37. package/cjs/domain/deflate/index.js +10 -0
  38. package/cjs/domain/deflate/index.js.map +1 -0
  39. package/cjs/domain/getSessionReplayLink.d.ts +2 -0
  40. package/cjs/domain/getSessionReplayLink.js +35 -0
  41. package/cjs/domain/getSessionReplayLink.js.map +1 -0
  42. package/cjs/domain/profiling/profiler.d.ts +7 -0
  43. package/cjs/domain/profiling/profiler.js +244 -0
  44. package/cjs/domain/profiling/profiler.js.map +1 -0
  45. package/cjs/domain/profiling/profilingContext.d.ts +6 -0
  46. package/cjs/domain/profiling/profilingContext.js +28 -0
  47. package/cjs/domain/profiling/profilingContext.js.map +1 -0
  48. package/cjs/domain/profiling/profilingSupported.d.ts +1 -0
  49. package/cjs/domain/profiling/profilingSupported.js +11 -0
  50. package/cjs/domain/profiling/profilingSupported.js.map +1 -0
  51. package/cjs/domain/profiling/test-utils/mockedTrace.d.ts +3 -0
  52. package/cjs/domain/profiling/test-utils/mockedTrace.js +57 -0
  53. package/cjs/domain/profiling/test-utils/mockedTrace.js.map +1 -0
  54. package/cjs/domain/profiling/transport/assembly.d.ts +21 -0
  55. package/cjs/domain/profiling/transport/assembly.js +45 -0
  56. package/cjs/domain/profiling/transport/assembly.js.map +1 -0
  57. package/cjs/domain/profiling/transport/buildProfileEventAttributes.d.ts +25 -0
  58. package/cjs/domain/profiling/transport/buildProfileEventAttributes.js +50 -0
  59. package/cjs/domain/profiling/transport/buildProfileEventAttributes.js.map +1 -0
  60. package/cjs/domain/profiling/types/index.d.ts +2 -0
  61. package/cjs/domain/profiling/types/index.js +3 -0
  62. package/cjs/domain/profiling/types/index.js.map +1 -0
  63. package/cjs/domain/profiling/types/profilerApi.types.d.ts +58 -0
  64. package/cjs/domain/profiling/types/profilerApi.types.js +5 -0
  65. package/cjs/domain/profiling/types/profilerApi.types.js.map +1 -0
  66. package/cjs/domain/profiling/types/rumProfiler.types.d.ts +72 -0
  67. package/cjs/domain/profiling/types/rumProfiler.types.js +3 -0
  68. package/cjs/domain/profiling/types/rumProfiler.types.js.map +1 -0
  69. package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.d.ts +1 -0
  70. package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.js +7 -0
  71. package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.js.map +1 -0
  72. package/cjs/domain/profiling/utils/getDefaultViewName.d.ts +1 -0
  73. package/cjs/domain/profiling/utils/getDefaultViewName.js +14 -0
  74. package/cjs/domain/profiling/utils/getDefaultViewName.js.map +1 -0
  75. package/cjs/domain/profiling/utils/getNumberOfSamples.d.ts +7 -0
  76. package/cjs/domain/profiling/utils/getNumberOfSamples.js +18 -0
  77. package/cjs/domain/profiling/utils/getNumberOfSamples.js.map +1 -0
  78. package/cjs/domain/record/assembly.d.ts +2 -0
  79. package/cjs/domain/record/assembly.js +16 -0
  80. package/cjs/domain/record/assembly.js.map +1 -0
  81. package/cjs/domain/record/elementsScrollPositions.d.ts +10 -0
  82. package/cjs/domain/record/elementsScrollPositions.js +23 -0
  83. package/cjs/domain/record/elementsScrollPositions.js.map +1 -0
  84. package/cjs/domain/record/eventIds.d.ts +4 -0
  85. package/cjs/domain/record/eventIds.js +16 -0
  86. package/cjs/domain/record/eventIds.js.map +1 -0
  87. package/cjs/domain/record/eventsUtils.d.ts +2 -0
  88. package/cjs/domain/record/eventsUtils.js +15 -0
  89. package/cjs/domain/record/eventsUtils.js.map +1 -0
  90. package/cjs/domain/record/index.d.ts +7 -0
  91. package/cjs/domain/record/index.js +17 -0
  92. package/cjs/domain/record/index.js.map +1 -0
  93. package/cjs/domain/record/internalApi.d.ts +22 -0
  94. package/cjs/domain/record/internalApi.js +57 -0
  95. package/cjs/domain/record/internalApi.js.map +1 -0
  96. package/cjs/domain/record/mutationBatch.d.ts +12 -0
  97. package/cjs/domain/record/mutationBatch.js +44 -0
  98. package/cjs/domain/record/mutationBatch.js.map +1 -0
  99. package/cjs/domain/record/nodeIds.d.ts +15 -0
  100. package/cjs/domain/record/nodeIds.js +32 -0
  101. package/cjs/domain/record/nodeIds.js.map +1 -0
  102. package/cjs/domain/record/record.d.ts +16 -0
  103. package/cjs/domain/record/record.js +90 -0
  104. package/cjs/domain/record/record.js.map +1 -0
  105. package/cjs/domain/record/record.types.d.ts +4 -0
  106. package/cjs/domain/record/record.types.js +3 -0
  107. package/cjs/domain/record/record.types.js.map +1 -0
  108. package/cjs/domain/record/recordingScope.d.ts +19 -0
  109. package/cjs/domain/record/recordingScope.js +13 -0
  110. package/cjs/domain/record/recordingScope.js.map +1 -0
  111. package/cjs/domain/record/serialization/index.d.ts +8 -0
  112. package/cjs/domain/record/serialization/index.js +18 -0
  113. package/cjs/domain/record/serialization/index.js.map +1 -0
  114. package/cjs/domain/record/serialization/serialization.types.d.ts +28 -0
  115. package/cjs/domain/record/serialization/serialization.types.js +3 -0
  116. package/cjs/domain/record/serialization/serialization.types.js.map +1 -0
  117. package/cjs/domain/record/serialization/serializationStats.d.ts +12 -0
  118. package/cjs/domain/record/serialization/serializationStats.js +32 -0
  119. package/cjs/domain/record/serialization/serializationStats.js.map +1 -0
  120. package/cjs/domain/record/serialization/serializationTransaction.d.ts +45 -0
  121. package/cjs/domain/record/serialization/serializationTransaction.js +38 -0
  122. package/cjs/domain/record/serialization/serializationTransaction.js.map +1 -0
  123. package/cjs/domain/record/serialization/serializationUtils.d.ts +18 -0
  124. package/cjs/domain/record/serialization/serializationUtils.js +88 -0
  125. package/cjs/domain/record/serialization/serializationUtils.js.map +1 -0
  126. package/cjs/domain/record/serialization/serializeAttribute.d.ts +4 -0
  127. package/cjs/domain/record/serialization/serializeAttribute.js +42 -0
  128. package/cjs/domain/record/serialization/serializeAttribute.js.map +1 -0
  129. package/cjs/domain/record/serialization/serializeAttributes.d.ts +7 -0
  130. package/cjs/domain/record/serialization/serializeAttributes.js +167 -0
  131. package/cjs/domain/record/serialization/serializeAttributes.js.map +1 -0
  132. package/cjs/domain/record/serialization/serializeDocument.d.ts +3 -0
  133. package/cjs/domain/record/serialization/serializeDocument.js +11 -0
  134. package/cjs/domain/record/serialization/serializeDocument.js.map +1 -0
  135. package/cjs/domain/record/serialization/serializeNode.d.ts +7 -0
  136. package/cjs/domain/record/serialization/serializeNode.js +154 -0
  137. package/cjs/domain/record/serialization/serializeNode.js.map +1 -0
  138. package/cjs/domain/record/serialization/serializeStyleSheets.d.ts +2 -0
  139. package/cjs/domain/record/serialization/serializeStyleSheets.js +19 -0
  140. package/cjs/domain/record/serialization/serializeStyleSheets.js.map +1 -0
  141. package/cjs/domain/record/shadowRootsController.d.ts +11 -0
  142. package/cjs/domain/record/shadowRootsController.js +45 -0
  143. package/cjs/domain/record/shadowRootsController.js.map +1 -0
  144. package/cjs/domain/record/startFullSnapshots.d.ts +9 -0
  145. package/cjs/domain/record/startFullSnapshots.js +59 -0
  146. package/cjs/domain/record/startFullSnapshots.js.map +1 -0
  147. package/cjs/domain/record/trackers/index.d.ts +12 -0
  148. package/cjs/domain/record/trackers/index.js +27 -0
  149. package/cjs/domain/record/trackers/index.js.map +1 -0
  150. package/cjs/domain/record/trackers/trackFocus.d.ts +5 -0
  151. package/cjs/domain/record/trackers/trackFocus.js +15 -0
  152. package/cjs/domain/record/trackers/trackFocus.js.map +1 -0
  153. package/cjs/domain/record/trackers/trackFrustration.d.ts +7 -0
  154. package/cjs/domain/record/trackers/trackFrustration.js +31 -0
  155. package/cjs/domain/record/trackers/trackFrustration.js.map +1 -0
  156. package/cjs/domain/record/trackers/trackInput.d.ts +4 -0
  157. package/cjs/domain/record/trackers/trackInput.js +104 -0
  158. package/cjs/domain/record/trackers/trackInput.js.map +1 -0
  159. package/cjs/domain/record/trackers/trackMediaInteraction.d.ts +5 -0
  160. package/cjs/domain/record/trackers/trackMediaInteraction.js +29 -0
  161. package/cjs/domain/record/trackers/trackMediaInteraction.js.map +1 -0
  162. package/cjs/domain/record/trackers/trackMouseInteraction.d.ts +5 -0
  163. package/cjs/domain/record/trackers/trackMouseInteraction.js +59 -0
  164. package/cjs/domain/record/trackers/trackMouseInteraction.js.map +1 -0
  165. package/cjs/domain/record/trackers/trackMove.d.ts +9 -0
  166. package/cjs/domain/record/trackers/trackMove.js +55 -0
  167. package/cjs/domain/record/trackers/trackMove.js.map +1 -0
  168. package/cjs/domain/record/trackers/trackMutation.d.ts +11 -0
  169. package/cjs/domain/record/trackers/trackMutation.js +270 -0
  170. package/cjs/domain/record/trackers/trackMutation.js.map +1 -0
  171. package/cjs/domain/record/trackers/trackScroll.d.ts +5 -0
  172. package/cjs/domain/record/trackers/trackScroll.js +48 -0
  173. package/cjs/domain/record/trackers/trackScroll.js.map +1 -0
  174. package/cjs/domain/record/trackers/trackStyleSheet.d.ts +6 -0
  175. package/cjs/domain/record/trackers/trackStyleSheet.js +89 -0
  176. package/cjs/domain/record/trackers/trackStyleSheet.js.map +1 -0
  177. package/cjs/domain/record/trackers/trackViewEnd.d.ts +5 -0
  178. package/cjs/domain/record/trackers/trackViewEnd.js +20 -0
  179. package/cjs/domain/record/trackers/trackViewEnd.js.map +1 -0
  180. package/cjs/domain/record/trackers/trackViewportResize.d.ts +6 -0
  181. package/cjs/domain/record/trackers/trackViewportResize.js +46 -0
  182. package/cjs/domain/record/trackers/trackViewportResize.js.map +1 -0
  183. package/cjs/domain/record/trackers/tracker.types.d.ts +3 -0
  184. package/cjs/domain/record/trackers/tracker.types.js +3 -0
  185. package/cjs/domain/record/trackers/tracker.types.js.map +1 -0
  186. package/cjs/domain/record/viewports.d.ts +20 -0
  187. package/cjs/domain/record/viewports.js +60 -0
  188. package/cjs/domain/record/viewports.js.map +1 -0
  189. package/cjs/domain/replayStats.d.ts +8 -0
  190. package/cjs/domain/replayStats.js +60 -0
  191. package/cjs/domain/replayStats.js.map +1 -0
  192. package/cjs/domain/scriptLoadingError.d.ts +6 -0
  193. package/cjs/domain/scriptLoadingError.js +26 -0
  194. package/cjs/domain/scriptLoadingError.js.map +1 -0
  195. package/cjs/domain/segmentCollection/buildReplayPayload.d.ts +15 -0
  196. package/cjs/domain/segmentCollection/buildReplayPayload.js +26 -0
  197. package/cjs/domain/segmentCollection/buildReplayPayload.js.map +1 -0
  198. package/cjs/domain/segmentCollection/index.d.ts +4 -0
  199. package/cjs/domain/segmentCollection/index.js +11 -0
  200. package/cjs/domain/segmentCollection/index.js.map +1 -0
  201. package/cjs/domain/segmentCollection/segment.d.ts +16 -0
  202. package/cjs/domain/segmentCollection/segment.js +82 -0
  203. package/cjs/domain/segmentCollection/segment.js.map +1 -0
  204. package/cjs/domain/segmentCollection/segmentCollection.d.ts +31 -0
  205. package/cjs/domain/segmentCollection/segmentCollection.js +113 -0
  206. package/cjs/domain/segmentCollection/segmentCollection.js.map +1 -0
  207. package/cjs/domain/segmentCollection/startSegmentTelemetry.d.ts +6 -0
  208. package/cjs/domain/segmentCollection/startSegmentTelemetry.js +47 -0
  209. package/cjs/domain/segmentCollection/startSegmentTelemetry.js.map +1 -0
  210. package/cjs/domain/startRecordBridge.d.ts +5 -0
  211. package/cjs/domain/startRecordBridge.js +17 -0
  212. package/cjs/domain/startRecordBridge.js.map +1 -0
  213. package/cjs/domain/startRecorderInitTelemetry.d.ts +15 -0
  214. package/cjs/domain/startRecorderInitTelemetry.js +55 -0
  215. package/cjs/domain/startRecorderInitTelemetry.js.map +1 -0
  216. package/cjs/entries/internal.d.ts +11 -0
  217. package/cjs/entries/internal.js +28 -0
  218. package/cjs/entries/internal.js.map +1 -0
  219. package/cjs/entries/internalSynthetics.d.ts +2 -0
  220. package/cjs/entries/internalSynthetics.js +27 -0
  221. package/cjs/entries/internalSynthetics.js.map +1 -0
  222. package/cjs/entries/main.d.ts +23 -0
  223. package/cjs/entries/main.js +35 -0
  224. package/cjs/entries/main.js.map +1 -0
  225. package/cjs/types/index.d.ts +2 -0
  226. package/cjs/types/index.js +18 -0
  227. package/cjs/types/index.js.map +1 -0
  228. package/cjs/types/sessionReplay.d.ts +703 -0
  229. package/cjs/types/sessionReplay.js +7 -0
  230. package/cjs/types/sessionReplay.js.map +1 -0
  231. package/cjs/types/sessionReplayConstants.d.ts +49 -0
  232. package/cjs/types/sessionReplayConstants.js +49 -0
  233. package/cjs/types/sessionReplayConstants.js.map +1 -0
  234. package/esm/boot/isBrowserSupported.d.ts +4 -0
  235. package/esm/boot/isBrowserSupported.js +14 -0
  236. package/esm/boot/isBrowserSupported.js.map +1 -0
  237. package/esm/boot/lazyLoadProfiler.d.ts +4 -0
  238. package/esm/boot/lazyLoadProfiler.js +18 -0
  239. package/esm/boot/lazyLoadProfiler.js.map +1 -0
  240. package/esm/boot/lazyLoadRecorder.d.ts +4 -0
  241. package/esm/boot/lazyLoadRecorder.js +18 -0
  242. package/esm/boot/lazyLoadRecorder.js.map +1 -0
  243. package/esm/boot/postStartStrategy.d.ts +33 -0
  244. package/esm/boot/postStartStrategy.js +95 -0
  245. package/esm/boot/postStartStrategy.js.map +1 -0
  246. package/esm/boot/preStartStrategy.d.ts +6 -0
  247. package/esm/boot/preStartStrategy.js +21 -0
  248. package/esm/boot/preStartStrategy.js.map +1 -0
  249. package/esm/boot/profilerApi.d.ts +2 -0
  250. package/esm/boot/profilerApi.js +50 -0
  251. package/esm/boot/profilerApi.js.map +1 -0
  252. package/esm/boot/recorderApi.d.ts +4 -0
  253. package/esm/boot/recorderApi.js +70 -0
  254. package/esm/boot/recorderApi.js.map +1 -0
  255. package/esm/boot/startRecording.d.ts +6 -0
  256. package/esm/boot/startRecording.js +42 -0
  257. package/esm/boot/startRecording.js.map +1 -0
  258. package/esm/domain/deflate/deflateEncoder.d.ts +3 -0
  259. package/esm/domain/deflate/deflateEncoder.js +107 -0
  260. package/esm/domain/deflate/deflateEncoder.js.map +1 -0
  261. package/esm/domain/deflate/deflateWorker.d.ts +30 -0
  262. package/esm/domain/deflate/deflateWorker.js +97 -0
  263. package/esm/domain/deflate/deflateWorker.js.map +1 -0
  264. package/esm/domain/deflate/index.d.ts +3 -0
  265. package/esm/domain/deflate/index.js +3 -0
  266. package/esm/domain/deflate/index.js.map +1 -0
  267. package/esm/domain/getSessionReplayLink.d.ts +2 -0
  268. package/esm/domain/getSessionReplayLink.js +32 -0
  269. package/esm/domain/getSessionReplayLink.js.map +1 -0
  270. package/esm/domain/profiling/profiler.d.ts +7 -0
  271. package/esm/domain/profiling/profiler.js +240 -0
  272. package/esm/domain/profiling/profiler.js.map +1 -0
  273. package/esm/domain/profiling/profilingContext.d.ts +6 -0
  274. package/esm/domain/profiling/profilingContext.js +25 -0
  275. package/esm/domain/profiling/profilingContext.js.map +1 -0
  276. package/esm/domain/profiling/profilingSupported.d.ts +1 -0
  277. package/esm/domain/profiling/profilingSupported.js +8 -0
  278. package/esm/domain/profiling/profilingSupported.js.map +1 -0
  279. package/esm/domain/profiling/test-utils/mockedTrace.d.ts +3 -0
  280. package/esm/domain/profiling/test-utils/mockedTrace.js +54 -0
  281. package/esm/domain/profiling/test-utils/mockedTrace.js.map +1 -0
  282. package/esm/domain/profiling/transport/assembly.d.ts +21 -0
  283. package/esm/domain/profiling/transport/assembly.js +42 -0
  284. package/esm/domain/profiling/transport/assembly.js.map +1 -0
  285. package/esm/domain/profiling/transport/buildProfileEventAttributes.d.ts +25 -0
  286. package/esm/domain/profiling/transport/buildProfileEventAttributes.js +47 -0
  287. package/esm/domain/profiling/transport/buildProfileEventAttributes.js.map +1 -0
  288. package/esm/domain/profiling/types/index.d.ts +2 -0
  289. package/esm/domain/profiling/types/index.js +2 -0
  290. package/esm/domain/profiling/types/index.js.map +1 -0
  291. package/esm/domain/profiling/types/profilerApi.types.d.ts +58 -0
  292. package/esm/domain/profiling/types/profilerApi.types.js +4 -0
  293. package/esm/domain/profiling/types/profilerApi.types.js.map +1 -0
  294. package/esm/domain/profiling/types/rumProfiler.types.d.ts +72 -0
  295. package/esm/domain/profiling/types/rumProfiler.types.js +2 -0
  296. package/esm/domain/profiling/types/rumProfiler.types.js.map +1 -0
  297. package/esm/domain/profiling/utils/getCustomOrDefaultViewName.d.ts +1 -0
  298. package/esm/domain/profiling/utils/getCustomOrDefaultViewName.js +3 -0
  299. package/esm/domain/profiling/utils/getCustomOrDefaultViewName.js.map +1 -0
  300. package/esm/domain/profiling/utils/getDefaultViewName.d.ts +1 -0
  301. package/esm/domain/profiling/utils/getDefaultViewName.js +11 -0
  302. package/esm/domain/profiling/utils/getDefaultViewName.js.map +1 -0
  303. package/esm/domain/profiling/utils/getNumberOfSamples.d.ts +7 -0
  304. package/esm/domain/profiling/utils/getNumberOfSamples.js +15 -0
  305. package/esm/domain/profiling/utils/getNumberOfSamples.js.map +1 -0
  306. package/esm/domain/record/assembly.d.ts +2 -0
  307. package/esm/domain/record/assembly.js +13 -0
  308. package/esm/domain/record/assembly.js.map +1 -0
  309. package/esm/domain/record/elementsScrollPositions.d.ts +10 -0
  310. package/esm/domain/record/elementsScrollPositions.js +20 -0
  311. package/esm/domain/record/elementsScrollPositions.js.map +1 -0
  312. package/esm/domain/record/eventIds.d.ts +4 -0
  313. package/esm/domain/record/eventIds.js +13 -0
  314. package/esm/domain/record/eventIds.js.map +1 -0
  315. package/esm/domain/record/eventsUtils.d.ts +2 -0
  316. package/esm/domain/record/eventsUtils.js +11 -0
  317. package/esm/domain/record/eventsUtils.js.map +1 -0
  318. package/esm/domain/record/index.d.ts +7 -0
  319. package/esm/domain/record/index.js +6 -0
  320. package/esm/domain/record/index.js.map +1 -0
  321. package/esm/domain/record/internalApi.d.ts +22 -0
  322. package/esm/domain/record/internalApi.js +53 -0
  323. package/esm/domain/record/internalApi.js.map +1 -0
  324. package/esm/domain/record/mutationBatch.d.ts +12 -0
  325. package/esm/domain/record/mutationBatch.js +40 -0
  326. package/esm/domain/record/mutationBatch.js.map +1 -0
  327. package/esm/domain/record/nodeIds.d.ts +15 -0
  328. package/esm/domain/record/nodeIds.js +29 -0
  329. package/esm/domain/record/nodeIds.js.map +1 -0
  330. package/esm/domain/record/record.d.ts +16 -0
  331. package/esm/domain/record/record.js +54 -0
  332. package/esm/domain/record/record.js.map +1 -0
  333. package/esm/domain/record/record.types.d.ts +4 -0
  334. package/esm/domain/record/record.types.js +2 -0
  335. package/esm/domain/record/record.types.js.map +1 -0
  336. package/esm/domain/record/recordingScope.d.ts +19 -0
  337. package/esm/domain/record/recordingScope.js +10 -0
  338. package/esm/domain/record/recordingScope.js.map +1 -0
  339. package/esm/domain/record/serialization/index.d.ts +8 -0
  340. package/esm/domain/record/serialization/index.js +7 -0
  341. package/esm/domain/record/serialization/index.js.map +1 -0
  342. package/esm/domain/record/serialization/serialization.types.d.ts +28 -0
  343. package/esm/domain/record/serialization/serialization.types.js +2 -0
  344. package/esm/domain/record/serialization/serialization.types.js.map +1 -0
  345. package/esm/domain/record/serialization/serializationStats.d.ts +12 -0
  346. package/esm/domain/record/serialization/serializationStats.js +27 -0
  347. package/esm/domain/record/serialization/serializationStats.js.map +1 -0
  348. package/esm/domain/record/serialization/serializationTransaction.d.ts +45 -0
  349. package/esm/domain/record/serialization/serializationTransaction.js +35 -0
  350. package/esm/domain/record/serialization/serializationTransaction.js.map +1 -0
  351. package/esm/domain/record/serialization/serializationUtils.d.ts +18 -0
  352. package/esm/domain/record/serialization/serializationUtils.js +80 -0
  353. package/esm/domain/record/serialization/serializationUtils.js.map +1 -0
  354. package/esm/domain/record/serialization/serializeAttribute.d.ts +4 -0
  355. package/esm/domain/record/serialization/serializeAttribute.js +38 -0
  356. package/esm/domain/record/serialization/serializeAttribute.js.map +1 -0
  357. package/esm/domain/record/serialization/serializeAttributes.d.ts +7 -0
  358. package/esm/domain/record/serialization/serializeAttributes.js +161 -0
  359. package/esm/domain/record/serialization/serializeAttributes.js.map +1 -0
  360. package/esm/domain/record/serialization/serializeDocument.d.ts +3 -0
  361. package/esm/domain/record/serialization/serializeDocument.js +8 -0
  362. package/esm/domain/record/serialization/serializeDocument.js.map +1 -0
  363. package/esm/domain/record/serialization/serializeNode.d.ts +7 -0
  364. package/esm/domain/record/serialization/serializeNode.js +149 -0
  365. package/esm/domain/record/serialization/serializeNode.js.map +1 -0
  366. package/esm/domain/record/serialization/serializeStyleSheets.d.ts +2 -0
  367. package/esm/domain/record/serialization/serializeStyleSheets.js +16 -0
  368. package/esm/domain/record/serialization/serializeStyleSheets.js.map +1 -0
  369. package/esm/domain/record/shadowRootsController.d.ts +11 -0
  370. package/esm/domain/record/shadowRootsController.js +41 -0
  371. package/esm/domain/record/shadowRootsController.js.map +1 -0
  372. package/esm/domain/record/startFullSnapshots.d.ts +9 -0
  373. package/esm/domain/record/startFullSnapshots.js +55 -0
  374. package/esm/domain/record/startFullSnapshots.js.map +1 -0
  375. package/esm/domain/record/trackers/index.d.ts +12 -0
  376. package/esm/domain/record/trackers/index.js +12 -0
  377. package/esm/domain/record/trackers/index.js.map +1 -0
  378. package/esm/domain/record/trackers/trackFocus.d.ts +5 -0
  379. package/esm/domain/record/trackers/trackFocus.js +12 -0
  380. package/esm/domain/record/trackers/trackFocus.js.map +1 -0
  381. package/esm/domain/record/trackers/trackFrustration.d.ts +7 -0
  382. package/esm/domain/record/trackers/trackFrustration.js +28 -0
  383. package/esm/domain/record/trackers/trackFrustration.js.map +1 -0
  384. package/esm/domain/record/trackers/trackInput.d.ts +4 -0
  385. package/esm/domain/record/trackers/trackInput.js +101 -0
  386. package/esm/domain/record/trackers/trackInput.js.map +1 -0
  387. package/esm/domain/record/trackers/trackMediaInteraction.d.ts +5 -0
  388. package/esm/domain/record/trackers/trackMediaInteraction.js +26 -0
  389. package/esm/domain/record/trackers/trackMediaInteraction.js.map +1 -0
  390. package/esm/domain/record/trackers/trackMouseInteraction.d.ts +5 -0
  391. package/esm/domain/record/trackers/trackMouseInteraction.js +56 -0
  392. package/esm/domain/record/trackers/trackMouseInteraction.js.map +1 -0
  393. package/esm/domain/record/trackers/trackMove.d.ts +9 -0
  394. package/esm/domain/record/trackers/trackMove.js +51 -0
  395. package/esm/domain/record/trackers/trackMove.js.map +1 -0
  396. package/esm/domain/record/trackers/trackMutation.d.ts +11 -0
  397. package/esm/domain/record/trackers/trackMutation.js +266 -0
  398. package/esm/domain/record/trackers/trackMutation.js.map +1 -0
  399. package/esm/domain/record/trackers/trackScroll.d.ts +5 -0
  400. package/esm/domain/record/trackers/trackScroll.js +45 -0
  401. package/esm/domain/record/trackers/trackScroll.js.map +1 -0
  402. package/esm/domain/record/trackers/trackStyleSheet.d.ts +6 -0
  403. package/esm/domain/record/trackers/trackStyleSheet.js +85 -0
  404. package/esm/domain/record/trackers/trackStyleSheet.js.map +1 -0
  405. package/esm/domain/record/trackers/trackViewEnd.d.ts +5 -0
  406. package/esm/domain/record/trackers/trackViewEnd.js +17 -0
  407. package/esm/domain/record/trackers/trackViewEnd.js.map +1 -0
  408. package/esm/domain/record/trackers/trackViewportResize.d.ts +6 -0
  409. package/esm/domain/record/trackers/trackViewportResize.js +42 -0
  410. package/esm/domain/record/trackers/trackViewportResize.js.map +1 -0
  411. package/esm/domain/record/trackers/tracker.types.d.ts +3 -0
  412. package/esm/domain/record/trackers/tracker.types.js +2 -0
  413. package/esm/domain/record/trackers/tracker.types.js.map +1 -0
  414. package/esm/domain/record/viewports.d.ts +20 -0
  415. package/esm/domain/record/viewports.js +55 -0
  416. package/esm/domain/record/viewports.js.map +1 -0
  417. package/esm/domain/replayStats.d.ts +8 -0
  418. package/esm/domain/replayStats.js +51 -0
  419. package/esm/domain/replayStats.js.map +1 -0
  420. package/esm/domain/scriptLoadingError.d.ts +6 -0
  421. package/esm/domain/scriptLoadingError.js +23 -0
  422. package/esm/domain/scriptLoadingError.js.map +1 -0
  423. package/esm/domain/segmentCollection/buildReplayPayload.d.ts +15 -0
  424. package/esm/domain/segmentCollection/buildReplayPayload.js +23 -0
  425. package/esm/domain/segmentCollection/buildReplayPayload.js.map +1 -0
  426. package/esm/domain/segmentCollection/index.d.ts +4 -0
  427. package/esm/domain/segmentCollection/index.js +4 -0
  428. package/esm/domain/segmentCollection/index.js.map +1 -0
  429. package/esm/domain/segmentCollection/segment.d.ts +16 -0
  430. package/esm/domain/segmentCollection/segment.js +46 -0
  431. package/esm/domain/segmentCollection/segment.js.map +1 -0
  432. package/esm/domain/segmentCollection/segmentCollection.d.ts +31 -0
  433. package/esm/domain/segmentCollection/segmentCollection.js +106 -0
  434. package/esm/domain/segmentCollection/segmentCollection.js.map +1 -0
  435. package/esm/domain/segmentCollection/startSegmentTelemetry.d.ts +6 -0
  436. package/esm/domain/segmentCollection/startSegmentTelemetry.js +44 -0
  437. package/esm/domain/segmentCollection/startSegmentTelemetry.js.map +1 -0
  438. package/esm/domain/startRecordBridge.d.ts +5 -0
  439. package/esm/domain/startRecordBridge.js +14 -0
  440. package/esm/domain/startRecordBridge.js.map +1 -0
  441. package/esm/domain/startRecorderInitTelemetry.d.ts +15 -0
  442. package/esm/domain/startRecorderInitTelemetry.js +52 -0
  443. package/esm/domain/startRecorderInitTelemetry.js.map +1 -0
  444. package/esm/entries/internal.d.ts +11 -0
  445. package/esm/entries/internal.js +4 -0
  446. package/esm/entries/internal.js.map +1 -0
  447. package/esm/entries/internalSynthetics.d.ts +2 -0
  448. package/esm/entries/internalSynthetics.js +23 -0
  449. package/esm/entries/internalSynthetics.js.map +1 -0
  450. package/esm/entries/main.d.ts +23 -0
  451. package/esm/entries/main.js +31 -0
  452. package/esm/entries/main.js.map +1 -0
  453. package/esm/types/index.d.ts +2 -0
  454. package/esm/types/index.js +2 -0
  455. package/esm/types/index.js.map +1 -0
  456. package/esm/types/sessionReplay.d.ts +703 -0
  457. package/esm/types/sessionReplay.js +6 -0
  458. package/esm/types/sessionReplay.js.map +1 -0
  459. package/esm/types/sessionReplayConstants.d.ts +49 -0
  460. package/esm/types/sessionReplayConstants.js +46 -0
  461. package/esm/types/sessionReplayConstants.js.map +1 -0
  462. package/internal/package.json +6 -0
  463. package/internal-synthetics/package.json +6 -0
  464. package/package.json +40 -0
  465. package/src/boot/isBrowserSupported.ts +14 -0
  466. package/src/boot/lazyLoadProfiler.ts +21 -0
  467. package/src/boot/lazyLoadRecorder.ts +21 -0
  468. package/src/boot/postStartStrategy.ts +176 -0
  469. package/src/boot/preStartStrategy.ts +34 -0
  470. package/src/boot/profilerApi.ts +86 -0
  471. package/src/boot/recorderApi.ts +124 -0
  472. package/src/boot/startRecording.ts +70 -0
  473. package/src/domain/deflate/deflateEncoder.ts +144 -0
  474. package/src/domain/deflate/deflateWorker.ts +157 -0
  475. package/src/domain/deflate/index.ts +8 -0
  476. package/src/domain/getSessionReplayLink.ts +40 -0
  477. package/src/domain/profiling/profiler.ts +338 -0
  478. package/src/domain/profiling/profilingContext.ts +34 -0
  479. package/src/domain/profiling/profilingSupported.ts +10 -0
  480. package/src/domain/profiling/test-utils/mockedTrace.ts +58 -0
  481. package/src/domain/profiling/transport/assembly.ts +78 -0
  482. package/src/domain/profiling/transport/buildProfileEventAttributes.ts +66 -0
  483. package/src/domain/profiling/types/index.ts +2 -0
  484. package/src/domain/profiling/types/profilerApi.types.ts +87 -0
  485. package/src/domain/profiling/types/rumProfiler.types.ts +81 -0
  486. package/src/domain/profiling/utils/getCustomOrDefaultViewName.ts +4 -0
  487. package/src/domain/profiling/utils/getDefaultViewName.ts +12 -0
  488. package/src/domain/profiling/utils/getNumberOfSamples.ts +16 -0
  489. package/src/domain/record/assembly.ts +17 -0
  490. package/src/domain/record/elementsScrollPositions.ts +28 -0
  491. package/src/domain/record/eventIds.ts +17 -0
  492. package/src/domain/record/eventsUtils.ts +12 -0
  493. package/src/domain/record/index.ts +7 -0
  494. package/src/domain/record/internalApi.ts +88 -0
  495. package/src/domain/record/mutationBatch.ts +47 -0
  496. package/src/domain/record/nodeIds.ts +46 -0
  497. package/src/domain/record/record.ts +98 -0
  498. package/src/domain/record/record.types.ts +5 -0
  499. package/src/domain/record/recordingScope.ts +36 -0
  500. package/src/domain/record/serialization/index.ts +8 -0
  501. package/src/domain/record/serialization/serialization.types.ts +43 -0
  502. package/src/domain/record/serialization/serializationStats.ts +43 -0
  503. package/src/domain/record/serialization/serializationTransaction.ts +94 -0
  504. package/src/domain/record/serialization/serializationUtils.ts +103 -0
  505. package/src/domain/record/serialization/serializeAttribute.ts +55 -0
  506. package/src/domain/record/serialization/serializeAttributes.ts +194 -0
  507. package/src/domain/record/serialization/serializeDocument.ts +13 -0
  508. package/src/domain/record/serialization/serializeNode.ts +229 -0
  509. package/src/domain/record/serialization/serializeStyleSheets.ts +18 -0
  510. package/src/domain/record/shadowRootsController.ts +62 -0
  511. package/src/domain/record/startFullSnapshots.ts +84 -0
  512. package/src/domain/record/trackers/index.ts +12 -0
  513. package/src/domain/record/trackers/trackFocus.ts +16 -0
  514. package/src/domain/record/trackers/trackFrustration.ts +41 -0
  515. package/src/domain/record/trackers/trackInput.ts +128 -0
  516. package/src/domain/record/trackers/trackMediaInteraction.ts +43 -0
  517. package/src/domain/record/trackers/trackMouseInteraction.ts +74 -0
  518. package/src/domain/record/trackers/trackMove.ts +78 -0
  519. package/src/domain/record/trackers/trackMutation.ts +399 -0
  520. package/src/domain/record/trackers/trackScroll.ts +61 -0
  521. package/src/domain/record/trackers/trackStyleSheet.ts +117 -0
  522. package/src/domain/record/trackers/trackViewEnd.ts +27 -0
  523. package/src/domain/record/trackers/trackViewportResize.ts +69 -0
  524. package/src/domain/record/trackers/tracker.types.ts +3 -0
  525. package/src/domain/record/viewports.ts +68 -0
  526. package/src/domain/replayStats.ts +61 -0
  527. package/src/domain/scriptLoadingError.ts +36 -0
  528. package/src/domain/segmentCollection/buildReplayPayload.ts +52 -0
  529. package/src/domain/segmentCollection/index.ts +4 -0
  530. package/src/domain/segmentCollection/segment.ts +78 -0
  531. package/src/domain/segmentCollection/segmentCollection.ts +200 -0
  532. package/src/domain/segmentCollection/startSegmentTelemetry.ts +82 -0
  533. package/src/domain/startRecordBridge.ts +17 -0
  534. package/src/domain/startRecorderInitTelemetry.ts +90 -0
  535. package/src/entries/internal.ts +18 -0
  536. package/src/entries/internalSynthetics.ts +24 -0
  537. package/src/entries/main.ts +95 -0
  538. package/src/types/index.ts +2 -0
  539. package/src/types/sessionReplay.ts +734 -0
  540. package/src/types/sessionReplayConstants.ts +86 -0
@@ -0,0 +1,81 @@
1
+ import type { TimeoutId, ClocksState } from '@kubesense/kubesense-browser-core'
2
+ import type { LongTaskContext } from '@kubesense/kubesense-browser-rum-core'
3
+ import type { ProfilerTrace, Profiler } from './profilerApi.types'
4
+
5
+ export interface RumViewEntry {
6
+ /** Detected start time of view */
7
+ readonly startClocks: ClocksState
8
+ /** RUM view id */
9
+ readonly viewId: string
10
+ /** RUM view name */
11
+ readonly viewName: string | undefined
12
+ }
13
+
14
+ /**
15
+ * Additional data recorded during profiling session
16
+ */
17
+ export interface RumProfilerEnrichmentData {
18
+ /** List of detected long tasks */
19
+ readonly longTasks: LongTaskContext[]
20
+ /** List of detected navigation entries */
21
+ readonly views: RumViewEntry[]
22
+ }
23
+
24
+ export interface RumProfilerTrace extends ProfilerTrace, RumProfilerEnrichmentData {
25
+ /** High resolution time when profiler trace started, relative to the profiling session's time origin */
26
+ readonly startClocks: ClocksState
27
+ /** High resolution time when profiler trace ended, relative to the profiling session's time origin */
28
+ readonly endClocks: ClocksState
29
+ /** Time origin of the profiling session */
30
+ readonly clocksOrigin: ClocksState
31
+ /** Sample interval in milliseconds */
32
+ readonly sampleInterval: number
33
+ }
34
+
35
+ /**
36
+ * Describes profiler session state when it's stopped
37
+ */
38
+ export interface RumProfilerStoppedInstance {
39
+ readonly state: 'stopped'
40
+ readonly stateReason: 'session-expired' | 'stopped-by-user' | 'initializing'
41
+ }
42
+
43
+ /**
44
+ * Describes profiler session state when it's paused
45
+ * (this happens when user focuses on a different tab)
46
+ */
47
+ export interface RumProfilerPausedInstance {
48
+ readonly state: 'paused'
49
+ }
50
+
51
+ /**
52
+ * Describes profiler session state when it's running
53
+ */
54
+ export interface RumProfilerRunningInstance extends RumProfilerEnrichmentData {
55
+ readonly state: 'running'
56
+ /** Current profiler instance */
57
+ readonly profiler: Profiler
58
+ /** High resolution time when profiler session started */
59
+ readonly startClocks: ClocksState
60
+ /** Timeout id to stop current session */
61
+ readonly timeoutId: TimeoutId
62
+ /** Clean-up tasks to execute after running the Profiler */
63
+ readonly cleanupTasks: Array<() => void>
64
+ }
65
+
66
+ export type RumProfilerInstance = RumProfilerStoppedInstance | RumProfilerPausedInstance | RumProfilerRunningInstance
67
+
68
+ export interface RUMProfiler {
69
+ start: () => void
70
+ stop: () => Promise<void>
71
+ isStopped: () => boolean
72
+ isRunning: () => boolean
73
+ isPaused: () => boolean
74
+ }
75
+
76
+ export interface RUMProfilerConfiguration {
77
+ sampleIntervalMs: number // Sample stack trace every x milliseconds (defaults to 10ms for Unix, 16ms on Windows)
78
+ collectIntervalMs: number // Interval for collecting RUM Profiles (defaults to 1min)
79
+ minProfileDurationMs: number // Minimum duration of a profile for it be sent (defaults to 5s). Profiles shorter than this duration are discarded.
80
+ minNumberOfSamples: number // Minimum number of samples to be collected before it can be sent (defaults to 50). Profiles with fewer samples are discarded.
81
+ }
@@ -0,0 +1,4 @@
1
+ import { getDefaultViewName } from './getDefaultViewName'
2
+
3
+ export const getCustomOrDefaultViewName = (customViewName: string | undefined, viewPathUrl: string): string =>
4
+ customViewName || getDefaultViewName(viewPathUrl)
@@ -0,0 +1,12 @@
1
+ // This is the regex used to extract the path from the url (from SimpleUrlGroupingProcessor.java)
2
+ // It's a bit different from the one in the java code because we removed the lookbehind unsupported by Safari.
3
+ const PATH_MIXED_ALPHANUMERICS = /\/(?![vV]\d{1,2}\/)([^/\d?]*\d+[^/?]*)/g
4
+
5
+ export function getDefaultViewName(viewPathUrl: string): string {
6
+ if (!viewPathUrl) {
7
+ return '/'
8
+ }
9
+
10
+ // Replace all the mixed alphanumerics with a ?
11
+ return viewPathUrl.replace(PATH_MIXED_ALPHANUMERICS, '/?')
12
+ }
@@ -0,0 +1,16 @@
1
+ import type { ProfilerSample } from '../types'
2
+
3
+ /**
4
+ * Counts number of samples when the thread was not idle (stackId is defined)
5
+ * @param samples Array of collected samples
6
+ * @returns Number of samples
7
+ */
8
+ export function getNumberOfSamples(samples: ProfilerSample[]): number {
9
+ let numberOfSamples = 0
10
+ for (const sample of samples) {
11
+ if (sample.stackId !== undefined) {
12
+ numberOfSamples++
13
+ }
14
+ }
15
+ return numberOfSamples
16
+ }
@@ -0,0 +1,17 @@
1
+ import { timeStampNow } from '@kubesense/kubesense-browser-core'
2
+ import type { BrowserIncrementalData, BrowserIncrementalSnapshotRecord } from '../../types'
3
+ import { RecordType } from '../../types'
4
+
5
+ export function assembleIncrementalSnapshot<Data extends BrowserIncrementalData>(
6
+ source: Data['source'],
7
+ data: Omit<Data, 'source'>
8
+ ): BrowserIncrementalSnapshotRecord {
9
+ return {
10
+ data: {
11
+ source,
12
+ ...data,
13
+ } as Data,
14
+ type: RecordType.IncrementalSnapshot,
15
+ timestamp: timeStampNow(),
16
+ }
17
+ }
@@ -0,0 +1,28 @@
1
+ export type ElementsScrollPositions = ReturnType<typeof createElementsScrollPositions>
2
+ export interface ScrollPositions {
3
+ scrollLeft: number
4
+ scrollTop: number
5
+ }
6
+
7
+ export function createElementsScrollPositions() {
8
+ const scrollPositionsByElement = new WeakMap<Element, ScrollPositions>()
9
+ return {
10
+ set(element: Element | Document, scrollPositions: ScrollPositions) {
11
+ if (element === document && !document.scrollingElement) {
12
+ // cf https://drafts.csswg.org/cssom-view/#dom-document-scrollingelement,
13
+ // in some cases scrolling elements can not be defined, we don't support those for now
14
+ return
15
+ }
16
+ scrollPositionsByElement.set(
17
+ element === document ? document.scrollingElement! : (element as Element),
18
+ scrollPositions
19
+ )
20
+ },
21
+ get(element: Element) {
22
+ return scrollPositionsByElement.get(element)
23
+ },
24
+ has(element: Element) {
25
+ return scrollPositionsByElement.has(element)
26
+ },
27
+ }
28
+ }
@@ -0,0 +1,17 @@
1
+ export interface EventIds {
2
+ getIdForEvent(event: Event): number
3
+ }
4
+
5
+ export function createEventIds(): EventIds {
6
+ const eventIds = new WeakMap<Event, number>()
7
+ let nextId = 1
8
+
9
+ return {
10
+ getIdForEvent(event: Event): number {
11
+ if (!eventIds.has(event)) {
12
+ eventIds.set(event, nextId++)
13
+ }
14
+ return eventIds.get(event)!
15
+ },
16
+ }
17
+ }
@@ -0,0 +1,12 @@
1
+ import { isNodeShadowHost } from '@kubesense/kubesense-browser-rum-core'
2
+
3
+ export function isTouchEvent(event: MouseEvent | TouchEvent): event is TouchEvent {
4
+ return Boolean((event as TouchEvent).changedTouches)
5
+ }
6
+
7
+ export function getEventTarget(event: Event): Node {
8
+ if (event.composed === true && isNodeShadowHost(event.target as Node)) {
9
+ return event.composedPath()[0] as Node
10
+ }
11
+ return event.target as Node
12
+ }
@@ -0,0 +1,7 @@
1
+ export { takeFullSnapshot, takeNodeSnapshot } from './internalApi'
2
+ export { record } from './record'
3
+ export type { SerializationMetric, SerializationStats } from './serialization'
4
+ export { createSerializationStats, aggregateSerializationStats } from './serialization'
5
+ export { serializeNode, serializeDocument } from './serialization'
6
+ export { createElementsScrollPositions } from './elementsScrollPositions'
7
+ export type { ShadowRootsController } from './shadowRootsController'
@@ -0,0 +1,88 @@
1
+ import { noop, timeStampNow } from '@kubesense/kubesense-browser-core'
2
+ import type { RumConfiguration } from '@kubesense/kubesense-browser-rum-core'
3
+ import { getNodePrivacyLevel, NodePrivacyLevel } from '@kubesense/kubesense-browser-rum-core'
4
+ import type { BrowserRecord, SerializedNodeWithId } from '../../types'
5
+ import { takeFullSnapshot as doTakeFullSnapshot } from './startFullSnapshots'
6
+ import type { ShadowRootsController } from './shadowRootsController'
7
+ import type { RecordingScope } from './recordingScope'
8
+ import { createRecordingScope } from './recordingScope'
9
+ import { createElementsScrollPositions } from './elementsScrollPositions'
10
+ import { createEventIds } from './eventIds'
11
+ import { createNodeIds } from './nodeIds'
12
+ import type { EmitRecordCallback } from './record.types'
13
+ import type { SerializationTransaction } from './serialization'
14
+ import { SerializationKind, serializeInTransaction, serializeNode } from './serialization'
15
+
16
+ /**
17
+ * Take a full snapshot of the document, generating the same records that the Kubesense browser SDK
18
+ * would generate.
19
+ *
20
+ * This is an internal API function. Be sure to update kubesense-internal callers if you
21
+ * change its signature or behavior.
22
+ */
23
+ export function takeFullSnapshot({
24
+ configuration,
25
+ }: { configuration?: Partial<RumConfiguration> } = {}): BrowserRecord[] {
26
+ const records: BrowserRecord[] = []
27
+ const emitRecord: EmitRecordCallback = (record: BrowserRecord) => {
28
+ records.push(record)
29
+ }
30
+
31
+ doTakeFullSnapshot(
32
+ timeStampNow(),
33
+ SerializationKind.INITIAL_FULL_SNAPSHOT,
34
+ emitRecord,
35
+ noop,
36
+ createTemporaryRecordingScope(configuration)
37
+ )
38
+
39
+ return records
40
+ }
41
+
42
+ /**
43
+ * Take a snapshot of a DOM node, generating the serialized representation that the
44
+ * kubesense browser SDK would generate.
45
+ *
46
+ * This is an internal API function. Be sure to update Kubesense-internal callers if you
47
+ * change its signature or behavior.
48
+ */
49
+ export function takeNodeSnapshot(
50
+ node: Node,
51
+ { configuration }: { configuration?: Partial<RumConfiguration> } = {}
52
+ ): SerializedNodeWithId | null {
53
+ let serializedNode: SerializedNodeWithId | null = null
54
+
55
+ serializeInTransaction(
56
+ SerializationKind.INITIAL_FULL_SNAPSHOT,
57
+ noop,
58
+ noop,
59
+ createTemporaryRecordingScope(configuration),
60
+ (transaction: SerializationTransaction): void => {
61
+ const privacyLevel = getNodePrivacyLevel(node, transaction.scope.configuration.defaultPrivacyLevel)
62
+ if (privacyLevel === NodePrivacyLevel.HIDDEN || privacyLevel === NodePrivacyLevel.IGNORE) {
63
+ return
64
+ }
65
+ serializedNode = serializeNode(node, privacyLevel, transaction)
66
+ }
67
+ )
68
+
69
+ return serializedNode
70
+ }
71
+
72
+ function createTemporaryRecordingScope(configuration?: Partial<RumConfiguration>): RecordingScope {
73
+ return createRecordingScope(
74
+ {
75
+ defaultPrivacyLevel: NodePrivacyLevel.ALLOW,
76
+ ...configuration,
77
+ } as RumConfiguration,
78
+ createElementsScrollPositions(),
79
+ createEventIds(),
80
+ createNodeIds(),
81
+ {
82
+ addShadowRoot: noop,
83
+ removeShadowRoot: noop,
84
+ flush: noop,
85
+ stop: noop,
86
+ } as ShadowRootsController
87
+ )
88
+ }
@@ -0,0 +1,47 @@
1
+ import { noop, throttle, requestIdleCallback } from '@kubesense/kubesense-browser-core'
2
+ import type { RumMutationRecord } from '@kubesense/kubesense-browser-rum-core'
3
+
4
+ /**
5
+ * Maximum duration to wait before processing mutations. If the browser is idle, mutations will be
6
+ * processed more quickly. If the browser is busy executing small tasks (ex: rendering frames), the
7
+ * mutations will wait MUTATION_PROCESS_MAX_DELAY milliseconds before being processed. If the
8
+ * browser is busy executing a longer task, mutations will be processed after this task.
9
+ */
10
+ const MUTATION_PROCESS_MAX_DELAY = 100
11
+ /**
12
+ * Minimum duration to wait before processing mutations. This is used to batch mutations together
13
+ * and be able to deduplicate them to save processing time and bandwidth.
14
+ * 16ms is the duration of a frame at 60fps that ensure fluid UI.
15
+ */
16
+ export const MUTATION_PROCESS_MIN_DELAY = 16
17
+
18
+ export function createMutationBatch(processMutationBatch: (mutations: RumMutationRecord[]) => void) {
19
+ let cancelScheduledFlush = noop
20
+ let pendingMutations: RumMutationRecord[] = []
21
+
22
+ function flush() {
23
+ cancelScheduledFlush()
24
+ processMutationBatch(pendingMutations)
25
+ pendingMutations = []
26
+ }
27
+
28
+ const { throttled: throttledFlush, cancel: cancelThrottle } = throttle(flush, MUTATION_PROCESS_MIN_DELAY, {
29
+ leading: false,
30
+ })
31
+
32
+ return {
33
+ addMutations: (mutations: RumMutationRecord[]) => {
34
+ if (pendingMutations.length === 0) {
35
+ cancelScheduledFlush = requestIdleCallback(throttledFlush, { timeout: MUTATION_PROCESS_MAX_DELAY })
36
+ }
37
+ pendingMutations.push(...mutations)
38
+ },
39
+
40
+ flush,
41
+
42
+ stop: () => {
43
+ cancelScheduledFlush()
44
+ cancelThrottle()
45
+ },
46
+ }
47
+ }
@@ -0,0 +1,46 @@
1
+ import { getParentNode, isNodeShadowRoot } from '@kubesense/kubesense-browser-rum-core'
2
+
3
+ export type NodeWithSerializedNode = Node & { __brand: 'NodeWithSerializedNode' }
4
+ export type NodeId = number & { __brand: 'NodeId' }
5
+
6
+ export const enum NodeIdConstants {
7
+ FIRST_ID = 0,
8
+ }
9
+
10
+ export interface NodeIds {
11
+ assign(node: Node): NodeId
12
+ get(node: Node): NodeId | undefined
13
+ areAssignedForNodeAndAncestors(node: Node): node is NodeWithSerializedNode
14
+ }
15
+
16
+ export function createNodeIds(): NodeIds {
17
+ const nodeIds = new WeakMap<Node, NodeId>()
18
+ let nextNodeId = NodeIdConstants.FIRST_ID
19
+
20
+ const get = (node: Node): NodeId | undefined => nodeIds.get(node)
21
+
22
+ return {
23
+ assign: (node: Node): NodeId => {
24
+ // Try to reuse any existing id.
25
+ let nodeId = get(node)
26
+ if (nodeId === undefined) {
27
+ nodeId = nextNodeId++ as NodeId
28
+ nodeIds.set(node, nodeId)
29
+ }
30
+ return nodeId
31
+ },
32
+
33
+ get,
34
+
35
+ areAssignedForNodeAndAncestors: (node: Node): node is NodeWithSerializedNode => {
36
+ let current: Node | null = node
37
+ while (current) {
38
+ if (get(current) === undefined && !isNodeShadowRoot(current)) {
39
+ return false
40
+ }
41
+ current = getParentNode(current)
42
+ }
43
+ return true
44
+ },
45
+ }
46
+ }
@@ -0,0 +1,98 @@
1
+ import { sendToExtension } from '@kubesense/kubesense-browser-core'
2
+ import type { LifeCycle, RumConfiguration, ViewHistory } from '@kubesense/kubesense-browser-rum-core'
3
+ import * as replayStats from '../replayStats'
4
+ import type { BrowserRecord } from '../../types'
5
+ import type { Tracker } from './trackers'
6
+ import {
7
+ trackFocus,
8
+ trackFrustration,
9
+ trackInput,
10
+ trackMediaInteraction,
11
+ trackMouseInteraction,
12
+ trackMove,
13
+ trackMutation,
14
+ trackScroll,
15
+ trackStyleSheet,
16
+ trackViewEnd,
17
+ trackViewportResize,
18
+ trackVisualViewportResize,
19
+ } from './trackers'
20
+ import { createElementsScrollPositions } from './elementsScrollPositions'
21
+ import type { ShadowRootsController } from './shadowRootsController'
22
+ import { initShadowRootsController } from './shadowRootsController'
23
+ import { startFullSnapshots } from './startFullSnapshots'
24
+ import { createEventIds } from './eventIds'
25
+ import { createNodeIds } from './nodeIds'
26
+ import type { EmitRecordCallback, EmitStatsCallback } from './record.types'
27
+ import { createRecordingScope } from './recordingScope'
28
+
29
+ export interface RecordOptions {
30
+ emitRecord: EmitRecordCallback
31
+ emitStats: EmitStatsCallback
32
+ configuration: RumConfiguration
33
+ lifeCycle: LifeCycle
34
+ viewHistory: ViewHistory
35
+ }
36
+
37
+ export interface RecordAPI {
38
+ stop: () => void
39
+ flushMutations: () => void
40
+ shadowRootsController: ShadowRootsController
41
+ }
42
+
43
+ export function record(options: RecordOptions): RecordAPI {
44
+ const { emitRecord, emitStats, configuration, lifeCycle } = options
45
+ // runtime checks for user options
46
+ if (!emitRecord || !emitStats) {
47
+ throw new Error('emit functions are required')
48
+ }
49
+
50
+ const processRecord: EmitRecordCallback = (record: BrowserRecord) => {
51
+ emitRecord(record)
52
+ sendToExtension('record', { record })
53
+ const view = options.viewHistory.findView()!
54
+ replayStats.addRecord(view.id)
55
+ }
56
+
57
+ const shadowRootsController = initShadowRootsController(processRecord, emitStats)
58
+ const scope = createRecordingScope(
59
+ configuration,
60
+ createElementsScrollPositions(),
61
+ createEventIds(),
62
+ createNodeIds(),
63
+ shadowRootsController
64
+ )
65
+
66
+ const { stop: stopFullSnapshots } = startFullSnapshots(lifeCycle, processRecord, emitStats, flushMutations, scope)
67
+
68
+ function flushMutations() {
69
+ shadowRootsController.flush()
70
+ mutationTracker.flush()
71
+ }
72
+
73
+ const mutationTracker = trackMutation(document, processRecord, emitStats, scope)
74
+ const trackers: Tracker[] = [
75
+ mutationTracker,
76
+ trackMove(processRecord, scope),
77
+ trackMouseInteraction(processRecord, scope),
78
+ trackScroll(document, processRecord, scope),
79
+ trackViewportResize(processRecord, scope),
80
+ trackInput(document, processRecord, scope),
81
+ trackMediaInteraction(processRecord, scope),
82
+ trackStyleSheet(processRecord, scope),
83
+ trackFocus(processRecord, scope),
84
+ trackVisualViewportResize(processRecord, scope),
85
+ trackFrustration(lifeCycle, processRecord, scope),
86
+ trackViewEnd(lifeCycle, processRecord, flushMutations),
87
+ ]
88
+
89
+ return {
90
+ stop: () => {
91
+ shadowRootsController.stop()
92
+ trackers.forEach((tracker) => tracker.stop())
93
+ stopFullSnapshots()
94
+ },
95
+ flushMutations,
96
+ shadowRootsController,
97
+ }
98
+ }
@@ -0,0 +1,5 @@
1
+ import type { BrowserRecord } from '../../types'
2
+ import type { SerializationStats } from './serialization'
3
+
4
+ export type EmitRecordCallback<Record extends BrowserRecord = BrowserRecord> = (record: Record) => void
5
+ export type EmitStatsCallback = (stats: SerializationStats) => void
@@ -0,0 +1,36 @@
1
+ import type { RumConfiguration } from '@kubesense/kubesense-browser-rum-core'
2
+
3
+ import type { ElementsScrollPositions } from './elementsScrollPositions'
4
+ import type { EventIds } from './eventIds'
5
+ import type { NodeIds } from './nodeIds'
6
+ import type { ShadowRootsController } from './shadowRootsController'
7
+
8
+ /**
9
+ * State associated with a stream of session replay records. When a new stream of records
10
+ * starts (e.g. because recording has shut down and restarted), a new RecordingScope
11
+ * object must be created; this ensures that we don't generate records that reference ids
12
+ * or data which aren't present in the current stream.
13
+ */
14
+ export interface RecordingScope {
15
+ configuration: RumConfiguration
16
+ elementsScrollPositions: ElementsScrollPositions
17
+ eventIds: EventIds
18
+ nodeIds: NodeIds
19
+ shadowRootsController: ShadowRootsController
20
+ }
21
+
22
+ export function createRecordingScope(
23
+ configuration: RumConfiguration,
24
+ elementsScrollPositions: ElementsScrollPositions,
25
+ eventIds: EventIds,
26
+ nodeIds: NodeIds,
27
+ shadowRootsController: ShadowRootsController
28
+ ): RecordingScope {
29
+ return {
30
+ configuration,
31
+ elementsScrollPositions,
32
+ eventIds,
33
+ nodeIds,
34
+ shadowRootsController,
35
+ }
36
+ }
@@ -0,0 +1,8 @@
1
+ export { getElementInputValue } from './serializationUtils'
2
+ export { serializeDocument } from './serializeDocument'
3
+ export { serializeNode } from './serializeNode'
4
+ export { serializeAttribute } from './serializeAttribute'
5
+ export { createSerializationStats, updateSerializationStats, aggregateSerializationStats } from './serializationStats'
6
+ export type { SerializationMetric, SerializationStats } from './serializationStats'
7
+ export { serializeInTransaction, SerializationKind } from './serializationTransaction'
8
+ export type { SerializationTransaction, SerializationTransactionCallback } from './serializationTransaction'
@@ -0,0 +1,43 @@
1
+ import type { NodePrivacyLevel } from '@kubesense/kubesense-browser-rum-core'
2
+
3
+ // Those values are the only one that can be used when inheriting privacy levels from parent to
4
+ // children during serialization, since HIDDEN and IGNORE shouldn't serialize their children. This
5
+ // ensures that no children are serialized when they shouldn't.
6
+ export type ParentNodePrivacyLevel =
7
+ | typeof NodePrivacyLevel.ALLOW
8
+ | typeof NodePrivacyLevel.MASK
9
+ | typeof NodePrivacyLevel.MASK_USER_INPUT
10
+ | typeof NodePrivacyLevel.MASK_UNLESS_ALLOWLISTED
11
+
12
+ /**
13
+ * Virtual attributes. These attributes appear in the serialized attribute map of
14
+ * elements, but they're not actually derived from the DOM; they're used to represent
15
+ * metadata about the element they're attached to.
16
+ */
17
+ export interface VirtualAttributes {
18
+ /**
19
+ * For <style> and <link> elements, the rules in the element's stylesheet, extracted
20
+ * from the CSSOM.
21
+ */
22
+ _cssText?: string
23
+
24
+ /** For <audio> and <video> elements, the playback state of the element's media. */
25
+ rr_mediaState?: 'paused' | 'played'
26
+
27
+ /** For elements which are scroll containers, the element's X scroll position, if non-zero. */
28
+ rr_scrollLeft?: number
29
+
30
+ /** For elements which are scroll containers, the element's Y scroll position, if non-zero. */
31
+ rr_scrollTop?: number
32
+
33
+ /** For HIDDEN elements, the width of the element's bounding client rect. */
34
+ rr_width?: string
35
+
36
+ /** For HIDDEN elements, the height of the element's bounding client rect. */
37
+ rr_height?: string
38
+ }
39
+
40
+ export interface SerializeOptions {
41
+ /** For HIDDEN elements, the height of the element's bounding client rect. */
42
+ rr_height?: string
43
+ }
@@ -0,0 +1,43 @@
1
+ export interface SerializationMetric {
2
+ count: number
3
+ max: number
4
+ sum: number
5
+ }
6
+
7
+ export interface SerializationStats {
8
+ cssText: SerializationMetric
9
+ serializationDuration: SerializationMetric
10
+ }
11
+
12
+ export function createSerializationStats(): SerializationStats {
13
+ return {
14
+ cssText: {
15
+ count: 0,
16
+ max: 0,
17
+ sum: 0,
18
+ },
19
+ serializationDuration: {
20
+ count: 0,
21
+ max: 0,
22
+ sum: 0,
23
+ },
24
+ }
25
+ }
26
+
27
+ export function updateSerializationStats(
28
+ stats: SerializationStats,
29
+ metric: keyof SerializationStats,
30
+ value: number
31
+ ): void {
32
+ stats[metric].count += 1
33
+ stats[metric].max = Math.max(stats[metric].max, value)
34
+ stats[metric].sum += value
35
+ }
36
+
37
+ export function aggregateSerializationStats(aggregateStats: SerializationStats, stats: SerializationStats) {
38
+ for (const metric of ['cssText', 'serializationDuration'] as const) {
39
+ aggregateStats[metric].count += stats[metric].count
40
+ aggregateStats[metric].max = Math.max(aggregateStats[metric].max, stats[metric].max)
41
+ aggregateStats[metric].sum += stats[metric].sum
42
+ }
43
+ }