@kubesense/kubesense-browser-rum 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 (784) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +23 -0
  3. package/bundle/chunks/kubesenseProfiler-4b8cfd8f889074788478-kubesense-rum.js +1 -0
  4. package/bundle/chunks/kubesenseRecorder-db948e96649585a2b3e9-kubesense-rum.js +1 -0
  5. package/bundle/kubesense-rum.js +1 -1
  6. package/cjs/boot/kubesenseRecorder.d.ts +6 -0
  7. package/cjs/boot/kubesenseRecorder.js +75 -0
  8. package/cjs/boot/kubesenseRecorder.js.map +1 -0
  9. package/cjs/boot/lazyLoadProfiler.d.ts +3 -4
  10. package/cjs/boot/lazyLoadProfiler.js +18 -50
  11. package/cjs/boot/lazyLoadProfiler.js.map +1 -1
  12. package/cjs/boot/lazyLoadRecorder.d.ts +3 -4
  13. package/cjs/boot/lazyLoadRecorder.js +18 -50
  14. package/cjs/boot/lazyLoadRecorder.js.map +1 -1
  15. package/cjs/boot/postStartStrategy.d.ts +4 -4
  16. package/cjs/boot/postStartStrategy.js +89 -110
  17. package/cjs/boot/postStartStrategy.js.map +1 -1
  18. package/cjs/boot/preStartStrategy.js +21 -21
  19. package/cjs/boot/preStartStrategy.js.map +1 -1
  20. package/cjs/boot/profilerApi.js +44 -50
  21. package/cjs/boot/profilerApi.js.map +1 -1
  22. package/cjs/boot/recorderApi.d.ts +1 -3
  23. package/cjs/boot/recorderApi.js +41 -71
  24. package/cjs/boot/recorderApi.js.map +1 -1
  25. package/cjs/domain/deflate/deflateEncoder.d.ts +1 -2
  26. package/cjs/domain/deflate/deflateEncoder.js +94 -108
  27. package/cjs/domain/deflate/deflateEncoder.js.map +1 -1
  28. package/cjs/domain/deflate/deflateWorker.d.ts +3 -4
  29. package/cjs/domain/deflate/deflateWorker.js +79 -90
  30. package/cjs/domain/deflate/deflateWorker.js.map +1 -1
  31. package/cjs/domain/deflate/index.d.ts +1 -1
  32. package/cjs/domain/deflate/index.js +5 -10
  33. package/cjs/domain/getSessionReplayLink.d.ts +3 -2
  34. package/cjs/domain/getSessionReplayLink.js +17 -31
  35. package/cjs/domain/getSessionReplayLink.js.map +1 -1
  36. package/cjs/domain/profiling/actionHistory.d.ts +10 -0
  37. package/cjs/domain/profiling/actionHistory.js +37 -0
  38. package/cjs/domain/profiling/actionHistory.js.map +1 -0
  39. package/cjs/domain/profiling/kubesenseProfiler.d.ts +6 -0
  40. package/cjs/domain/profiling/kubesenseProfiler.js +243 -0
  41. package/cjs/domain/profiling/kubesenseProfiler.js.map +1 -0
  42. package/cjs/domain/profiling/longTaskHistory.d.ts +11 -0
  43. package/cjs/domain/profiling/longTaskHistory.js +22 -0
  44. package/cjs/domain/profiling/longTaskHistory.js.map +1 -0
  45. package/cjs/domain/profiling/profilerDebugIds.d.ts +2 -0
  46. package/cjs/domain/profiling/profilerDebugIds.js +18 -0
  47. package/cjs/domain/profiling/profilerDebugIds.js.map +1 -0
  48. package/cjs/domain/profiling/profilingContext.js +20 -25
  49. package/cjs/domain/profiling/profilingContext.js.map +1 -1
  50. package/cjs/domain/profiling/profilingSupported.js +6 -8
  51. package/cjs/domain/profiling/profilingSupported.js.map +1 -1
  52. package/cjs/domain/profiling/quotaCheck.d.ts +9 -0
  53. package/cjs/domain/profiling/quotaCheck.js +66 -0
  54. package/cjs/domain/profiling/quotaCheck.js.map +1 -0
  55. package/cjs/domain/profiling/test-utils/mockedTrace.d.ts +1 -1
  56. package/cjs/domain/profiling/transport/buildProfileEvent.d.ts +38 -0
  57. package/cjs/domain/profiling/transport/buildProfileEvent.js +91 -0
  58. package/cjs/domain/profiling/transport/buildProfileEvent.js.map +1 -0
  59. package/cjs/domain/profiling/transport/formDataEmitter.d.ts +5 -0
  60. package/cjs/domain/profiling/transport/formDataEmitter.js +17 -0
  61. package/cjs/domain/profiling/transport/formDataEmitter.js.map +1 -0
  62. package/cjs/domain/profiling/transport/profilingBridge.d.ts +2 -0
  63. package/cjs/domain/profiling/transport/profilingBridge.js +12 -0
  64. package/cjs/domain/profiling/transport/profilingBridge.js.map +1 -0
  65. package/cjs/domain/profiling/{types/rumProfiler.types.d.ts → types.d.ts} +13 -24
  66. package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.js +5 -5
  67. package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.js.map +1 -1
  68. package/cjs/domain/profiling/utils/getDefaultViewName.js +6 -10
  69. package/cjs/domain/profiling/utils/getDefaultViewName.js.map +1 -1
  70. package/cjs/domain/profiling/vitalHistory.d.ts +13 -0
  71. package/cjs/domain/profiling/vitalHistory.js +56 -0
  72. package/cjs/domain/profiling/vitalHistory.js.map +1 -0
  73. package/cjs/domain/record/assembly.d.ts +2 -1
  74. package/cjs/domain/record/assembly.js +15 -14
  75. package/cjs/domain/record/assembly.js.map +1 -1
  76. package/cjs/domain/record/canvas/canvasHash.d.ts +2 -0
  77. package/cjs/domain/record/canvas/canvasHash.js +33 -0
  78. package/cjs/domain/record/canvas/canvasHash.js.map +1 -0
  79. package/cjs/domain/record/canvas/canvasManager.d.ts +42 -0
  80. package/cjs/domain/record/canvas/canvasManager.js +99 -0
  81. package/cjs/domain/record/canvas/canvasManager.js.map +1 -0
  82. package/cjs/domain/record/canvas/canvasSnapshot.d.ts +8 -0
  83. package/cjs/domain/record/canvas/canvasSnapshot.js +40 -0
  84. package/cjs/domain/record/canvas/canvasSnapshot.js.map +1 -0
  85. package/cjs/domain/record/canvas/canvasUtils.d.ts +2 -0
  86. package/cjs/domain/record/canvas/canvasUtils.js +14 -0
  87. package/cjs/domain/record/canvas/canvasUtils.js.map +1 -0
  88. package/cjs/domain/record/elementsScrollPositions.js +17 -20
  89. package/cjs/domain/record/elementsScrollPositions.js.map +1 -1
  90. package/cjs/domain/record/encoding/changeDecoder.d.ts +39 -0
  91. package/cjs/domain/record/encoding/changeDecoder.js +152 -0
  92. package/cjs/domain/record/encoding/changeDecoder.js.map +1 -0
  93. package/cjs/domain/record/encoding/changeEncoder.d.ts +39 -0
  94. package/cjs/domain/record/encoding/changeEncoder.js +146 -0
  95. package/cjs/domain/record/encoding/changeEncoder.js.map +1 -0
  96. package/cjs/domain/record/encoding/index.d.ts +10 -0
  97. package/cjs/domain/record/encoding/itemIds.d.ts +32 -0
  98. package/cjs/domain/record/encoding/itemIds.js +49 -0
  99. package/cjs/domain/record/encoding/itemIds.js.map +1 -0
  100. package/cjs/domain/record/encoding/roles.d.ts +52 -0
  101. package/cjs/domain/record/encoding/roles.js +66 -0
  102. package/cjs/domain/record/encoding/roles.js.map +1 -0
  103. package/cjs/domain/record/encoding/stringIds.d.ts +15 -0
  104. package/cjs/domain/record/encoding/stringIds.js +47 -0
  105. package/cjs/domain/record/encoding/stringIds.js.map +1 -0
  106. package/cjs/domain/record/encoding/stringTable.d.ts +15 -0
  107. package/cjs/domain/record/encoding/stringTable.js +38 -0
  108. package/cjs/domain/record/encoding/stringTable.js.map +1 -0
  109. package/cjs/domain/record/eventsUtils.js +9 -10
  110. package/cjs/domain/record/eventsUtils.js.map +1 -1
  111. package/cjs/domain/record/index.d.ts +5 -2
  112. package/cjs/domain/record/index.js +13 -17
  113. package/cjs/domain/record/internalApi.d.ts +6 -6
  114. package/cjs/domain/record/internalApi.js +55 -49
  115. package/cjs/domain/record/internalApi.js.map +1 -1
  116. package/cjs/domain/record/mutationBatch.d.ts +1 -0
  117. package/cjs/domain/record/mutationBatch.js +38 -39
  118. package/cjs/domain/record/mutationBatch.js.map +1 -1
  119. package/cjs/domain/record/record.d.ts +7 -1
  120. package/cjs/domain/record/record.js +76 -87
  121. package/cjs/domain/record/record.js.map +1 -1
  122. package/cjs/domain/record/record.types.d.ts +1 -0
  123. package/cjs/domain/record/recordingScope.d.ts +7 -3
  124. package/cjs/domain/record/recordingScope.js +25 -11
  125. package/cjs/domain/record/recordingScope.js.map +1 -1
  126. package/cjs/domain/record/serialization/index.d.ts +4 -2
  127. package/cjs/domain/record/serialization/index.js +16 -18
  128. package/cjs/domain/record/serialization/insertionCursor.d.ts +57 -0
  129. package/cjs/domain/record/serialization/insertionCursor.js +55 -0
  130. package/cjs/domain/record/serialization/insertionCursor.js.map +1 -0
  131. package/cjs/domain/record/serialization/serialization.types.d.ts +0 -6
  132. package/cjs/domain/record/serialization/serializationStats.js +26 -25
  133. package/cjs/domain/record/serialization/serializationStats.js.map +1 -1
  134. package/cjs/domain/record/serialization/serializationTransaction.d.ts +44 -22
  135. package/cjs/domain/record/serialization/serializationTransaction.js +90 -36
  136. package/cjs/domain/record/serialization/serializationTransaction.js.map +1 -1
  137. package/cjs/domain/record/serialization/serializationUtils.d.ts +0 -1
  138. package/cjs/domain/record/serialization/serializationUtils.js +46 -75
  139. package/cjs/domain/record/serialization/serializationUtils.js.map +1 -1
  140. package/cjs/domain/record/serialization/serializeAttribute.js +24 -39
  141. package/cjs/domain/record/serialization/serializeAttribute.js.map +1 -1
  142. package/cjs/domain/record/serialization/serializeAttributes.d.ts +2 -2
  143. package/cjs/domain/record/serialization/serializeAttributes.js +100 -152
  144. package/cjs/domain/record/serialization/serializeAttributes.js.map +1 -1
  145. package/cjs/domain/record/serialization/serializeFullSnapshot.d.ts +5 -0
  146. package/cjs/domain/record/serialization/serializeFullSnapshot.js +14 -0
  147. package/cjs/domain/record/serialization/serializeFullSnapshot.js.map +1 -0
  148. package/cjs/domain/record/serialization/serializeMutations.d.ts +5 -0
  149. package/cjs/domain/record/serialization/serializeMutations.js +152 -0
  150. package/cjs/domain/record/serialization/serializeMutations.js.map +1 -0
  151. package/cjs/domain/record/serialization/serializeNode.d.ts +3 -6
  152. package/cjs/domain/record/serialization/serializeNode.js +116 -144
  153. package/cjs/domain/record/serialization/serializeNode.js.map +1 -1
  154. package/cjs/domain/record/shadowRootsController.d.ts +2 -2
  155. package/cjs/domain/record/shadowRootsController.js +37 -42
  156. package/cjs/domain/record/shadowRootsController.js.map +1 -1
  157. package/cjs/domain/record/startFullSnapshots.d.ts +1 -1
  158. package/cjs/domain/record/startFullSnapshots.js +38 -54
  159. package/cjs/domain/record/startFullSnapshots.js.map +1 -1
  160. package/cjs/domain/record/trackers/index.d.ts +2 -1
  161. package/cjs/domain/record/trackers/index.js +25 -27
  162. package/cjs/domain/record/trackers/trackCanvasCapture.d.ts +3 -0
  163. package/cjs/domain/record/trackers/trackCanvasCapture.js +102 -0
  164. package/cjs/domain/record/trackers/trackCanvasCapture.js.map +1 -0
  165. package/cjs/domain/record/trackers/trackCanvasContent.d.ts +3 -0
  166. package/cjs/domain/record/trackers/trackCanvasContent.js +31 -0
  167. package/cjs/domain/record/trackers/trackCanvasContent.js.map +1 -0
  168. package/cjs/domain/record/trackers/trackFocus.d.ts +1 -2
  169. package/cjs/domain/record/trackers/trackFocus.js +15 -13
  170. package/cjs/domain/record/trackers/trackFocus.js.map +1 -1
  171. package/cjs/domain/record/trackers/trackInput.d.ts +2 -2
  172. package/cjs/domain/record/trackers/trackInput.js +129 -102
  173. package/cjs/domain/record/trackers/trackInput.js.map +1 -1
  174. package/cjs/domain/record/trackers/trackMediaInteraction.js +22 -26
  175. package/cjs/domain/record/trackers/trackMediaInteraction.js.map +1 -1
  176. package/cjs/domain/record/trackers/trackMouseInteraction.js +47 -54
  177. package/cjs/domain/record/trackers/trackMouseInteraction.js.map +1 -1
  178. package/cjs/domain/record/trackers/trackMove.js +43 -49
  179. package/cjs/domain/record/trackers/trackMove.js.map +1 -1
  180. package/cjs/domain/record/trackers/trackMutation.d.ts +3 -3
  181. package/cjs/domain/record/trackers/trackMutation.js +42 -267
  182. package/cjs/domain/record/trackers/trackMutation.js.map +1 -1
  183. package/cjs/domain/record/trackers/trackScroll.js +36 -44
  184. package/cjs/domain/record/trackers/trackScroll.js.map +1 -1
  185. package/cjs/domain/record/trackers/trackStyleSheet.js +75 -84
  186. package/cjs/domain/record/trackers/trackStyleSheet.js.map +1 -1
  187. package/cjs/domain/record/trackers/trackViewEnd.js +17 -17
  188. package/cjs/domain/record/trackers/trackViewEnd.js.map +1 -1
  189. package/cjs/domain/record/trackers/trackViewportResize.d.ts +2 -3
  190. package/cjs/domain/record/trackers/trackViewportResize.js +36 -42
  191. package/cjs/domain/record/trackers/trackViewportResize.js.map +1 -1
  192. package/cjs/domain/record/viewports.js +32 -50
  193. package/cjs/domain/record/viewports.js.map +1 -1
  194. package/cjs/domain/replayStats.d.ts +1 -0
  195. package/cjs/domain/replayStats.js +36 -44
  196. package/cjs/domain/replayStats.js.map +1 -1
  197. package/cjs/domain/scriptLoadingError.js +15 -22
  198. package/cjs/domain/scriptLoadingError.js.map +1 -1
  199. package/cjs/domain/segmentCollection/buildReplayPayload.js +22 -23
  200. package/cjs/domain/segmentCollection/buildReplayPayload.js.map +1 -1
  201. package/cjs/domain/segmentCollection/buildResourcePayload.d.ts +5 -0
  202. package/cjs/domain/segmentCollection/buildResourcePayload.js +19 -0
  203. package/cjs/domain/segmentCollection/buildResourcePayload.js.map +1 -0
  204. package/cjs/domain/segmentCollection/index.d.ts +3 -0
  205. package/cjs/domain/segmentCollection/index.js +14 -11
  206. package/cjs/domain/segmentCollection/replayResourceCollection.d.ts +10 -0
  207. package/cjs/domain/segmentCollection/replayResourceCollection.js +52 -0
  208. package/cjs/domain/segmentCollection/replayResourceCollection.js.map +1 -0
  209. package/cjs/domain/segmentCollection/segment.js +50 -80
  210. package/cjs/domain/segmentCollection/segment.js.map +1 -1
  211. package/cjs/domain/segmentCollection/segmentCollection.d.ts +4 -4
  212. package/cjs/domain/segmentCollection/segmentCollection.js +87 -105
  213. package/cjs/domain/segmentCollection/segmentCollection.js.map +1 -1
  214. package/cjs/domain/segmentCollection/startDroppedSegmentRecovery.d.ts +16 -0
  215. package/cjs/domain/segmentCollection/startDroppedSegmentRecovery.js +29 -0
  216. package/cjs/domain/segmentCollection/startDroppedSegmentRecovery.js.map +1 -0
  217. package/cjs/domain/segmentCollection/startSegmentTelemetry.js +40 -42
  218. package/cjs/domain/segmentCollection/startSegmentTelemetry.js.map +1 -1
  219. package/cjs/domain/startRecordBridge.js +10 -14
  220. package/cjs/domain/startRecordBridge.js.map +1 -1
  221. package/cjs/domain/startRecorderInitTelemetry.js +42 -50
  222. package/cjs/domain/startRecorderInitTelemetry.js.map +1 -1
  223. package/cjs/entries/internal.d.ts +11 -2
  224. package/cjs/entries/internal.js +47 -28
  225. package/cjs/entries/internalSynthetics.js +26 -24
  226. package/cjs/entries/internalSynthetics.js.map +1 -1
  227. package/cjs/entries/main.d.ts +5 -3
  228. package/cjs/entries/main.js +50 -31
  229. package/cjs/entries/main.js.map +1 -1
  230. package/cjs/types/index.d.ts +1 -0
  231. package/cjs/types/profiling.d.ts +313 -0
  232. package/cjs/types/sessionReplay.d.ts +381 -3
  233. package/cjs/types/sessionReplayConstants.d.ts +57 -0
  234. package/cjs/types/sessionReplayConstants.js +104 -47
  235. package/cjs/types/sessionReplayConstants.js.map +1 -1
  236. package/esm/boot/kubesenseRecorder.mjs +75 -0
  237. package/esm/boot/kubesenseRecorder.mjs.map +1 -0
  238. package/esm/boot/lazyLoadProfiler.mjs +24 -0
  239. package/esm/boot/lazyLoadProfiler.mjs.map +1 -0
  240. package/esm/boot/lazyLoadRecorder.mjs +24 -0
  241. package/esm/boot/lazyLoadRecorder.mjs.map +1 -0
  242. package/esm/boot/postStartStrategy.mjs +97 -0
  243. package/esm/boot/postStartStrategy.mjs.map +1 -0
  244. package/esm/boot/preStartStrategy.mjs +24 -0
  245. package/esm/boot/preStartStrategy.mjs.map +1 -0
  246. package/esm/boot/profilerApi.mjs +47 -0
  247. package/esm/boot/profilerApi.mjs.map +1 -0
  248. package/esm/boot/recorderApi.mjs +43 -0
  249. package/esm/boot/recorderApi.mjs.map +1 -0
  250. package/esm/domain/deflate/deflateEncoder.mjs +96 -0
  251. package/esm/domain/deflate/deflateEncoder.mjs.map +1 -0
  252. package/esm/domain/deflate/deflateWorker.mjs +90 -0
  253. package/esm/domain/deflate/deflateWorker.mjs.map +1 -0
  254. package/esm/domain/deflate/index.mjs +3 -0
  255. package/esm/domain/getSessionReplayLink.mjs +21 -0
  256. package/esm/domain/getSessionReplayLink.mjs.map +1 -0
  257. package/esm/domain/profiling/actionHistory.mjs +36 -0
  258. package/esm/domain/profiling/actionHistory.mjs.map +1 -0
  259. package/esm/domain/profiling/kubesenseProfiler.mjs +242 -0
  260. package/esm/domain/profiling/kubesenseProfiler.mjs.map +1 -0
  261. package/esm/domain/profiling/longTaskHistory.mjs +21 -0
  262. package/esm/domain/profiling/longTaskHistory.mjs.map +1 -0
  263. package/esm/domain/profiling/profilerDebugIds.mjs +18 -0
  264. package/esm/domain/profiling/profilerDebugIds.mjs.map +1 -0
  265. package/esm/domain/profiling/profilingContext.mjs +23 -0
  266. package/esm/domain/profiling/profilingContext.mjs.map +1 -0
  267. package/esm/domain/profiling/profilingSupported.mjs +9 -0
  268. package/esm/domain/profiling/profilingSupported.mjs.map +1 -0
  269. package/esm/domain/profiling/quotaCheck.mjs +66 -0
  270. package/esm/domain/profiling/quotaCheck.mjs.map +1 -0
  271. package/esm/domain/profiling/transport/buildProfileEvent.mjs +90 -0
  272. package/esm/domain/profiling/transport/buildProfileEvent.mjs.map +1 -0
  273. package/esm/domain/profiling/transport/formDataEmitter.mjs +17 -0
  274. package/esm/domain/profiling/transport/formDataEmitter.mjs.map +1 -0
  275. package/esm/domain/profiling/transport/profilingBridge.mjs +12 -0
  276. package/esm/domain/profiling/transport/profilingBridge.mjs.map +1 -0
  277. package/esm/domain/profiling/utils/getCustomOrDefaultViewName.mjs +7 -0
  278. package/esm/domain/profiling/utils/getCustomOrDefaultViewName.mjs.map +1 -0
  279. package/esm/domain/profiling/utils/getDefaultViewName.mjs +10 -0
  280. package/esm/domain/profiling/utils/getDefaultViewName.mjs.map +1 -0
  281. package/esm/domain/profiling/vitalHistory.mjs +55 -0
  282. package/esm/domain/profiling/vitalHistory.mjs.map +1 -0
  283. package/esm/domain/record/assembly.mjs +17 -0
  284. package/esm/domain/record/assembly.mjs.map +1 -0
  285. package/esm/domain/record/canvas/canvasHash.mjs +33 -0
  286. package/esm/domain/record/canvas/canvasHash.mjs.map +1 -0
  287. package/esm/domain/record/canvas/canvasManager.mjs +99 -0
  288. package/esm/domain/record/canvas/canvasManager.mjs.map +1 -0
  289. package/esm/domain/record/canvas/canvasSnapshot.mjs +38 -0
  290. package/esm/domain/record/canvas/canvasSnapshot.mjs.map +1 -0
  291. package/esm/domain/record/canvas/canvasUtils.mjs +13 -0
  292. package/esm/domain/record/canvas/canvasUtils.mjs.map +1 -0
  293. package/esm/domain/record/elementsScrollPositions.mjs +20 -0
  294. package/esm/domain/record/elementsScrollPositions.mjs.map +1 -0
  295. package/esm/domain/record/encoding/changeDecoder.mjs +152 -0
  296. package/esm/domain/record/encoding/changeDecoder.mjs.map +1 -0
  297. package/esm/domain/record/encoding/changeEncoder.mjs +146 -0
  298. package/esm/domain/record/encoding/changeEncoder.mjs.map +1 -0
  299. package/esm/domain/record/encoding/itemIds.mjs +47 -0
  300. package/esm/domain/record/encoding/itemIds.mjs.map +1 -0
  301. package/esm/domain/record/encoding/roles.mjs +64 -0
  302. package/esm/domain/record/encoding/roles.mjs.map +1 -0
  303. package/esm/domain/record/encoding/stringIds.mjs +47 -0
  304. package/esm/domain/record/encoding/stringIds.mjs.map +1 -0
  305. package/esm/domain/record/encoding/stringTable.mjs +38 -0
  306. package/esm/domain/record/encoding/stringTable.mjs.map +1 -0
  307. package/esm/domain/record/eventsUtils.mjs +13 -0
  308. package/esm/domain/record/eventsUtils.mjs.map +1 -0
  309. package/esm/domain/record/index.mjs +8 -0
  310. package/esm/domain/record/internalApi.mjs +62 -0
  311. package/esm/domain/record/internalApi.mjs.map +1 -0
  312. package/esm/domain/record/mutationBatch.mjs +43 -0
  313. package/esm/domain/record/mutationBatch.mjs.map +1 -0
  314. package/esm/domain/record/record.mjs +79 -0
  315. package/esm/domain/record/record.mjs.map +1 -0
  316. package/esm/domain/record/recordingScope.mjs +27 -0
  317. package/esm/domain/record/recordingScope.mjs.map +1 -0
  318. package/esm/domain/record/serialization/index.mjs +9 -0
  319. package/esm/domain/record/serialization/insertionCursor.mjs +54 -0
  320. package/esm/domain/record/serialization/insertionCursor.mjs.map +1 -0
  321. package/esm/domain/record/serialization/serializationStats.mjs +31 -0
  322. package/esm/domain/record/serialization/serializationStats.mjs.map +1 -0
  323. package/esm/domain/record/serialization/serializationTransaction.mjs +92 -0
  324. package/esm/domain/record/serialization/serializationTransaction.mjs.map +1 -0
  325. package/esm/domain/record/serialization/serializationUtils.mjs +53 -0
  326. package/esm/domain/record/serialization/serializationUtils.mjs.map +1 -0
  327. package/esm/domain/record/serialization/serializeAttribute.mjs +26 -0
  328. package/esm/domain/record/serialization/serializeAttribute.mjs.map +1 -0
  329. package/esm/domain/record/serialization/serializeAttributes.mjs +113 -0
  330. package/esm/domain/record/serialization/serializeAttributes.mjs.map +1 -0
  331. package/esm/domain/record/serialization/serializeFullSnapshot.mjs +14 -0
  332. package/esm/domain/record/serialization/serializeFullSnapshot.mjs.map +1 -0
  333. package/esm/domain/record/serialization/serializeMutations.mjs +152 -0
  334. package/esm/domain/record/serialization/serializeMutations.mjs.map +1 -0
  335. package/esm/domain/record/serialization/serializeNode.mjs +126 -0
  336. package/esm/domain/record/serialization/serializeNode.mjs.map +1 -0
  337. package/esm/domain/record/shadowRootsController.mjs +40 -0
  338. package/esm/domain/record/shadowRootsController.mjs.map +1 -0
  339. package/esm/domain/record/startFullSnapshots.mjs +42 -0
  340. package/esm/domain/record/startFullSnapshots.mjs.map +1 -0
  341. package/esm/domain/record/trackers/index.mjs +13 -0
  342. package/esm/domain/record/trackers/trackCanvasCapture.mjs +102 -0
  343. package/esm/domain/record/trackers/trackCanvasCapture.mjs.map +1 -0
  344. package/esm/domain/record/trackers/trackCanvasContent.mjs +31 -0
  345. package/esm/domain/record/trackers/trackCanvasContent.mjs.map +1 -0
  346. package/esm/domain/record/trackers/trackFocus.mjs +17 -0
  347. package/esm/domain/record/trackers/trackFocus.mjs.map +1 -0
  348. package/esm/domain/record/trackers/trackInput.mjs +131 -0
  349. package/esm/domain/record/trackers/trackInput.mjs.map +1 -0
  350. package/esm/domain/record/trackers/trackMediaInteraction.mjs +25 -0
  351. package/esm/domain/record/trackers/trackMediaInteraction.mjs.map +1 -0
  352. package/esm/domain/record/trackers/trackMouseInteraction.mjs +52 -0
  353. package/esm/domain/record/trackers/trackMouseInteraction.mjs.map +1 -0
  354. package/esm/domain/record/trackers/trackMove.mjs +48 -0
  355. package/esm/domain/record/trackers/trackMove.mjs.map +1 -0
  356. package/esm/domain/record/trackers/trackMutation.mjs +45 -0
  357. package/esm/domain/record/trackers/trackMutation.mjs.map +1 -0
  358. package/esm/domain/record/trackers/trackScroll.mjs +40 -0
  359. package/esm/domain/record/trackers/trackScroll.mjs.map +1 -0
  360. package/esm/domain/record/trackers/trackStyleSheet.mjs +79 -0
  361. package/esm/domain/record/trackers/trackStyleSheet.mjs.map +1 -0
  362. package/esm/domain/record/trackers/trackViewEnd.mjs +20 -0
  363. package/esm/domain/record/trackers/trackViewEnd.mjs.map +1 -0
  364. package/esm/domain/record/trackers/trackViewportResize.mjs +39 -0
  365. package/esm/domain/record/trackers/trackViewportResize.mjs.map +1 -0
  366. package/esm/domain/record/viewports.mjs +41 -0
  367. package/esm/domain/record/viewports.mjs.map +1 -0
  368. package/esm/domain/replayStats.mjs +46 -0
  369. package/esm/domain/replayStats.mjs.map +1 -0
  370. package/esm/domain/scriptLoadingError.mjs +19 -0
  371. package/esm/domain/scriptLoadingError.mjs.map +1 -0
  372. package/esm/domain/segmentCollection/buildReplayPayload.mjs +25 -0
  373. package/esm/domain/segmentCollection/buildReplayPayload.mjs.map +1 -0
  374. package/esm/domain/segmentCollection/buildResourcePayload.mjs +19 -0
  375. package/esm/domain/segmentCollection/buildResourcePayload.mjs.map +1 -0
  376. package/esm/domain/segmentCollection/index.mjs +5 -0
  377. package/esm/domain/segmentCollection/replayResourceCollection.mjs +52 -0
  378. package/esm/domain/segmentCollection/replayResourceCollection.mjs.map +1 -0
  379. package/esm/domain/segmentCollection/segment.mjs +52 -0
  380. package/esm/domain/segmentCollection/segment.mjs.map +1 -0
  381. package/esm/domain/segmentCollection/segmentCollection.mjs +87 -0
  382. package/esm/domain/segmentCollection/segmentCollection.mjs.map +1 -0
  383. package/esm/domain/segmentCollection/startDroppedSegmentRecovery.mjs +28 -0
  384. package/esm/domain/segmentCollection/startDroppedSegmentRecovery.mjs.map +1 -0
  385. package/esm/domain/segmentCollection/startSegmentTelemetry.mjs +45 -0
  386. package/esm/domain/segmentCollection/startSegmentTelemetry.mjs.map +1 -0
  387. package/esm/domain/startRecordBridge.mjs +13 -0
  388. package/esm/domain/startRecordBridge.mjs.map +1 -0
  389. package/esm/domain/startRecorderInitTelemetry.mjs +47 -0
  390. package/esm/domain/startRecorderInitTelemetry.mjs.map +1 -0
  391. package/esm/entries/internal.mjs +8 -0
  392. package/esm/entries/internalSynthetics.mjs +22 -0
  393. package/esm/entries/internalSynthetics.mjs.map +1 -0
  394. package/esm/entries/main.mjs +35 -0
  395. package/esm/entries/main.mjs.map +1 -0
  396. package/esm/types/sessionReplayConstants.mjs +97 -0
  397. package/esm/types/sessionReplayConstants.mjs.map +1 -0
  398. package/internal/package.json +1 -1
  399. package/internal-synthetics/package.json +1 -1
  400. package/package.json +26 -15
  401. package/src/boot/kubesenseRecorder.ts +134 -0
  402. package/src/boot/lazyLoadProfiler.ts +6 -7
  403. package/src/boot/lazyLoadRecorder.ts +6 -7
  404. package/src/boot/postStartStrategy.ts +18 -16
  405. package/src/boot/profilerApi.ts +29 -19
  406. package/src/boot/recorderApi.ts +6 -21
  407. package/src/domain/deflate/deflateEncoder.ts +3 -8
  408. package/src/domain/deflate/deflateWorker.ts +8 -13
  409. package/src/domain/deflate/index.ts +1 -0
  410. package/src/domain/getSessionReplayLink.ts +15 -11
  411. package/src/domain/profiling/actionHistory.ts +66 -0
  412. package/src/domain/profiling/{profiler.ts → kubesenseProfiler.ts} +166 -79
  413. package/src/domain/profiling/longTaskHistory.ts +45 -0
  414. package/src/domain/profiling/profilerDebugIds.ts +17 -0
  415. package/src/domain/profiling/profilingContext.ts +8 -3
  416. package/src/domain/profiling/profilingSupported.ts +2 -7
  417. package/src/domain/profiling/quotaCheck.ts +89 -0
  418. package/src/domain/profiling/test-utils/mockedTrace.ts +1 -2
  419. package/src/domain/profiling/transport/buildProfileEvent.ts +143 -0
  420. package/src/domain/profiling/transport/formDataEmitter.ts +17 -0
  421. package/src/domain/profiling/transport/profilingBridge.ts +9 -0
  422. package/src/domain/profiling/{types/rumProfiler.types.ts → types.ts} +14 -26
  423. package/src/domain/profiling/vitalHistory.ts +106 -0
  424. package/src/domain/record/assembly.ts +5 -3
  425. package/src/domain/record/canvas/canvasHash.ts +54 -0
  426. package/src/domain/record/canvas/canvasManager.ts +175 -0
  427. package/src/domain/record/canvas/canvasSnapshot.ts +52 -0
  428. package/src/domain/record/canvas/canvasUtils.ts +11 -0
  429. package/src/domain/record/encoding/changeDecoder.ts +287 -0
  430. package/src/domain/record/encoding/changeEncoder.ts +327 -0
  431. package/src/domain/record/encoding/index.ts +19 -0
  432. package/src/domain/record/encoding/itemIds.ts +84 -0
  433. package/src/domain/record/encoding/roles.ts +136 -0
  434. package/src/domain/record/encoding/stringIds.ts +70 -0
  435. package/src/domain/record/encoding/stringTable.ts +68 -0
  436. package/src/domain/record/index.ts +5 -2
  437. package/src/domain/record/internalApi.ts +21 -18
  438. package/src/domain/record/mutationBatch.ts +14 -3
  439. package/src/domain/record/record.ts +35 -16
  440. package/src/domain/record/record.types.ts +1 -0
  441. package/src/domain/record/recordingScope.ts +28 -5
  442. package/src/domain/record/serialization/index.ts +4 -2
  443. package/src/domain/record/serialization/insertionCursor.ts +131 -0
  444. package/src/domain/record/serialization/serialization.types.ts +0 -16
  445. package/src/domain/record/serialization/serializationTransaction.ts +191 -37
  446. package/src/domain/record/serialization/serializationUtils.ts +1 -15
  447. package/src/domain/record/serialization/serializeAttributes.ts +36 -32
  448. package/src/domain/record/serialization/serializeFullSnapshot.ts +26 -0
  449. package/src/domain/record/serialization/serializeMutations.ts +357 -0
  450. package/src/domain/record/serialization/serializeNode.ts +200 -164
  451. package/src/domain/record/shadowRootsController.ts +4 -3
  452. package/src/domain/record/startFullSnapshots.ts +28 -41
  453. package/src/domain/record/trackers/index.ts +2 -1
  454. package/src/domain/record/trackers/trackCanvasCapture.ts +137 -0
  455. package/src/domain/record/trackers/trackCanvasContent.ts +46 -0
  456. package/src/domain/record/trackers/trackFocus.ts +4 -4
  457. package/src/domain/record/trackers/trackInput.ts +146 -41
  458. package/src/domain/record/trackers/trackMediaInteraction.ts +0 -1
  459. package/src/domain/record/trackers/trackMouseInteraction.ts +1 -2
  460. package/src/domain/record/trackers/trackMove.ts +0 -1
  461. package/src/domain/record/trackers/trackMutation.ts +17 -355
  462. package/src/domain/record/trackers/trackScroll.ts +1 -1
  463. package/src/domain/record/trackers/trackStyleSheet.ts +1 -1
  464. package/src/domain/record/trackers/trackViewEnd.ts +1 -1
  465. package/src/domain/record/trackers/trackViewportResize.ts +7 -16
  466. package/src/domain/record/trackers/tracker.types.ts +1 -1
  467. package/src/domain/replayStats.ts +5 -0
  468. package/src/domain/scriptLoadingError.ts +2 -1
  469. package/src/domain/segmentCollection/buildResourcePayload.ts +20 -0
  470. package/src/domain/segmentCollection/index.ts +3 -0
  471. package/src/domain/segmentCollection/replayResourceCollection.ts +79 -0
  472. package/src/domain/segmentCollection/segment.ts +2 -1
  473. package/src/domain/segmentCollection/segmentCollection.ts +14 -13
  474. package/src/domain/segmentCollection/startDroppedSegmentRecovery.ts +37 -0
  475. package/src/domain/segmentCollection/startSegmentTelemetry.ts +16 -2
  476. package/src/domain/startRecorderInitTelemetry.ts +5 -3
  477. package/src/entries/internal.ts +13 -2
  478. package/src/entries/internalSynthetics.ts +3 -4
  479. package/src/entries/main.ts +23 -14
  480. package/src/types/index.ts +1 -0
  481. package/src/types/profiling.ts +315 -0
  482. package/src/types/sessionReplay.ts +395 -3
  483. package/src/types/sessionReplayConstants.ts +109 -0
  484. package/bundle/chunks/profiler-6f621c66a29d9f39a9bd-kubesense-rum.js +0 -1
  485. package/bundle/chunks/recorder-c73b8d42b98d4a01f120-kubesense-rum.js +0 -1
  486. package/cjs/boot/isBrowserSupported.d.ts +0 -4
  487. package/cjs/boot/isBrowserSupported.js +0 -17
  488. package/cjs/boot/isBrowserSupported.js.map +0 -1
  489. package/cjs/boot/startRecording.d.ts +0 -6
  490. package/cjs/boot/startRecording.js +0 -45
  491. package/cjs/boot/startRecording.js.map +0 -1
  492. package/cjs/domain/deflate/index.js.map +0 -1
  493. package/cjs/domain/profiling/profiler.d.ts +0 -7
  494. package/cjs/domain/profiling/profiler.js +0 -244
  495. package/cjs/domain/profiling/profiler.js.map +0 -1
  496. package/cjs/domain/profiling/test-utils/mockedTrace.js +0 -57
  497. package/cjs/domain/profiling/test-utils/mockedTrace.js.map +0 -1
  498. package/cjs/domain/profiling/transport/assembly.d.ts +0 -21
  499. package/cjs/domain/profiling/transport/assembly.js +0 -45
  500. package/cjs/domain/profiling/transport/assembly.js.map +0 -1
  501. package/cjs/domain/profiling/transport/buildProfileEventAttributes.d.ts +0 -25
  502. package/cjs/domain/profiling/transport/buildProfileEventAttributes.js +0 -50
  503. package/cjs/domain/profiling/transport/buildProfileEventAttributes.js.map +0 -1
  504. package/cjs/domain/profiling/types/index.d.ts +0 -2
  505. package/cjs/domain/profiling/types/index.js +0 -3
  506. package/cjs/domain/profiling/types/index.js.map +0 -1
  507. package/cjs/domain/profiling/types/profilerApi.types.d.ts +0 -58
  508. package/cjs/domain/profiling/types/profilerApi.types.js +0 -5
  509. package/cjs/domain/profiling/types/profilerApi.types.js.map +0 -1
  510. package/cjs/domain/profiling/types/rumProfiler.types.js +0 -3
  511. package/cjs/domain/profiling/types/rumProfiler.types.js.map +0 -1
  512. package/cjs/domain/profiling/utils/getNumberOfSamples.d.ts +0 -7
  513. package/cjs/domain/profiling/utils/getNumberOfSamples.js +0 -18
  514. package/cjs/domain/profiling/utils/getNumberOfSamples.js.map +0 -1
  515. package/cjs/domain/record/eventIds.d.ts +0 -4
  516. package/cjs/domain/record/eventIds.js +0 -16
  517. package/cjs/domain/record/eventIds.js.map +0 -1
  518. package/cjs/domain/record/index.js.map +0 -1
  519. package/cjs/domain/record/nodeIds.d.ts +0 -15
  520. package/cjs/domain/record/nodeIds.js +0 -32
  521. package/cjs/domain/record/nodeIds.js.map +0 -1
  522. package/cjs/domain/record/record.types.js +0 -3
  523. package/cjs/domain/record/record.types.js.map +0 -1
  524. package/cjs/domain/record/serialization/index.js.map +0 -1
  525. package/cjs/domain/record/serialization/serialization.types.js +0 -3
  526. package/cjs/domain/record/serialization/serialization.types.js.map +0 -1
  527. package/cjs/domain/record/serialization/serializeDocument.d.ts +0 -3
  528. package/cjs/domain/record/serialization/serializeDocument.js +0 -11
  529. package/cjs/domain/record/serialization/serializeDocument.js.map +0 -1
  530. package/cjs/domain/record/serialization/serializeStyleSheets.d.ts +0 -2
  531. package/cjs/domain/record/serialization/serializeStyleSheets.js +0 -19
  532. package/cjs/domain/record/serialization/serializeStyleSheets.js.map +0 -1
  533. package/cjs/domain/record/trackers/index.js.map +0 -1
  534. package/cjs/domain/record/trackers/trackFrustration.d.ts +0 -7
  535. package/cjs/domain/record/trackers/trackFrustration.js +0 -31
  536. package/cjs/domain/record/trackers/trackFrustration.js.map +0 -1
  537. package/cjs/domain/record/trackers/tracker.types.js +0 -3
  538. package/cjs/domain/record/trackers/tracker.types.js.map +0 -1
  539. package/cjs/domain/segmentCollection/index.js.map +0 -1
  540. package/cjs/entries/internal.js.map +0 -1
  541. package/cjs/types/index.js +0 -18
  542. package/cjs/types/index.js.map +0 -1
  543. package/cjs/types/sessionReplay.js +0 -7
  544. package/cjs/types/sessionReplay.js.map +0 -1
  545. package/esm/boot/isBrowserSupported.d.ts +0 -4
  546. package/esm/boot/isBrowserSupported.js +0 -14
  547. package/esm/boot/isBrowserSupported.js.map +0 -1
  548. package/esm/boot/lazyLoadProfiler.d.ts +0 -4
  549. package/esm/boot/lazyLoadProfiler.js +0 -18
  550. package/esm/boot/lazyLoadProfiler.js.map +0 -1
  551. package/esm/boot/lazyLoadRecorder.d.ts +0 -4
  552. package/esm/boot/lazyLoadRecorder.js +0 -18
  553. package/esm/boot/lazyLoadRecorder.js.map +0 -1
  554. package/esm/boot/postStartStrategy.d.ts +0 -33
  555. package/esm/boot/postStartStrategy.js +0 -115
  556. package/esm/boot/postStartStrategy.js.map +0 -1
  557. package/esm/boot/preStartStrategy.d.ts +0 -6
  558. package/esm/boot/preStartStrategy.js +0 -21
  559. package/esm/boot/preStartStrategy.js.map +0 -1
  560. package/esm/boot/profilerApi.d.ts +0 -2
  561. package/esm/boot/profilerApi.js +0 -50
  562. package/esm/boot/profilerApi.js.map +0 -1
  563. package/esm/boot/recorderApi.d.ts +0 -4
  564. package/esm/boot/recorderApi.js +0 -70
  565. package/esm/boot/recorderApi.js.map +0 -1
  566. package/esm/boot/startRecording.d.ts +0 -6
  567. package/esm/boot/startRecording.js +0 -42
  568. package/esm/boot/startRecording.js.map +0 -1
  569. package/esm/domain/deflate/deflateEncoder.d.ts +0 -3
  570. package/esm/domain/deflate/deflateEncoder.js +0 -107
  571. package/esm/domain/deflate/deflateEncoder.js.map +0 -1
  572. package/esm/domain/deflate/deflateWorker.d.ts +0 -30
  573. package/esm/domain/deflate/deflateWorker.js +0 -97
  574. package/esm/domain/deflate/deflateWorker.js.map +0 -1
  575. package/esm/domain/deflate/index.d.ts +0 -3
  576. package/esm/domain/deflate/index.js +0 -3
  577. package/esm/domain/deflate/index.js.map +0 -1
  578. package/esm/domain/getSessionReplayLink.d.ts +0 -2
  579. package/esm/domain/getSessionReplayLink.js +0 -32
  580. package/esm/domain/getSessionReplayLink.js.map +0 -1
  581. package/esm/domain/profiling/profiler.d.ts +0 -7
  582. package/esm/domain/profiling/profiler.js +0 -240
  583. package/esm/domain/profiling/profiler.js.map +0 -1
  584. package/esm/domain/profiling/profilingContext.d.ts +0 -6
  585. package/esm/domain/profiling/profilingContext.js +0 -25
  586. package/esm/domain/profiling/profilingContext.js.map +0 -1
  587. package/esm/domain/profiling/profilingSupported.d.ts +0 -1
  588. package/esm/domain/profiling/profilingSupported.js +0 -8
  589. package/esm/domain/profiling/profilingSupported.js.map +0 -1
  590. package/esm/domain/profiling/test-utils/mockedTrace.d.ts +0 -3
  591. package/esm/domain/profiling/test-utils/mockedTrace.js +0 -54
  592. package/esm/domain/profiling/test-utils/mockedTrace.js.map +0 -1
  593. package/esm/domain/profiling/transport/assembly.d.ts +0 -21
  594. package/esm/domain/profiling/transport/assembly.js +0 -42
  595. package/esm/domain/profiling/transport/assembly.js.map +0 -1
  596. package/esm/domain/profiling/transport/buildProfileEventAttributes.d.ts +0 -25
  597. package/esm/domain/profiling/transport/buildProfileEventAttributes.js +0 -47
  598. package/esm/domain/profiling/transport/buildProfileEventAttributes.js.map +0 -1
  599. package/esm/domain/profiling/types/index.d.ts +0 -2
  600. package/esm/domain/profiling/types/index.js +0 -2
  601. package/esm/domain/profiling/types/index.js.map +0 -1
  602. package/esm/domain/profiling/types/profilerApi.types.d.ts +0 -58
  603. package/esm/domain/profiling/types/profilerApi.types.js +0 -4
  604. package/esm/domain/profiling/types/profilerApi.types.js.map +0 -1
  605. package/esm/domain/profiling/types/rumProfiler.types.d.ts +0 -72
  606. package/esm/domain/profiling/types/rumProfiler.types.js +0 -2
  607. package/esm/domain/profiling/types/rumProfiler.types.js.map +0 -1
  608. package/esm/domain/profiling/utils/getCustomOrDefaultViewName.d.ts +0 -1
  609. package/esm/domain/profiling/utils/getCustomOrDefaultViewName.js +0 -3
  610. package/esm/domain/profiling/utils/getCustomOrDefaultViewName.js.map +0 -1
  611. package/esm/domain/profiling/utils/getDefaultViewName.d.ts +0 -1
  612. package/esm/domain/profiling/utils/getDefaultViewName.js +0 -11
  613. package/esm/domain/profiling/utils/getDefaultViewName.js.map +0 -1
  614. package/esm/domain/profiling/utils/getNumberOfSamples.d.ts +0 -7
  615. package/esm/domain/profiling/utils/getNumberOfSamples.js +0 -15
  616. package/esm/domain/profiling/utils/getNumberOfSamples.js.map +0 -1
  617. package/esm/domain/record/assembly.d.ts +0 -2
  618. package/esm/domain/record/assembly.js +0 -13
  619. package/esm/domain/record/assembly.js.map +0 -1
  620. package/esm/domain/record/elementsScrollPositions.d.ts +0 -10
  621. package/esm/domain/record/elementsScrollPositions.js +0 -20
  622. package/esm/domain/record/elementsScrollPositions.js.map +0 -1
  623. package/esm/domain/record/eventIds.d.ts +0 -4
  624. package/esm/domain/record/eventIds.js +0 -13
  625. package/esm/domain/record/eventIds.js.map +0 -1
  626. package/esm/domain/record/eventsUtils.d.ts +0 -2
  627. package/esm/domain/record/eventsUtils.js +0 -11
  628. package/esm/domain/record/eventsUtils.js.map +0 -1
  629. package/esm/domain/record/index.d.ts +0 -7
  630. package/esm/domain/record/index.js +0 -6
  631. package/esm/domain/record/index.js.map +0 -1
  632. package/esm/domain/record/internalApi.d.ts +0 -22
  633. package/esm/domain/record/internalApi.js +0 -53
  634. package/esm/domain/record/internalApi.js.map +0 -1
  635. package/esm/domain/record/mutationBatch.d.ts +0 -12
  636. package/esm/domain/record/mutationBatch.js +0 -40
  637. package/esm/domain/record/mutationBatch.js.map +0 -1
  638. package/esm/domain/record/nodeIds.d.ts +0 -15
  639. package/esm/domain/record/nodeIds.js +0 -29
  640. package/esm/domain/record/nodeIds.js.map +0 -1
  641. package/esm/domain/record/record.d.ts +0 -16
  642. package/esm/domain/record/record.js +0 -54
  643. package/esm/domain/record/record.js.map +0 -1
  644. package/esm/domain/record/record.types.d.ts +0 -4
  645. package/esm/domain/record/record.types.js +0 -2
  646. package/esm/domain/record/record.types.js.map +0 -1
  647. package/esm/domain/record/recordingScope.d.ts +0 -19
  648. package/esm/domain/record/recordingScope.js +0 -10
  649. package/esm/domain/record/recordingScope.js.map +0 -1
  650. package/esm/domain/record/serialization/index.d.ts +0 -8
  651. package/esm/domain/record/serialization/index.js +0 -7
  652. package/esm/domain/record/serialization/index.js.map +0 -1
  653. package/esm/domain/record/serialization/serialization.types.d.ts +0 -28
  654. package/esm/domain/record/serialization/serialization.types.js +0 -2
  655. package/esm/domain/record/serialization/serialization.types.js.map +0 -1
  656. package/esm/domain/record/serialization/serializationStats.d.ts +0 -12
  657. package/esm/domain/record/serialization/serializationStats.js +0 -27
  658. package/esm/domain/record/serialization/serializationStats.js.map +0 -1
  659. package/esm/domain/record/serialization/serializationTransaction.d.ts +0 -45
  660. package/esm/domain/record/serialization/serializationTransaction.js +0 -35
  661. package/esm/domain/record/serialization/serializationTransaction.js.map +0 -1
  662. package/esm/domain/record/serialization/serializationUtils.d.ts +0 -18
  663. package/esm/domain/record/serialization/serializationUtils.js +0 -80
  664. package/esm/domain/record/serialization/serializationUtils.js.map +0 -1
  665. package/esm/domain/record/serialization/serializeAttribute.d.ts +0 -4
  666. package/esm/domain/record/serialization/serializeAttribute.js +0 -38
  667. package/esm/domain/record/serialization/serializeAttribute.js.map +0 -1
  668. package/esm/domain/record/serialization/serializeAttributes.d.ts +0 -7
  669. package/esm/domain/record/serialization/serializeAttributes.js +0 -161
  670. package/esm/domain/record/serialization/serializeAttributes.js.map +0 -1
  671. package/esm/domain/record/serialization/serializeDocument.d.ts +0 -3
  672. package/esm/domain/record/serialization/serializeDocument.js +0 -8
  673. package/esm/domain/record/serialization/serializeDocument.js.map +0 -1
  674. package/esm/domain/record/serialization/serializeNode.d.ts +0 -7
  675. package/esm/domain/record/serialization/serializeNode.js +0 -149
  676. package/esm/domain/record/serialization/serializeNode.js.map +0 -1
  677. package/esm/domain/record/serialization/serializeStyleSheets.d.ts +0 -2
  678. package/esm/domain/record/serialization/serializeStyleSheets.js +0 -16
  679. package/esm/domain/record/serialization/serializeStyleSheets.js.map +0 -1
  680. package/esm/domain/record/shadowRootsController.d.ts +0 -11
  681. package/esm/domain/record/shadowRootsController.js +0 -41
  682. package/esm/domain/record/shadowRootsController.js.map +0 -1
  683. package/esm/domain/record/startFullSnapshots.d.ts +0 -9
  684. package/esm/domain/record/startFullSnapshots.js +0 -55
  685. package/esm/domain/record/startFullSnapshots.js.map +0 -1
  686. package/esm/domain/record/trackers/index.d.ts +0 -12
  687. package/esm/domain/record/trackers/index.js +0 -12
  688. package/esm/domain/record/trackers/index.js.map +0 -1
  689. package/esm/domain/record/trackers/trackFocus.d.ts +0 -5
  690. package/esm/domain/record/trackers/trackFocus.js +0 -12
  691. package/esm/domain/record/trackers/trackFocus.js.map +0 -1
  692. package/esm/domain/record/trackers/trackFrustration.d.ts +0 -7
  693. package/esm/domain/record/trackers/trackFrustration.js +0 -28
  694. package/esm/domain/record/trackers/trackFrustration.js.map +0 -1
  695. package/esm/domain/record/trackers/trackInput.d.ts +0 -4
  696. package/esm/domain/record/trackers/trackInput.js +0 -101
  697. package/esm/domain/record/trackers/trackInput.js.map +0 -1
  698. package/esm/domain/record/trackers/trackMediaInteraction.d.ts +0 -5
  699. package/esm/domain/record/trackers/trackMediaInteraction.js +0 -26
  700. package/esm/domain/record/trackers/trackMediaInteraction.js.map +0 -1
  701. package/esm/domain/record/trackers/trackMouseInteraction.d.ts +0 -5
  702. package/esm/domain/record/trackers/trackMouseInteraction.js +0 -56
  703. package/esm/domain/record/trackers/trackMouseInteraction.js.map +0 -1
  704. package/esm/domain/record/trackers/trackMove.d.ts +0 -9
  705. package/esm/domain/record/trackers/trackMove.js +0 -51
  706. package/esm/domain/record/trackers/trackMove.js.map +0 -1
  707. package/esm/domain/record/trackers/trackMutation.d.ts +0 -11
  708. package/esm/domain/record/trackers/trackMutation.js +0 -266
  709. package/esm/domain/record/trackers/trackMutation.js.map +0 -1
  710. package/esm/domain/record/trackers/trackScroll.d.ts +0 -5
  711. package/esm/domain/record/trackers/trackScroll.js +0 -45
  712. package/esm/domain/record/trackers/trackScroll.js.map +0 -1
  713. package/esm/domain/record/trackers/trackStyleSheet.d.ts +0 -6
  714. package/esm/domain/record/trackers/trackStyleSheet.js +0 -85
  715. package/esm/domain/record/trackers/trackStyleSheet.js.map +0 -1
  716. package/esm/domain/record/trackers/trackViewEnd.d.ts +0 -5
  717. package/esm/domain/record/trackers/trackViewEnd.js +0 -17
  718. package/esm/domain/record/trackers/trackViewEnd.js.map +0 -1
  719. package/esm/domain/record/trackers/trackViewportResize.d.ts +0 -6
  720. package/esm/domain/record/trackers/trackViewportResize.js +0 -42
  721. package/esm/domain/record/trackers/trackViewportResize.js.map +0 -1
  722. package/esm/domain/record/trackers/tracker.types.d.ts +0 -3
  723. package/esm/domain/record/trackers/tracker.types.js +0 -2
  724. package/esm/domain/record/trackers/tracker.types.js.map +0 -1
  725. package/esm/domain/record/viewports.d.ts +0 -20
  726. package/esm/domain/record/viewports.js +0 -55
  727. package/esm/domain/record/viewports.js.map +0 -1
  728. package/esm/domain/replayStats.d.ts +0 -8
  729. package/esm/domain/replayStats.js +0 -51
  730. package/esm/domain/replayStats.js.map +0 -1
  731. package/esm/domain/scriptLoadingError.d.ts +0 -6
  732. package/esm/domain/scriptLoadingError.js +0 -23
  733. package/esm/domain/scriptLoadingError.js.map +0 -1
  734. package/esm/domain/segmentCollection/buildReplayPayload.d.ts +0 -15
  735. package/esm/domain/segmentCollection/buildReplayPayload.js +0 -23
  736. package/esm/domain/segmentCollection/buildReplayPayload.js.map +0 -1
  737. package/esm/domain/segmentCollection/index.d.ts +0 -4
  738. package/esm/domain/segmentCollection/index.js +0 -4
  739. package/esm/domain/segmentCollection/index.js.map +0 -1
  740. package/esm/domain/segmentCollection/segment.d.ts +0 -16
  741. package/esm/domain/segmentCollection/segment.js +0 -46
  742. package/esm/domain/segmentCollection/segment.js.map +0 -1
  743. package/esm/domain/segmentCollection/segmentCollection.d.ts +0 -31
  744. package/esm/domain/segmentCollection/segmentCollection.js +0 -106
  745. package/esm/domain/segmentCollection/segmentCollection.js.map +0 -1
  746. package/esm/domain/segmentCollection/startSegmentTelemetry.d.ts +0 -6
  747. package/esm/domain/segmentCollection/startSegmentTelemetry.js +0 -44
  748. package/esm/domain/segmentCollection/startSegmentTelemetry.js.map +0 -1
  749. package/esm/domain/startRecordBridge.d.ts +0 -5
  750. package/esm/domain/startRecordBridge.js +0 -14
  751. package/esm/domain/startRecordBridge.js.map +0 -1
  752. package/esm/domain/startRecorderInitTelemetry.d.ts +0 -15
  753. package/esm/domain/startRecorderInitTelemetry.js +0 -52
  754. package/esm/domain/startRecorderInitTelemetry.js.map +0 -1
  755. package/esm/entries/internal.d.ts +0 -11
  756. package/esm/entries/internal.js +0 -4
  757. package/esm/entries/internal.js.map +0 -1
  758. package/esm/entries/internalSynthetics.d.ts +0 -2
  759. package/esm/entries/internalSynthetics.js +0 -23
  760. package/esm/entries/internalSynthetics.js.map +0 -1
  761. package/esm/entries/main.d.ts +0 -23
  762. package/esm/entries/main.js +0 -31
  763. package/esm/entries/main.js.map +0 -1
  764. package/esm/types/index.d.ts +0 -2
  765. package/esm/types/index.js +0 -2
  766. package/esm/types/index.js.map +0 -1
  767. package/esm/types/sessionReplay.d.ts +0 -703
  768. package/esm/types/sessionReplay.js +0 -6
  769. package/esm/types/sessionReplay.js.map +0 -1
  770. package/esm/types/sessionReplayConstants.d.ts +0 -49
  771. package/esm/types/sessionReplayConstants.js +0 -46
  772. package/esm/types/sessionReplayConstants.js.map +0 -1
  773. package/src/boot/isBrowserSupported.ts +0 -14
  774. package/src/boot/startRecording.ts +0 -70
  775. package/src/domain/profiling/transport/assembly.ts +0 -78
  776. package/src/domain/profiling/transport/buildProfileEventAttributes.ts +0 -66
  777. package/src/domain/profiling/types/index.ts +0 -2
  778. package/src/domain/profiling/types/profilerApi.types.ts +0 -87
  779. package/src/domain/profiling/utils/getNumberOfSamples.ts +0 -16
  780. package/src/domain/record/eventIds.ts +0 -17
  781. package/src/domain/record/nodeIds.ts +0 -46
  782. package/src/domain/record/serialization/serializeDocument.ts +0 -13
  783. package/src/domain/record/serialization/serializeStyleSheets.ts +0 -18
  784. package/src/domain/record/trackers/trackFrustration.ts +0 -41
@@ -0,0 +1,152 @@
1
+ import { ChangeType, StringRole } from "../../../types/sessionReplayConstants.mjs";
2
+ import { createStringTable } from "./stringTable.mjs";
3
+ //#region src/domain/record/encoding/changeDecoder.ts
4
+ function createChangeDecoder({ allowObsoleteStringRepresentations = false, keepRoles = false } = {}) {
5
+ const self = {
6
+ decode(record) {
7
+ return decodeChangeRecord(record, self.stringTable, allowObsoleteStringRepresentations);
8
+ },
9
+ stringTable: createStringTable(allowObsoleteStringRepresentations, keepRoles)
10
+ };
11
+ return self;
12
+ }
13
+ function decodeChangeRecord(record, stringTable, allowObsoleteStringRepresentations) {
14
+ const decodedData = [];
15
+ for (const change of record.data) switch (change[0]) {
16
+ case ChangeType.AddString:
17
+ if (!allowObsoleteStringRepresentations) throw new Error("Obsolete AddString change: string table entries are defined by role now");
18
+ for (let i = 1; i < change.length; i++) stringTable.add(change[i], StringRole.Default);
19
+ break;
20
+ case ChangeType.AddRoleAnnotatedStrings:
21
+ for (let i = 1; i < change.length; i++) {
22
+ const [role, ...newStrings] = change[i];
23
+ for (const newString of newStrings) stringTable.add(newString, role);
24
+ }
25
+ break;
26
+ case ChangeType.ClearStrings:
27
+ stringTable.clear();
28
+ break;
29
+ case ChangeType.AddNode: {
30
+ const decoded = [ChangeType.AddNode];
31
+ for (let i = 1; i < change.length; i++) decoded.push(decodeAddNodeChange(change[i], stringTable));
32
+ decodedData.push(decoded);
33
+ break;
34
+ }
35
+ case ChangeType.RemoveNode:
36
+ decodedData.push(change);
37
+ break;
38
+ case ChangeType.Attribute: {
39
+ const decoded = [ChangeType.Attribute];
40
+ for (let i = 1; i < change.length; i++) decoded.push(decodeAttributeChange(change[i], stringTable));
41
+ decodedData.push(decoded);
42
+ break;
43
+ }
44
+ case ChangeType.Text: {
45
+ const decoded = [ChangeType.Text];
46
+ for (let i = 1; i < change.length; i++) decoded.push(decodeTextChange(change[i], stringTable));
47
+ decodedData.push(decoded);
48
+ break;
49
+ }
50
+ case ChangeType.InputValue: {
51
+ const decoded = [ChangeType.InputValue];
52
+ for (let i = 1; i < change.length; i++) decoded.push(decodeInputValueChange(change[i], stringTable));
53
+ decodedData.push(decoded);
54
+ break;
55
+ }
56
+ case ChangeType.Size:
57
+ case ChangeType.ScrollPosition:
58
+ case ChangeType.AttachedStyleSheets:
59
+ case ChangeType.MediaPlaybackState:
60
+ case ChangeType.VisualViewport:
61
+ case ChangeType.InputSelection:
62
+ decodedData.push(change);
63
+ break;
64
+ case ChangeType.AddStyleSheet: {
65
+ const decoded = [ChangeType.AddStyleSheet];
66
+ for (let i = 1; i < change.length; i++) decoded.push(decodeAddStyleSheetChange(change[i], stringTable));
67
+ decodedData.push(decoded);
68
+ break;
69
+ }
70
+ case ChangeType.ImageContent: {
71
+ const decoded = [ChangeType.ImageContent];
72
+ for (let i = 1; i < change.length; i++) {
73
+ const imageContentChange = change[i];
74
+ decoded.push([imageContentChange[0], stringTable.decodeAnnotated(imageContentChange[1])]);
75
+ }
76
+ decodedData.push(decoded);
77
+ break;
78
+ }
79
+ default: throw new Error(`Unsupported ChangeType: ${change[0]}`);
80
+ }
81
+ return {
82
+ ...record,
83
+ data: decodedData
84
+ };
85
+ }
86
+ function decodeAddNodeChange(change, stringTable) {
87
+ const insertionPoint = change[0];
88
+ const nodeName = stringTable.decode(change[1]);
89
+ const decodedNodeName = stringTable.decodeAnnotated(change[1]);
90
+ switch (nodeName) {
91
+ case "#cdata-section":
92
+ case "#document":
93
+ case "#document-fragment":
94
+ case "#shadow-root": return [insertionPoint, decodedNodeName];
95
+ case "#doctype": {
96
+ const [, , name, publicId, systemId] = change;
97
+ return [
98
+ insertionPoint,
99
+ decodedNodeName,
100
+ stringTable.decodeAnnotated(name),
101
+ stringTable.decodeAnnotated(publicId),
102
+ stringTable.decodeAnnotated(systemId)
103
+ ];
104
+ }
105
+ case "#text": {
106
+ const [, , textContent] = change;
107
+ return [
108
+ insertionPoint,
109
+ decodedNodeName,
110
+ stringTable.decodeAnnotated(textContent)
111
+ ];
112
+ }
113
+ default: {
114
+ const decodedChange = [insertionPoint, decodedNodeName];
115
+ const [, , ...attrs] = change;
116
+ for (const [name, value] of attrs) decodedChange.push([stringTable.decodeAnnotated(name), stringTable.decodeAnnotated(value)]);
117
+ return decodedChange;
118
+ }
119
+ }
120
+ }
121
+ function decodeAttributeChange(change, stringTable) {
122
+ const [nodeId, ...mutations] = change;
123
+ const decodedMutations = mutations.map((mutation) => {
124
+ if (mutation.length === 1) return [stringTable.decodeAnnotated(mutation[0])];
125
+ return [stringTable.decodeAnnotated(mutation[0]), stringTable.decodeAnnotated(mutation[1])];
126
+ });
127
+ const decodedChange = [nodeId];
128
+ decodedChange.push(...decodedMutations);
129
+ return decodedChange;
130
+ }
131
+ function decodeTextChange(change, stringTable) {
132
+ return [change[0], stringTable.decodeAnnotated(change[1])];
133
+ }
134
+ function decodeInputValueChange(change, stringTable) {
135
+ return [change[0], stringTable.decodeAnnotated(change[1])];
136
+ }
137
+ function decodeAddStyleSheetChange(change, stringTable) {
138
+ const rules = change[0];
139
+ const decodedRules = Array.isArray(rules) ? rules.map((rule) => stringTable.decodeAnnotated(rule)) : stringTable.decodeAnnotated(rules);
140
+ if (change.length === 1) return [decodedRules];
141
+ const decodedMediaList = change[1].map((item) => stringTable.decodeAnnotated(item));
142
+ if (change.length === 2) return [decodedRules, decodedMediaList];
143
+ return [
144
+ decodedRules,
145
+ decodedMediaList,
146
+ change[2]
147
+ ];
148
+ }
149
+ //#endregion
150
+ export { createChangeDecoder };
151
+
152
+ //# sourceMappingURL=changeDecoder.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeDecoder.mjs","names":[],"sources":["../../../../src/domain/record/encoding/changeDecoder.ts"],"sourcesContent":["import { ChangeType, StringRole } from '../../../types'\nimport type {\n AddDocTypeNodeChange,\n AddRoleAnnotatedStringsChange,\n AddElementNodeChange,\n AddNodeChange,\n AddStyleSheetChange,\n AddTextNodeChange,\n AttributeAssignmentOrDeletion,\n AttributeChange,\n BrowserChangeRecord,\n BrowserFullSnapshotChangeRecord,\n Change,\n InputValueChange,\n StyleSheetRules,\n TextChange,\n ImageContentChange,\n} from '../../../types'\nimport type { StringTable } from './stringTable'\nimport { createStringTable } from './stringTable'\n\n/**\n * ChangeDecoder converts a BrowserChangeRecord, or a stream of BrowserChangeRecords, into\n * a more human-readable form by:\n * - Removing the changes that manage the string table.\n * - Replacing string table references in all other changes with their literal values.\n *\n * This makes it easier to visualize the contents of BrowserChangeRecords or to write test\n * expectations against the record's content.\n */\nexport interface ChangeDecoder {\n decode(record: BrowserChangeRecord): BrowserChangeRecord\n decode(record: BrowserFullSnapshotChangeRecord): BrowserFullSnapshotChangeRecord\n decode(\n record: BrowserChangeRecord | BrowserFullSnapshotChangeRecord\n ): BrowserChangeRecord | BrowserFullSnapshotChangeRecord\n\n stringTable: StringTable\n}\n\nexport interface ChangeDecoderOptions {\n /**\n * If true, accept the string representations that the ChangeEncoder does not produce:\n * - AddStringChange (replaced by AddRoleAnnotatedStringsChange)\n * - StringLiteral (only string table references are generated)\n * - RoleAnnotatedStringLiteral (only string table references are generated)\n *\n * When this option is false (the default), ChangeDecoder will throw when it encounters\n * these obsolete string representations.\n *\n * In the future, we expect that certain KubeSense features will be unavailable for\n * recordings which include obsolete string representations, so it's important to be\n * sure that we don't accidentally generate them.\n */\n allowObsoleteStringRepresentations?: boolean\n\n /**\n * If true, decode string references to RoleAnnotatedStringLiteral objects. This allows\n * you to inspect the recorded role annotations. Defaults to false.\n */\n keepRoles?: boolean\n}\n\nexport function createChangeDecoder({\n allowObsoleteStringRepresentations = false,\n keepRoles = false,\n}: ChangeDecoderOptions = {}): ChangeDecoder {\n const self = {\n decode(\n record: BrowserChangeRecord | BrowserFullSnapshotChangeRecord\n ): BrowserChangeRecord | BrowserFullSnapshotChangeRecord {\n return decodeChangeRecord(record, self.stringTable, allowObsoleteStringRepresentations)\n },\n\n stringTable: createStringTable(allowObsoleteStringRepresentations, keepRoles),\n } as ChangeDecoder\n\n return self\n}\n\nfunction decodeChangeRecord(\n record: BrowserChangeRecord | BrowserFullSnapshotChangeRecord,\n stringTable: StringTable,\n allowObsoleteStringRepresentations: boolean\n): BrowserChangeRecord | BrowserFullSnapshotChangeRecord {\n const decodedData: Change[] = []\n\n for (const change of record.data) {\n switch (change[0]) {\n case ChangeType.AddString:\n if (!allowObsoleteStringRepresentations) {\n throw new Error('Obsolete AddString change: string table entries are defined by role now')\n }\n\n // Update the string table.\n for (let i = 1; i < change.length; i++) {\n stringTable.add(change[i] as string, StringRole.Default)\n }\n\n // Deliberately don't include this change in the decoded record.\n break\n\n case ChangeType.AddRoleAnnotatedStrings:\n // Update the string table, remembering the role each run was defined in so that the\n // decoded record can carry it when the decoder was asked to keep roles.\n for (let i = 1; i < change.length; i++) {\n const [role, ...newStrings] = change[i] as AddRoleAnnotatedStringsChange\n for (const newString of newStrings) {\n stringTable.add(newString, role)\n }\n }\n\n // Deliberately don't include this change in the decoded record.\n break\n\n case ChangeType.ClearStrings:\n stringTable.clear()\n\n // Deliberately don't include this change in the decoded record.\n break\n\n case ChangeType.AddNode: {\n const decoded: [typeof ChangeType.AddNode, ...AddNodeChange[]] = [ChangeType.AddNode]\n for (let i = 1; i < change.length; i++) {\n decoded.push(decodeAddNodeChange(change[i] as AddNodeChange, stringTable))\n }\n decodedData.push(decoded)\n break\n }\n\n case ChangeType.RemoveNode:\n decodedData.push(change)\n break\n\n case ChangeType.Attribute: {\n const decoded: [typeof ChangeType.Attribute, ...AttributeChange[]] = [ChangeType.Attribute]\n for (let i = 1; i < change.length; i++) {\n decoded.push(decodeAttributeChange(change[i] as AttributeChange, stringTable))\n }\n decodedData.push(decoded)\n break\n }\n\n case ChangeType.Text: {\n const decoded: [typeof ChangeType.Text, ...TextChange[]] = [ChangeType.Text]\n for (let i = 1; i < change.length; i++) {\n decoded.push(decodeTextChange(change[i] as TextChange, stringTable))\n }\n decodedData.push(decoded)\n break\n }\n\n case ChangeType.InputValue: {\n const decoded: [typeof ChangeType.InputValue, ...InputValueChange[]] = [ChangeType.InputValue]\n for (let i = 1; i < change.length; i++) {\n decoded.push(decodeInputValueChange(change[i] as InputValueChange, stringTable))\n }\n decodedData.push(decoded)\n break\n }\n\n case ChangeType.Size:\n case ChangeType.ScrollPosition:\n case ChangeType.AttachedStyleSheets:\n case ChangeType.MediaPlaybackState:\n case ChangeType.VisualViewport:\n case ChangeType.InputSelection:\n decodedData.push(change)\n break\n\n case ChangeType.AddStyleSheet: {\n const decoded: [typeof ChangeType.AddStyleSheet, ...AddStyleSheetChange[]] = [ChangeType.AddStyleSheet]\n for (let i = 1; i < change.length; i++) {\n decoded.push(decodeAddStyleSheetChange(change[i] as AddStyleSheetChange, stringTable))\n }\n decodedData.push(decoded)\n break\n }\n\n case ChangeType.ImageContent: {\n const decoded: [typeof ChangeType.ImageContent, ...ImageContentChange[]] = [ChangeType.ImageContent]\n for (let i = 1; i < change.length; i++) {\n const imageContentChange = change[i] as ImageContentChange\n decoded.push([imageContentChange[0], stringTable.decodeAnnotated(imageContentChange[1])])\n }\n decodedData.push(decoded)\n break\n }\n\n default:\n change satisfies never\n throw new Error(`Unsupported ChangeType: ${change[0] as any}`)\n }\n }\n\n return { ...record, data: decodedData }\n}\n\nfunction decodeAddNodeChange(change: AddNodeChange, stringTable: StringTable): AddNodeChange {\n const insertionPoint = change[0]\n\n // Which kind of node this is has to be decided from the node name on its own, but the name that\n // goes into the decoded record is the annotated one.\n const nodeName = stringTable.decode(change[1])\n const decodedNodeName = stringTable.decodeAnnotated(change[1])\n\n switch (nodeName) {\n case '#cdata-section':\n case '#document':\n case '#document-fragment':\n case '#shadow-root':\n return [insertionPoint, decodedNodeName]\n\n case '#doctype': {\n const [, , name, publicId, systemId] = change as AddDocTypeNodeChange\n // The schema says an annotated '#doctype' carries the node name role, but the role here is\n // whatever the record gave it, which is exactly what a reader wants to see. The cast keeps a\n // record that got the role wrong legible, rather than hiding it.\n return [\n insertionPoint,\n decodedNodeName,\n stringTable.decodeAnnotated(name),\n stringTable.decodeAnnotated(publicId),\n stringTable.decodeAnnotated(systemId),\n ] as AddDocTypeNodeChange\n }\n\n case '#text': {\n const [, , textContent] = change as AddTextNodeChange\n // Cast for the same reason as '#doctype' above.\n return [insertionPoint, decodedNodeName, stringTable.decodeAnnotated(textContent)] as AddTextNodeChange\n }\n\n default: {\n const decodedChange: AddElementNodeChange = [insertionPoint, decodedNodeName]\n\n const [, , ...attrs] = change as AddElementNodeChange\n for (const [name, value] of attrs) {\n decodedChange.push([stringTable.decodeAnnotated(name), stringTable.decodeAnnotated(value)])\n }\n\n return decodedChange\n }\n }\n}\n\nfunction decodeAttributeChange(change: AttributeChange, stringTable: StringTable): AttributeChange {\n const [nodeId, ...mutations] = change\n\n const decodedMutations: AttributeAssignmentOrDeletion[] = mutations.map((mutation) => {\n if (mutation.length === 1) {\n return [stringTable.decodeAnnotated(mutation[0])]\n }\n return [stringTable.decodeAnnotated(mutation[0]), stringTable.decodeAnnotated(mutation[1])]\n })\n\n const decodedChange: AttributeChange = [nodeId]\n decodedChange.push(...decodedMutations)\n return decodedChange\n}\n\nfunction decodeTextChange(change: TextChange, stringTable: StringTable): TextChange {\n return [change[0], stringTable.decodeAnnotated(change[1])]\n}\n\nfunction decodeInputValueChange(change: InputValueChange, stringTable: StringTable): InputValueChange {\n return [change[0], stringTable.decodeAnnotated(change[1])]\n}\n\nfunction decodeAddStyleSheetChange(change: AddStyleSheetChange, stringTable: StringTable): AddStyleSheetChange {\n const rules = change[0]\n const decodedRules: StyleSheetRules = Array.isArray(rules)\n ? rules.map((rule) => stringTable.decodeAnnotated(rule))\n : stringTable.decodeAnnotated(rules)\n\n if (change.length === 1) {\n return [decodedRules]\n }\n\n const decodedMediaList = change[1].map((item) => stringTable.decodeAnnotated(item))\n\n if (change.length === 2) {\n return [decodedRules, decodedMediaList]\n }\n\n return [decodedRules, decodedMediaList, change[2]]\n}\n"],"mappings":";;;AA+DA,SAAgB,oBAAoB,EAClC,qCAAqC,OACrC,YAAY,UACY,CAAC,GAAkB;CAC3C,MAAM,OAAO;EACX,OACE,QACuD;GACvD,OAAO,mBAAmB,QAAQ,KAAK,aAAa,kCAAkC;EACxF;EAEA,aAAa,kBAAkB,oCAAoC,SAAS;CAC9E;CAEA,OAAO;AACT;AAEA,SAAS,mBACP,QACA,aACA,oCACuD;CACvD,MAAM,cAAwB,CAAC;CAE/B,KAAK,MAAM,UAAU,OAAO,MAC1B,QAAQ,OAAO,IAAf;EACE,KAAK,WAAW;GACd,IAAI,CAAC,oCACH,MAAM,IAAI,MAAM,yEAAyE;GAI3F,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KACjC,YAAY,IAAI,OAAO,IAAc,WAAW,OAAO;GAIzD;EAEF,KAAK,WAAW;GAGd,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;IACtC,MAAM,CAAC,MAAM,GAAG,cAAc,OAAO;IACrC,KAAK,MAAM,aAAa,YACtB,YAAY,IAAI,WAAW,IAAI;GAEnC;GAGA;EAEF,KAAK,WAAW;GACd,YAAY,MAAM;GAGlB;EAEF,KAAK,WAAW,SAAS;GACvB,MAAM,UAA2D,CAAC,WAAW,OAAO;GACpF,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KACjC,QAAQ,KAAK,oBAAoB,OAAO,IAAqB,WAAW,CAAC;GAE3E,YAAY,KAAK,OAAO;GACxB;EACF;EAEA,KAAK,WAAW;GACd,YAAY,KAAK,MAAM;GACvB;EAEF,KAAK,WAAW,WAAW;GACzB,MAAM,UAA+D,CAAC,WAAW,SAAS;GAC1F,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KACjC,QAAQ,KAAK,sBAAsB,OAAO,IAAuB,WAAW,CAAC;GAE/E,YAAY,KAAK,OAAO;GACxB;EACF;EAEA,KAAK,WAAW,MAAM;GACpB,MAAM,UAAqD,CAAC,WAAW,IAAI;GAC3E,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KACjC,QAAQ,KAAK,iBAAiB,OAAO,IAAkB,WAAW,CAAC;GAErE,YAAY,KAAK,OAAO;GACxB;EACF;EAEA,KAAK,WAAW,YAAY;GAC1B,MAAM,UAAiE,CAAC,WAAW,UAAU;GAC7F,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KACjC,QAAQ,KAAK,uBAAuB,OAAO,IAAwB,WAAW,CAAC;GAEjF,YAAY,KAAK,OAAO;GACxB;EACF;EAEA,KAAK,WAAW;EAChB,KAAK,WAAW;EAChB,KAAK,WAAW;EAChB,KAAK,WAAW;EAChB,KAAK,WAAW;EAChB,KAAK,WAAW;GACd,YAAY,KAAK,MAAM;GACvB;EAEF,KAAK,WAAW,eAAe;GAC7B,MAAM,UAAuE,CAAC,WAAW,aAAa;GACtG,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KACjC,QAAQ,KAAK,0BAA0B,OAAO,IAA2B,WAAW,CAAC;GAEvF,YAAY,KAAK,OAAO;GACxB;EACF;EAEA,KAAK,WAAW,cAAc;GAC5B,MAAM,UAAqE,CAAC,WAAW,YAAY;GACnG,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;IACtC,MAAM,qBAAqB,OAAO;IAClC,QAAQ,KAAK,CAAC,mBAAmB,IAAI,YAAY,gBAAgB,mBAAmB,EAAE,CAAC,CAAC;GAC1F;GACA,YAAY,KAAK,OAAO;GACxB;EACF;EAEA,SAEE,MAAM,IAAI,MAAM,2BAA2B,OAAO,IAAW;CACjE;CAGF,OAAO;EAAE,GAAG;EAAQ,MAAM;CAAY;AACxC;AAEA,SAAS,oBAAoB,QAAuB,aAAyC;CAC3F,MAAM,iBAAiB,OAAO;CAI9B,MAAM,WAAW,YAAY,OAAO,OAAO,EAAE;CAC7C,MAAM,kBAAkB,YAAY,gBAAgB,OAAO,EAAE;CAE7D,QAAQ,UAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,gBACH,OAAO,CAAC,gBAAgB,eAAe;EAEzC,KAAK,YAAY;GACf,MAAM,KAAK,MAAM,UAAU,YAAY;GAIvC,OAAO;IACL;IACA;IACA,YAAY,gBAAgB,IAAI;IAChC,YAAY,gBAAgB,QAAQ;IACpC,YAAY,gBAAgB,QAAQ;GACtC;EACF;EAEA,KAAK,SAAS;GACZ,MAAM,KAAK,eAAe;GAE1B,OAAO;IAAC;IAAgB;IAAiB,YAAY,gBAAgB,WAAW;GAAC;EACnF;EAEA,SAAS;GACP,MAAM,gBAAsC,CAAC,gBAAgB,eAAe;GAE5E,MAAM,KAAK,GAAG,SAAS;GACvB,KAAK,MAAM,CAAC,MAAM,UAAU,OAC1B,cAAc,KAAK,CAAC,YAAY,gBAAgB,IAAI,GAAG,YAAY,gBAAgB,KAAK,CAAC,CAAC;GAG5F,OAAO;EACT;CACF;AACF;AAEA,SAAS,sBAAsB,QAAyB,aAA2C;CACjG,MAAM,CAAC,QAAQ,GAAG,aAAa;CAE/B,MAAM,mBAAoD,UAAU,KAAK,aAAa;EACpF,IAAI,SAAS,WAAW,GACtB,OAAO,CAAC,YAAY,gBAAgB,SAAS,EAAE,CAAC;EAElD,OAAO,CAAC,YAAY,gBAAgB,SAAS,EAAE,GAAG,YAAY,gBAAgB,SAAS,EAAE,CAAC;CAC5F,CAAC;CAED,MAAM,gBAAiC,CAAC,MAAM;CAC9C,cAAc,KAAK,GAAG,gBAAgB;CACtC,OAAO;AACT;AAEA,SAAS,iBAAiB,QAAoB,aAAsC;CAClF,OAAO,CAAC,OAAO,IAAI,YAAY,gBAAgB,OAAO,EAAE,CAAC;AAC3D;AAEA,SAAS,uBAAuB,QAA0B,aAA4C;CACpG,OAAO,CAAC,OAAO,IAAI,YAAY,gBAAgB,OAAO,EAAE,CAAC;AAC3D;AAEA,SAAS,0BAA0B,QAA6B,aAA+C;CAC7G,MAAM,QAAQ,OAAO;CACrB,MAAM,eAAgC,MAAM,QAAQ,KAAK,IACrD,MAAM,KAAK,SAAS,YAAY,gBAAgB,IAAI,CAAC,IACrD,YAAY,gBAAgB,KAAK;CAErC,IAAI,OAAO,WAAW,GACpB,OAAO,CAAC,YAAY;CAGtB,MAAM,mBAAmB,OAAO,EAAE,CAAC,KAAK,SAAS,YAAY,gBAAgB,IAAI,CAAC;CAElF,IAAI,OAAO,WAAW,GACpB,OAAO,CAAC,cAAc,gBAAgB;CAGxC,OAAO;EAAC;EAAc;EAAkB,OAAO;CAAE;AACnD"}
@@ -0,0 +1,146 @@
1
+ import { ChangeType, StringRole } from "../../../types/sessionReplayConstants.mjs";
2
+ import { createString } from "./roles.mjs";
3
+ //#region src/domain/record/encoding/changeEncoder.ts
4
+ function createChangeEncoder(stringIds) {
5
+ let flushedChanges = [];
6
+ let run = createRunChangeEncoder(stringIds);
7
+ const endRun = () => {
8
+ run.flushInto(flushedChanges);
9
+ run = createRunChangeEncoder(stringIds);
10
+ };
11
+ const clearStringTable = () => {
12
+ endRun();
13
+ flushedChanges.push([ChangeType.ClearStrings]);
14
+ stringIds.clear();
15
+ };
16
+ const add = (type, data) => {
17
+ run.add(type, data);
18
+ if (stringIds.size + run.pendingStringCount >= 1e6) clearStringTable();
19
+ };
20
+ const flush = () => {
21
+ endRun();
22
+ const changes = flushedChanges;
23
+ flushedChanges = [];
24
+ return changes;
25
+ };
26
+ return {
27
+ add,
28
+ flush
29
+ };
30
+ }
31
+ function createRunChangeEncoder(stringIds) {
32
+ const pendingChanges = {};
33
+ const pendingGroups = /* @__PURE__ */ new Map();
34
+ const unresolvedChanges = [];
35
+ let pendingStringCount = 0;
36
+ let changeHasPendingStrings = false;
37
+ const referenceString = (literal) => {
38
+ const id = stringIds.get(literal);
39
+ if (id !== void 0) return id;
40
+ changeHasPendingStrings = true;
41
+ let group = pendingGroups.get(literal.role);
42
+ if (!group) {
43
+ group = {
44
+ role: literal.role,
45
+ strings: /* @__PURE__ */ new Map(),
46
+ references: 0
47
+ };
48
+ pendingGroups.set(literal.role, group);
49
+ }
50
+ group.references++;
51
+ const existingPendingString = group.strings.get(literal.string);
52
+ if (existingPendingString) return existingPendingString;
53
+ const pendingString = {
54
+ literal,
55
+ id: void 0
56
+ };
57
+ group.strings.set(literal.string, pendingString);
58
+ pendingStringCount++;
59
+ return pendingString;
60
+ };
61
+ const encodeStrings = (array) => {
62
+ for (let index = 0, length = array.length; index < length; index++) {
63
+ const item = array[index];
64
+ if (typeof item === "string") array[index] = referenceString(createString(StringRole.Default, item));
65
+ else if (Array.isArray(item)) encodeStrings(item);
66
+ else if (isRoleAnnotatedStringLiteral(item)) array[index] = referenceString(item);
67
+ }
68
+ };
69
+ const generateStringTableUpdates = () => {
70
+ if (pendingGroups.size === 0) return;
71
+ const stringTableUpdates = [ChangeType.AddRoleAnnotatedStrings];
72
+ for (const group of Array.from(pendingGroups.values()).sort(byDescendingReferences)) {
73
+ const update = [group.role];
74
+ for (const pendingString of group.strings.values()) {
75
+ pendingString.id = stringIds.getOrInsert(pendingString.literal);
76
+ update.push(pendingString.literal.string);
77
+ }
78
+ stringTableUpdates.push(update);
79
+ }
80
+ return stringTableUpdates;
81
+ };
82
+ const add = (type, data) => {
83
+ if (!(type in pendingChanges)) pendingChanges[type] = [type];
84
+ if (Array.isArray(data)) {
85
+ changeHasPendingStrings = false;
86
+ encodeStrings(data);
87
+ if (changeHasPendingStrings) unresolvedChanges.push(data);
88
+ }
89
+ pendingChanges[type].push(data);
90
+ };
91
+ const flushInto = (output) => {
92
+ const stringTableUpdates = generateStringTableUpdates();
93
+ if (stringTableUpdates) output.push(stringTableUpdates);
94
+ for (const change of unresolvedChanges) resolvePendingStrings(change);
95
+ [
96
+ ChangeType.AddNode,
97
+ ChangeType.RemoveNode,
98
+ ChangeType.Attribute,
99
+ ChangeType.Text,
100
+ ChangeType.InputValue,
101
+ ChangeType.InputSelection,
102
+ ChangeType.Size,
103
+ ChangeType.ScrollPosition,
104
+ ChangeType.AddStyleSheet,
105
+ ChangeType.AttachedStyleSheets,
106
+ ChangeType.MediaPlaybackState,
107
+ ChangeType.VisualViewport,
108
+ ChangeType.ImageContent
109
+ ].forEach((changeType) => {
110
+ const change = pendingChanges[changeType];
111
+ if (change) output.push(change);
112
+ });
113
+ };
114
+ return {
115
+ add,
116
+ flushInto,
117
+ get pendingStringCount() {
118
+ return pendingStringCount;
119
+ }
120
+ };
121
+ }
122
+ /**
123
+ * Replaces every string in the given change with the id it was assigned. A run gives every
124
+ * pending string an id before it resolves anything, so by this point they all have one.
125
+ */
126
+ function resolvePendingStrings(array) {
127
+ for (let index = 0, length = array.length; index < length; index++) {
128
+ const item = array[index];
129
+ if (Array.isArray(item)) resolvePendingStrings(item);
130
+ else if (isPendingString(item)) array[index] = item.id;
131
+ }
132
+ }
133
+ function byDescendingReferences(a, b) {
134
+ return b.references - a.references;
135
+ }
136
+ function isRoleAnnotatedStringLiteral(item) {
137
+ return typeof item === "object" && item !== null && "string" in item;
138
+ }
139
+ /** Every object left in change data once encodeStrings() has been over it is one of these. */
140
+ function isPendingString(item) {
141
+ return typeof item === "object" && item !== null && "literal" in item;
142
+ }
143
+ //#endregion
144
+ export { createChangeEncoder };
145
+
146
+ //# sourceMappingURL=changeEncoder.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeEncoder.mjs","names":[],"sources":["../../../../src/domain/record/encoding/changeEncoder.ts"],"sourcesContent":["import type { AddRoleAnnotatedStringsChange, Change, RoleAnnotatedStringLiteral } from '../../../types'\nimport { ChangeType, StringRole } from '../../../types'\nimport { createString } from './roles'\nimport { StringIdConstants } from './stringIds'\nimport type { StringId, StringIds } from './stringIds'\n\ntype ChangeData<T extends ChangeType> =\n Extract<Change, [T, ...unknown[]]> extends [T, ...infer Rest] ? Rest[number] : never\n\ntype StringTableChangeTypes =\n typeof ChangeType.AddString | typeof ChangeType.AddRoleAnnotatedStrings | typeof ChangeType.ClearStrings\n\n/**\n * The change operations a caller can add. Callers are not allowed to generate change\n * operations that manipulate the string table; that's the exclusive responsibility of the\n * encoder.\n */\ntype EncodableChangeType = Exclude<ChangeType, StringTableChangeTypes>\n\n/**\n * ChangeEncoder handles the low-level work of building compact, optimized sequences of\n * Changes. In particular, it:\n * - Converts literal strings to string table references, to eliminate the duplication\n * of transferring the same strings repeatedly.\n * - Groups the strings it defines by role to minimize the cost of transmitting role information.\n * - Sorts the busiest string groups first, so that the strings which are referenced most\n * frequently tend to get ids which have fewer digits and are thus cheaper to reference.\n * - Groups changes by type, instead of transmitting them strictly in order, so that we\n * can avoid transmitting a separate Change data structure with an independent type tag\n * for each small mutation. (It's safe to do this for changes that occur within the same\n * SerializationTransaction since they logically happen at the same time.)\n * - Clears the string table when it reaches its soft maximum size, so that there is always\n * room for the strings the encoder needs to define. Strings are therefore never transmitted\n * outside of the string table.\n */\nexport interface ChangeEncoder {\n /**\n * Encode a Change of the given type and add it to the internal buffer.\n *\n * The encoder takes ownership of `data`; the caller must not modify it after adding it.\n */\n add<T extends EncodableChangeType>(type: T, data: ChangeData<T>): void\n\n /** Flush the internal buffer, returning all Changes added since the last flush(). */\n flush(): Change[]\n}\n\nexport function createChangeEncoder(stringIds: StringIds): ChangeEncoder {\n // Changes are encoded in runs. A run ends when the string table reaches its maximum\n // size and is cleared; the changes in each run thus always share a single string id\n // namespace. The currently-active run ends when the caller flushes the encoder.\n\n // The changes of the runs that have already ended, waiting for the caller to flush them.\n let flushedChanges: Change[] = []\n\n // The run that the changes being added now belong to.\n let run = createRunChangeEncoder(stringIds)\n\n // Ends the current run, appending the changes it encoded to those of the runs before it,\n // and starts a new one.\n const endRun = (): void => {\n run.flushInto(flushedChanges)\n run = createRunChangeEncoder(stringIds)\n }\n\n // Clears the string table. This has the effect of creating a new string id namespace, so\n // we also need to end the current run to ensure that the changes we've generated so far\n // play back in the context of the previous namespace.\n const clearStringTable = (): void => {\n endRun()\n flushedChanges.push([ChangeType.ClearStrings])\n stringIds.clear()\n }\n\n const add = <T extends EncodableChangeType>(type: T, data: ChangeData<T>): void => {\n run.add(type, data)\n\n // If this change pushed the string table past its soft maximum size, we need to clear\n // the string table.\n if (stringIds.size + run.pendingStringCount >= Number(StringIdConstants.SOFT_MAX_SIZE)) {\n clearStringTable()\n }\n }\n\n const flush = (): Change[] => {\n endRun()\n\n const changes = flushedChanges\n flushedChanges = []\n\n return changes\n }\n\n return { add, flush }\n}\n\ntype StringTableUpdates = [typeof ChangeType.AddRoleAnnotatedStrings, ...AddRoleAnnotatedStringsChange[]]\n\n/** A string which is waiting for a string table id. */\ninterface PendingString {\n /** The string itself, along with the role it belongs to. */\n literal: RoleAnnotatedStringLiteral\n /** The id this string was given; undefined until string table ids have been assigned. */\n id: StringId | undefined\n}\n\n/** A group of strings with the same role which are waiting for string table ids. */\ninterface PendingStringGroup {\n /** The role all of these strings belong to. */\n role: StringRole\n /** The strings, keyed by value, in the order they were first encountered. */\n strings: Map<string, PendingString>\n /** How many times the changes being encoded refer to a string in this run. */\n references: number\n}\n\n/**\n * RunChangeEncoder encodes the changes of a single run for ChangeEncoder. Changes within\n * a run are grouped together to optimize their representation, and they share a common\n * string id namespace.\n */\ninterface RunChangeEncoder {\n /**\n * Encode a Change of the given type and add it to the run.\n *\n * The run takes ownership of `data`; the caller must not modify it after adding it.\n */\n add<T extends EncodableChangeType>(type: T, data: ChangeData<T>): void\n\n /**\n * End the run, appending the Changes it encoded to the given output array. The run must\n * not be used again afterwards.\n */\n flushInto(output: Change[]): void\n\n /** The number of strings the run will add to the string table when it ends. */\n get pendingStringCount(): number\n}\n\nfunction createRunChangeEncoder(stringIds: StringIds): RunChangeEncoder {\n // The changes added during this run, grouped by type.\n const pendingChanges: Partial<Record<ChangeType, unknown[]>> = {}\n\n // Every string in the changes added during this run which isn't in the string table yet,\n // grouped by role.\n const pendingGroups = new Map<StringRole, PendingStringGroup>()\n\n // The changes added during this run that hold a string with no id yet, and so need a\n // second pass once the run has handed out the ids. Tracking them minimizes the amount\n // of work the second pass has to do; many changes, especially after the full snapshot,\n // don't introduce any new strings and hence don't require a second pass.\n const unresolvedChanges: unknown[][] = []\n\n // How many strings pendingGroups holds.\n let pendingStringCount = 0\n\n // Set while a change is being encoded if any of its strings has no id yet.\n let changeHasPendingStrings = false\n\n // The reference that stands in for a string in the change data: its id, when the string\n // is already in the string table, and a PendingString when it isn't. The ids depend on\n // how the strings are grouped and on how often each of them is referenced, so we can't\n // greedily assign ids for new strings as soon as we encounter them; we need to wait for\n // the run to end.\n const referenceString = (literal: RoleAnnotatedStringLiteral): StringId | PendingString => {\n const id = stringIds.get(literal)\n if (id !== undefined) {\n return id\n }\n\n changeHasPendingStrings = true\n\n let group = pendingGroups.get(literal.role)\n if (!group) {\n group = { role: literal.role, strings: new Map(), references: 0 }\n pendingGroups.set(literal.role, group)\n }\n group.references++\n\n const existingPendingString = group.strings.get(literal.string)\n if (existingPendingString) {\n return existingPendingString\n }\n\n const pendingString: PendingString = { literal, id: undefined }\n group.strings.set(literal.string, pendingString)\n pendingStringCount++\n return pendingString\n }\n\n // A helper that searches for strings in arbitrarily-nested arrays and replaces each one it\n // finds with a reference to it.\n const encodeStrings = (array: any[]): void => {\n for (let index = 0, length = array.length; index < length; index++) {\n const item = array[index]\n if (typeof item === 'string') {\n array[index] = referenceString(createString(StringRole.Default, item))\n } else if (Array.isArray(item)) {\n encodeStrings(item)\n } else if (isRoleAnnotatedStringLiteral(item)) {\n array[index] = referenceString(item)\n }\n }\n }\n\n // Inserts the strings that aren't in the string table yet, positionally assigning them\n // ids, and returns the resulting serialized string table update.\n const generateStringTableUpdates = (): StringTableUpdates | undefined => {\n if (pendingGroups.size === 0) {\n return undefined\n }\n\n // AddRoleAnnotatedStrings operations logically append to the string table, and the id\n // of each string is just its index in the table. Because a string table reference\n // costs one byte per decimal digit of the target string's index, we sort the groups\n // so that more frequently referenced groups appear first; this tends to reduce the\n // cost of string table references overall in the recording.\n const stringTableUpdates: StringTableUpdates = [ChangeType.AddRoleAnnotatedStrings]\n for (const group of Array.from(pendingGroups.values()).sort(byDescendingReferences)) {\n const update: AddRoleAnnotatedStringsChange = [group.role]\n for (const pendingString of group.strings.values()) {\n pendingString.id = stringIds.getOrInsert(pendingString.literal)\n update.push(pendingString.literal.string)\n }\n stringTableUpdates.push(update)\n }\n\n return stringTableUpdates\n }\n\n const add = <T extends EncodableChangeType>(type: T, data: ChangeData<T>): void => {\n if (!(type in pendingChanges)) {\n pendingChanges[type] = [type]\n }\n\n // Not every kind of change data is an array; a RemoveNode change is a bare node id.\n if (Array.isArray(data)) {\n changeHasPendingStrings = false\n encodeStrings(data)\n if (changeHasPendingStrings) {\n unresolvedChanges.push(data)\n }\n }\n\n pendingChanges[type]!.push(data)\n }\n\n const flushInto = (output: Change[]): void => {\n // String table updates have to come before any change that refers to them.\n const stringTableUpdates = generateStringTableUpdates()\n if (stringTableUpdates) {\n output.push(stringTableUpdates)\n }\n\n // Every string has an id assigned now, so we can resolve the pending strings.\n for (const change of unresolvedChanges) {\n resolvePendingStrings(change)\n }\n\n // Place all changes into a single array. Because the player always just plays back\n // the changes in order, the ordering of the changes matters; if a dependency can\n // exist between two kinds of change, then the dependent change must come after the\n // change it depends on. This list defines an ordering that ensures that these\n // dependencies are always satisfied.\n //\n // Only the changes of this run need to be ordered this way. Callers add changes in an\n // order that already satisfies their dependencies, so a change can only depend on one\n // that was added before it, which is one in this run or in a run that already ended;\n // it's grouping the changes by type that reorders them, and that happens within a run.\n ;[\n ChangeType.AddNode,\n ChangeType.RemoveNode,\n ChangeType.Attribute,\n ChangeType.Text,\n ChangeType.InputValue,\n ChangeType.InputSelection,\n ChangeType.Size,\n ChangeType.ScrollPosition,\n ChangeType.AddStyleSheet,\n ChangeType.AttachedStyleSheets,\n ChangeType.MediaPlaybackState,\n ChangeType.VisualViewport,\n ChangeType.ImageContent,\n ].forEach((changeType: ChangeType): void => {\n const change = pendingChanges[changeType]\n if (change) {\n output.push(change as Change)\n }\n })\n }\n\n return {\n add,\n flushInto,\n get pendingStringCount(): number {\n return pendingStringCount\n },\n }\n}\n\n/**\n * Replaces every string in the given change with the id it was assigned. A run gives every\n * pending string an id before it resolves anything, so by this point they all have one.\n */\nfunction resolvePendingStrings(array: any[]): void {\n for (let index = 0, length = array.length; index < length; index++) {\n const item = array[index]\n if (Array.isArray(item)) {\n resolvePendingStrings(item)\n } else if (isPendingString(item)) {\n array[index] = item.id\n }\n }\n}\n\nfunction byDescendingReferences(a: PendingStringGroup, b: PendingStringGroup): number {\n return b.references - a.references\n}\n\nfunction isRoleAnnotatedStringLiteral(item: unknown): item is RoleAnnotatedStringLiteral {\n return typeof item === 'object' && item !== null && 'string' in item\n}\n\n/** Every object left in change data once encodeStrings() has been over it is one of these. */\nfunction isPendingString(item: unknown): item is PendingString {\n return typeof item === 'object' && item !== null && 'literal' in item\n}\n"],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ //#region src/domain/record/encoding/itemIds.ts
2
+ function createEventIds() {
3
+ return createWeakIdMap(1);
4
+ }
5
+ function createNodeIds() {
6
+ return createWeakIdMap(0);
7
+ }
8
+ function createStyleSheetIds() {
9
+ return createWeakIdMap(0);
10
+ }
11
+ function createWeakIdMap(firstId) {
12
+ return createItemIds(() => /* @__PURE__ */ new WeakMap(), firstId);
13
+ }
14
+ function createItemIds(createMap, firstId) {
15
+ let map = createMap();
16
+ let nextId = firstId;
17
+ const get = (object) => map.get(object);
18
+ return {
19
+ clear() {
20
+ if (nextId === firstId) return;
21
+ map = createMap();
22
+ nextId = firstId;
23
+ },
24
+ delete(object) {
25
+ map.delete(object);
26
+ },
27
+ get,
28
+ getOrInsert(object) {
29
+ let id = get(object);
30
+ if (id === void 0) {
31
+ id = nextId++;
32
+ map.set(object, id);
33
+ }
34
+ return id;
35
+ },
36
+ get nextId() {
37
+ return nextId;
38
+ },
39
+ get size() {
40
+ return nextId - firstId;
41
+ }
42
+ };
43
+ }
44
+ //#endregion
45
+ export { createEventIds, createNodeIds, createStyleSheetIds };
46
+
47
+ //# sourceMappingURL=itemIds.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"itemIds.mjs","names":[],"sources":["../../../../src/domain/record/encoding/itemIds.ts"],"sourcesContent":["export type EventId = number & { __brand: 'EventId' }\nexport type EventIds = ItemIds<Event, EventId>\nexport const enum EventIdConstants {\n FIRST_ID = 1,\n}\nexport function createEventIds(): EventIds {\n return createWeakIdMap(EventIdConstants.FIRST_ID as EventId)\n}\n\nexport type NodeId = number & { __brand: 'NodeId' }\nexport type NodeIds = ItemIds<Node, NodeId>\nexport const enum NodeIdConstants {\n FIRST_ID = 0,\n}\nexport function createNodeIds(): NodeIds {\n return createWeakIdMap(NodeIdConstants.FIRST_ID as NodeId)\n}\n\nexport type StyleSheetId = number & { __brand: 'StyleSheetId' }\nexport type StyleSheetIds = ItemIds<CSSStyleSheet, StyleSheetId>\nexport const enum StyleSheetIdConstants {\n FIRST_ID = 0,\n}\nexport function createStyleSheetIds(): StyleSheetIds {\n return createWeakIdMap(StyleSheetIdConstants.FIRST_ID as StyleSheetId)\n}\n\nexport interface ItemIds<ItemType, ItemId extends number> {\n clear(this: void): void\n delete(this: void, item: ItemType): void\n get(this: void, item: ItemType): ItemId | undefined\n getOrInsert(this: void, item: ItemType): ItemId\n get nextId(): ItemId\n get size(): number\n}\n\nfunction createWeakIdMap<ItemType extends object, ItemId extends number>(firstId: ItemId): ItemIds<ItemType, ItemId> {\n return createItemIds(() => new WeakMap<ItemType, ItemId>(), firstId)\n}\n\ninterface MapLike<Key, Value> {\n delete(key: Key): void\n get(key: Key): Value | undefined\n set(key: Key, value: Value): void\n}\n\nfunction createItemIds<ItemType, ItemId extends number>(\n createMap: () => MapLike<ItemType, ItemId>,\n firstId: ItemId\n): ItemIds<ItemType, ItemId> {\n let map = createMap()\n let nextId = firstId\n\n const get = (object: ItemType): ItemId | undefined => map.get(object)\n\n return {\n clear(): void {\n if (nextId === firstId) {\n return\n }\n map = createMap()\n nextId = firstId\n },\n delete(object: ItemType): void {\n map.delete(object)\n },\n get,\n getOrInsert(object: ItemType): ItemId {\n // Try to reuse any existing id.\n let id = get(object)\n if (id === undefined) {\n id = nextId++ as ItemId\n map.set(object, id)\n }\n return id\n },\n get nextId(): ItemId {\n return nextId\n },\n get size(): number {\n return nextId - firstId\n },\n }\n}\n"],"mappings":";AAKA,SAAgB,iBAA2B;CACzC,OAAO,gBAAA,CAAoD;AAC7D;AAOA,SAAgB,gBAAyB;CACvC,OAAO,gBAAA,CAAkD;AAC3D;AAOA,SAAgB,sBAAqC;CACnD,OAAO,gBAAA,CAA8D;AACvE;AAWA,SAAS,gBAAgE,SAA4C;CACnH,OAAO,oCAAoB,IAAI,QAA0B,GAAG,OAAO;AACrE;AAQA,SAAS,cACP,WACA,SAC2B;CAC3B,IAAI,MAAM,UAAU;CACpB,IAAI,SAAS;CAEb,MAAM,OAAO,WAAyC,IAAI,IAAI,MAAM;CAEpE,OAAO;EACL,QAAc;GACZ,IAAI,WAAW,SACb;GAEF,MAAM,UAAU;GAChB,SAAS;EACX;EACA,OAAO,QAAwB;GAC7B,IAAI,OAAO,MAAM;EACnB;EACA;EACA,YAAY,QAA0B;GAEpC,IAAI,KAAK,IAAI,MAAM;GACnB,IAAI,OAAO,KAAA,GAAW;IACpB,KAAK;IACL,IAAI,IAAI,QAAQ,EAAE;GACpB;GACA,OAAO;EACT;EACA,IAAI,SAAiB;GACnB,OAAO;EACT;EACA,IAAI,OAAe;GACjB,OAAO,SAAS;EAClB;CACF;AACF"}
@@ -0,0 +1,64 @@
1
+ import { StringRole } from "../../../types/sessionReplayConstants.mjs";
2
+ //#region src/domain/record/encoding/roles.ts
3
+ /** Create a serialized string literal annotated with the given role. */
4
+ function createString(role, string) {
5
+ return {
6
+ role,
7
+ string
8
+ };
9
+ }
10
+ /**
11
+ * Given a normalized tag name, an attribute name, and an attribute value, returns a
12
+ * serialized attribute assignment annotated with the appropriate roles.
13
+ */
14
+ function createAttributeAssignment(tagName, attributeName, attributeValue) {
15
+ return [createString(StringRole.AttributeName, attributeName), createString(attributeValueRole(tagName, attributeName), attributeValue)];
16
+ }
17
+ /**
18
+ * Given a normalized tag name, an attribute name, and an attribute value, returns a
19
+ * serialized attribute assignment or deletion annotated with the appropriate roles.
20
+ */
21
+ function createAttributeAssignmentOrDeletion(tagName, attributeName, attributeValue) {
22
+ const name = createString(StringRole.AttributeName, attributeName);
23
+ if (attributeValue === null) return [name];
24
+ return [name, createString(attributeValueRole(tagName, attributeName), attributeValue)];
25
+ }
26
+ /**
27
+ * Elements whose `value` attribute holds form input. Every other element that carries a `value`
28
+ * attribute — `<li>`, `<button>`, `<meter>`, `<param>`, and the rest — holds an ordinary attribute
29
+ * value there, and masking it would change how the page renders rather than hide anything private.
30
+ */
31
+ const FORM_ELEMENT_NAMES = /* @__PURE__ */ new Set([
32
+ "input",
33
+ "option",
34
+ "select",
35
+ "textarea"
36
+ ]);
37
+ /** Attributes whose value is a URL or a list of URLs. */
38
+ const URL_ATTRIBUTE_NAMES = /* @__PURE__ */ new Set([
39
+ "action",
40
+ "background",
41
+ "cite",
42
+ "data",
43
+ "formaction",
44
+ "href",
45
+ "longdesc",
46
+ "manifest",
47
+ "ping",
48
+ "poster",
49
+ "src",
50
+ "srcset",
51
+ "xlink:href"
52
+ ]);
53
+ /** The role that the value of the given attribute plays on the given element. */
54
+ function attributeValueRole(tagName, attributeName) {
55
+ switch (attributeName) {
56
+ case "value": return FORM_ELEMENT_NAMES.has(tagName) ? StringRole.FormInput : StringRole.AttributeValue;
57
+ case "style": return StringRole.Css;
58
+ default: return URL_ATTRIBUTE_NAMES.has(attributeName) ? StringRole.Url : StringRole.AttributeValue;
59
+ }
60
+ }
61
+ //#endregion
62
+ export { createAttributeAssignment, createAttributeAssignmentOrDeletion, createString };
63
+
64
+ //# sourceMappingURL=roles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.mjs","names":[],"sources":["../../../../src/domain/record/encoding/roles.ts"],"sourcesContent":["/* eslint-disable id-denylist */\n\nimport type {\n AddNodeChange,\n RoleAnnotatedStringLiteral,\n StringLiteral,\n StringOrStringReference,\n StringReference,\n} from '../../../types'\nimport { StringRole } from '../../../types'\nimport type { NodeId } from './itemIds'\n\n/** The node name of an AddNode change operation, in its role-annotated form. */\nexport type RoleAnnotatedAddNodeName<NodeChange extends AddNodeChange> = Exclude<\n NodeChange[1],\n StringLiteral | StringReference\n>\n\n/**\n * The node-type-specific parameters of an AddNode change operation, with every string\n * in its role-annotated form.\n */\nexport type RoleAnnotatedAddNodeParams<NodeChange extends AddNodeChange> = NodeChange extends [\n any,\n any,\n ...infer Params,\n]\n ? RoleAnnotatedParams<Params>\n : never\n\ntype RoleAnnotatedParams<Params> = { [Index in keyof Params]: RoleAnnotatedParam<Params[Index]> }\n\ntype RoleAnnotatedParam<Param> = Param extends StringOrStringReference\n ? RoleAnnotatedStringLiteral\n : RoleAnnotatedParams<Param>\n\n/**\n * An attribute change whose strings are all annotated with their roles. The node id is a number\n * rather than a string, so it is unaffected.\n */\nexport type RoleAnnotatedAttributeChange = [NodeId, ...RoleAnnotatedAttributeAssignmentOrDeletion[]]\n\n/** An attribute assignment, annotated with string roles. */\nexport type RoleAnnotatedAttributeAssignment = [RoleAnnotatedStringLiteral, RoleAnnotatedStringLiteral]\n\n/** An attribute assignment or deletion, annotated with string roles. */\nexport type RoleAnnotatedAttributeAssignmentOrDeletion =\n [RoleAnnotatedStringLiteral, RoleAnnotatedStringLiteral] | [RoleAnnotatedStringLiteral]\n\n/** The string literal portion of a role-annotated string literal type. */\nexport type RoleAnnotatedStringLiteralValue<Literal> = Literal extends RoleAnnotatedStringLiteral\n ? Literal['string']\n : never\n\n/** The rules of a stylesheet, annotated with their roles. */\nexport type RoleAnnotatedStyleSheetRules = RoleAnnotatedStringLiteral | RoleAnnotatedStringLiteral[]\n\n/** The media list of a stylesheet, annotated with their roles. */\nexport type RoleAnnotatedStyleSheetMediaList = RoleAnnotatedStringLiteral[]\n\n/** Create a serialized string literal annotated with the given role. */\nexport function createString<Role extends StringRole, Literal extends string>(\n role: Role,\n string: Literal\n): RoleAnnotatedStringLiteral & { role: Role; string: Literal } {\n return { role, string }\n}\n\n/**\n * Given a normalized tag name, an attribute name, and an attribute value, returns a\n * serialized attribute assignment annotated with the appropriate roles.\n */\nexport function createAttributeAssignment(\n tagName: string,\n attributeName: string,\n attributeValue: string\n): RoleAnnotatedAttributeAssignment {\n return [\n createString(StringRole.AttributeName, attributeName),\n createString(attributeValueRole(tagName, attributeName), attributeValue),\n ]\n}\n\n/**\n * Given a normalized tag name, an attribute name, and an attribute value, returns a\n * serialized attribute assignment or deletion annotated with the appropriate roles.\n */\nexport function createAttributeAssignmentOrDeletion(\n tagName: string,\n attributeName: string,\n attributeValue: string | null\n): RoleAnnotatedAttributeAssignmentOrDeletion {\n const name = createString(StringRole.AttributeName, attributeName)\n\n if (attributeValue === null) {\n return [name]\n }\n\n return [name, createString(attributeValueRole(tagName, attributeName), attributeValue)]\n}\n\n/**\n * Elements whose `value` attribute holds form input. Every other element that carries a `value`\n * attribute — `<li>`, `<button>`, `<meter>`, `<param>`, and the rest — holds an ordinary attribute\n * value there, and masking it would change how the page renders rather than hide anything private.\n */\nconst FORM_ELEMENT_NAMES = new Set(['input', 'option', 'select', 'textarea'])\n\n/** Attributes whose value is a URL or a list of URLs. */\nconst URL_ATTRIBUTE_NAMES = new Set([\n 'action',\n 'background',\n 'cite',\n 'data',\n 'formaction',\n 'href',\n 'longdesc',\n 'manifest',\n 'ping',\n 'poster',\n 'src',\n 'srcset',\n 'xlink:href',\n])\n\n/** The role that the value of the given attribute plays on the given element. */\nfunction attributeValueRole(tagName: string, attributeName: string): StringRole {\n switch (attributeName) {\n case 'value':\n return FORM_ELEMENT_NAMES.has(tagName) ? StringRole.FormInput : StringRole.AttributeValue\n case 'style':\n return StringRole.Css\n default:\n return URL_ATTRIBUTE_NAMES.has(attributeName) ? StringRole.Url : StringRole.AttributeValue\n }\n}\n"],"mappings":";;;AA6DA,SAAgB,aACd,MACA,QAC8D;CAC9D,OAAO;EAAE;EAAM;CAAO;AACxB;;;;;AAMA,SAAgB,0BACd,SACA,eACA,gBACkC;CAClC,OAAO,CACL,aAAa,WAAW,eAAe,aAAa,GACpD,aAAa,mBAAmB,SAAS,aAAa,GAAG,cAAc,CACzE;AACF;;;;;AAMA,SAAgB,oCACd,SACA,eACA,gBAC4C;CAC5C,MAAM,OAAO,aAAa,WAAW,eAAe,aAAa;CAEjE,IAAI,mBAAmB,MACrB,OAAO,CAAC,IAAI;CAGd,OAAO,CAAC,MAAM,aAAa,mBAAmB,SAAS,aAAa,GAAG,cAAc,CAAC;AACxF;;;;;;AAOA,MAAM,qCAAqB,IAAI,IAAI;CAAC;CAAS;CAAU;CAAU;AAAU,CAAC;;AAG5E,MAAM,sCAAsB,IAAI,IAAI;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;AAGD,SAAS,mBAAmB,SAAiB,eAAmC;CAC9E,QAAQ,eAAR;EACE,KAAK,SACH,OAAO,mBAAmB,IAAI,OAAO,IAAI,WAAW,YAAY,WAAW;EAC7E,KAAK,SACH,OAAO,WAAW;EACpB,SACE,OAAO,oBAAoB,IAAI,aAAa,IAAI,WAAW,MAAM,WAAW;CAChF;AACF"}
@@ -0,0 +1,47 @@
1
+ import { StringRole } from "../../../types/sessionReplayConstants.mjs";
2
+ //#region src/domain/record/encoding/stringIds.ts
3
+ function createStringIds() {
4
+ const firstId = 0;
5
+ let nextId = firstId;
6
+ let mapsByRole = createMapsByRole();
7
+ const get = (literal) => mapsByRole[literal.role][literal.string];
8
+ return {
9
+ clear() {
10
+ if (nextId === firstId) return;
11
+ mapsByRole = createMapsByRole();
12
+ nextId = firstId;
13
+ },
14
+ get,
15
+ getOrInsert(literal) {
16
+ let id = get(literal);
17
+ if (id === void 0) {
18
+ id = nextId++;
19
+ mapsByRole[literal.role][literal.string] = id;
20
+ }
21
+ return id;
22
+ },
23
+ get size() {
24
+ return nextId - firstId;
25
+ }
26
+ };
27
+ }
28
+ function createMapsByRole() {
29
+ return {
30
+ [StringRole.Default]: createStringIdMap(),
31
+ [StringRole.NodeName]: createStringIdMap(),
32
+ [StringRole.AttributeName]: createStringIdMap(),
33
+ [StringRole.AttributeValue]: createStringIdMap(),
34
+ [StringRole.TextContent]: createStringIdMap(),
35
+ [StringRole.FormInput]: createStringIdMap(),
36
+ [StringRole.Css]: createStringIdMap(),
37
+ [StringRole.Url]: createStringIdMap(),
38
+ [StringRole.ResourceId]: createStringIdMap()
39
+ };
40
+ }
41
+ function createStringIdMap() {
42
+ return Object.create(null);
43
+ }
44
+ //#endregion
45
+ export { createStringIds };
46
+
47
+ //# sourceMappingURL=stringIds.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringIds.mjs","names":[],"sources":["../../../../src/domain/record/encoding/stringIds.ts"],"sourcesContent":["import type { RoleAnnotatedStringLiteral } from '../../../types'\nimport { StringRole } from '../../../types'\n\nexport type StringId = number & { __brand: 'StringId' }\n\nexport interface StringIds {\n clear(this: void): void\n get(this: void, literal: RoleAnnotatedStringLiteral): StringId | undefined\n getOrInsert(this: void, literal: RoleAnnotatedStringLiteral): StringId\n get size(): number\n}\n\nexport const enum StringIdConstants {\n FIRST_ID = 0,\n\n // An arbitrarily-chosen soft limit on the maximum size of the string id map.\n SOFT_MAX_SIZE = 1000000,\n}\n\ntype StringIdMap = Record<string, StringId | undefined>\ntype StringIdMapsByRole = Record<StringRole, StringIdMap>\n\nexport function createStringIds(): StringIds {\n const firstId = StringIdConstants.FIRST_ID as StringId\n let nextId = firstId\n let mapsByRole = createMapsByRole()\n\n const get = (literal: RoleAnnotatedStringLiteral): StringId | undefined => mapsByRole[literal.role][literal.string]\n\n return {\n clear(): void {\n if (nextId === firstId) {\n return\n }\n mapsByRole = createMapsByRole()\n nextId = firstId\n },\n get,\n getOrInsert(literal: RoleAnnotatedStringLiteral): StringId {\n // Try to reuse any existing id.\n let id = get(literal)\n if (id === undefined) {\n id = nextId++ as StringId\n mapsByRole[literal.role][literal.string] = id\n }\n return id\n },\n get size(): number {\n return nextId - firstId\n },\n }\n}\n\nfunction createMapsByRole(): StringIdMapsByRole {\n return {\n [StringRole.Default]: createStringIdMap(),\n [StringRole.NodeName]: createStringIdMap(),\n [StringRole.AttributeName]: createStringIdMap(),\n [StringRole.AttributeValue]: createStringIdMap(),\n [StringRole.TextContent]: createStringIdMap(),\n [StringRole.FormInput]: createStringIdMap(),\n [StringRole.Css]: createStringIdMap(),\n [StringRole.Url]: createStringIdMap(),\n [StringRole.ResourceId]: createStringIdMap(),\n }\n}\n\nfunction createStringIdMap(): StringIdMap {\n return Object.create(null) as StringIdMap\n}\n"],"mappings":";;AAsBA,SAAgB,kBAA6B;CAC3C,MAAM,UAAA;CACN,IAAI,SAAS;CACb,IAAI,aAAa,iBAAiB;CAElC,MAAM,OAAO,YAA8D,WAAW,QAAQ,KAAK,CAAC,QAAQ;CAE5G,OAAO;EACL,QAAc;GACZ,IAAI,WAAW,SACb;GAEF,aAAa,iBAAiB;GAC9B,SAAS;EACX;EACA;EACA,YAAY,SAA+C;GAEzD,IAAI,KAAK,IAAI,OAAO;GACpB,IAAI,OAAO,KAAA,GAAW;IACpB,KAAK;IACL,WAAW,QAAQ,KAAK,CAAC,QAAQ,UAAU;GAC7C;GACA,OAAO;EACT;EACA,IAAI,OAAe;GACjB,OAAO,SAAS;EAClB;CACF;AACF;AAEA,SAAS,mBAAuC;CAC9C,OAAO;GACJ,WAAW,UAAU,kBAAkB;GACvC,WAAW,WAAW,kBAAkB;GACxC,WAAW,gBAAgB,kBAAkB;GAC7C,WAAW,iBAAiB,kBAAkB;GAC9C,WAAW,cAAc,kBAAkB;GAC3C,WAAW,YAAY,kBAAkB;GACzC,WAAW,MAAM,kBAAkB;GACnC,WAAW,MAAM,kBAAkB;GACnC,WAAW,aAAa,kBAAkB;CAC7C;AACF;AAEA,SAAS,oBAAiC;CACxC,OAAO,OAAO,OAAO,IAAI;AAC3B"}
@@ -0,0 +1,38 @@
1
+ import { StringRole } from "../../../types/sessionReplayConstants.mjs";
2
+ import { createString } from "./roles.mjs";
3
+ //#region src/domain/record/encoding/stringTable.ts
4
+ function createStringTable(allowObsoleteStringRepresentations = false, keepRoles = false) {
5
+ const strings = /* @__PURE__ */ new Map();
6
+ const literalOf = (value) => {
7
+ if (typeof value === "string") {
8
+ if (!allowObsoleteStringRepresentations) throw new Error(`Obsolete untagged string literal: ${value}`);
9
+ return createString(StringRole.Default, value);
10
+ }
11
+ if (typeof value === "object") {
12
+ if (!allowObsoleteStringRepresentations) throw new Error(`Obsolete string literal outside the string table: ${value.string}`);
13
+ return value;
14
+ }
15
+ const referencedString = strings.get(value);
16
+ if (referencedString === void 0) throw new Error(`Reference to unknown string: ${value}`);
17
+ return referencedString;
18
+ };
19
+ return {
20
+ add(newString, role) {
21
+ strings.set(strings.size, createString(role, newString));
22
+ },
23
+ clear() {
24
+ strings.clear();
25
+ },
26
+ decode(value) {
27
+ return literalOf(value).string;
28
+ },
29
+ decodeAnnotated(value) {
30
+ const literal = literalOf(value);
31
+ return keepRoles ? literal : literal.string;
32
+ }
33
+ };
34
+ }
35
+ //#endregion
36
+ export { createStringTable };
37
+
38
+ //# sourceMappingURL=stringTable.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringTable.mjs","names":[],"sources":["../../../../src/domain/record/encoding/stringTable.ts"],"sourcesContent":["import type { RoleAnnotatedStringLiteral, StringLiteral, StringOrStringReference } from '../../../types'\nimport { StringRole } from '../../../types'\nimport { createString } from './roles'\nimport type { StringId } from './stringIds'\n\nexport interface StringTable {\n add(newString: string, role: StringRole): void\n\n /** Remove every string from the table, so that the next string added gets the first id. */\n clear(): void\n\n /** The string that the given value holds, whichever form it takes. */\n decode(value: StringOrStringReference): string\n\n /**\n * The given value in the form the decoded record should carry it: the string on its own, or the\n * string together with the role it was defined in, depending on how the table was created.\n */\n decodeAnnotated(value: StringOrStringReference): StringLiteral | RoleAnnotatedStringLiteral\n}\n\nexport function createStringTable(allowObsoleteStringRepresentations = false, keepRoles = false): StringTable {\n const strings = new Map<StringId, RoleAnnotatedStringLiteral>()\n\n // The string the given value holds, along with the role it holds it in.\n const literalOf = (value: StringOrStringReference): RoleAnnotatedStringLiteral => {\n if (typeof value === 'string') {\n // A plain string literal. The encoder tags every literal it emits with a role, so one\n // without a role means something built this change data outside the encoder.\n if (!allowObsoleteStringRepresentations) {\n throw new Error(`Obsolete untagged string literal: ${value}`)\n }\n // An untagged literal says nothing about what it holds, which is the default role.\n return createString(StringRole.Default, value)\n }\n\n if (typeof value === 'object') {\n // A role-annotated string literal. The encoder gives every string an entry in the\n // string table, so something must have built this change data outside the encoder.\n if (!allowObsoleteStringRepresentations) {\n throw new Error(`Obsolete string literal outside the string table: ${value.string}`)\n }\n return value\n }\n\n const referencedString = strings.get(value as StringId)\n if (referencedString === undefined) {\n throw new Error(`Reference to unknown string: ${value}`)\n }\n return referencedString\n }\n\n return {\n add(newString: string, role: StringRole): void {\n strings.set(strings.size as StringId, createString(role, newString))\n },\n clear(): void {\n strings.clear()\n },\n decode(value: StringOrStringReference): string {\n return literalOf(value).string\n },\n decodeAnnotated(value: StringOrStringReference): StringLiteral | RoleAnnotatedStringLiteral {\n const literal = literalOf(value)\n return keepRoles ? literal : literal.string\n },\n }\n}\n"],"mappings":";;;AAqBA,SAAgB,kBAAkB,qCAAqC,OAAO,YAAY,OAAoB;CAC5G,MAAM,0BAAU,IAAI,IAA0C;CAG9D,MAAM,aAAa,UAA+D;EAChF,IAAI,OAAO,UAAU,UAAU;GAG7B,IAAI,CAAC,oCACH,MAAM,IAAI,MAAM,qCAAqC,OAAO;GAG9D,OAAO,aAAa,WAAW,SAAS,KAAK;EAC/C;EAEA,IAAI,OAAO,UAAU,UAAU;GAG7B,IAAI,CAAC,oCACH,MAAM,IAAI,MAAM,qDAAqD,MAAM,QAAQ;GAErF,OAAO;EACT;EAEA,MAAM,mBAAmB,QAAQ,IAAI,KAAiB;EACtD,IAAI,qBAAqB,KAAA,GACvB,MAAM,IAAI,MAAM,gCAAgC,OAAO;EAEzD,OAAO;CACT;CAEA,OAAO;EACL,IAAI,WAAmB,MAAwB;GAC7C,QAAQ,IAAI,QAAQ,MAAkB,aAAa,MAAM,SAAS,CAAC;EACrE;EACA,QAAc;GACZ,QAAQ,MAAM;EAChB;EACA,OAAO,OAAwC;GAC7C,OAAO,UAAU,KAAK,CAAC,CAAC;EAC1B;EACA,gBAAgB,OAA4E;GAC1F,MAAM,UAAU,UAAU,KAAK;GAC/B,OAAO,YAAY,UAAU,QAAQ;EACvC;CACF;AACF"}
@@ -0,0 +1,13 @@
1
+ import { isNodeShadowHost } from "@kubesense/kubesense-browser-rum-core";
2
+ //#region src/domain/record/eventsUtils.ts
3
+ function isTouchEvent(event) {
4
+ return Boolean(event.changedTouches);
5
+ }
6
+ function getEventTarget(event) {
7
+ if (event.composed === true && isNodeShadowHost(event.target)) return event.composedPath()[0];
8
+ return event.target;
9
+ }
10
+ //#endregion
11
+ export { getEventTarget, isTouchEvent };
12
+
13
+ //# sourceMappingURL=eventsUtils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventsUtils.mjs","names":[],"sources":["../../../src/domain/record/eventsUtils.ts"],"sourcesContent":["import { isNodeShadowHost } from '@kubesense/kubesense-browser-rum-core'\n\nexport function isTouchEvent(event: MouseEvent | TouchEvent): event is TouchEvent {\n return Boolean((event as TouchEvent).changedTouches)\n}\n\nexport function getEventTarget(event: Event): Node {\n if (event.composed === true && isNodeShadowHost(event.target as Node)) {\n return event.composedPath()[0] as Node\n }\n return event.target as Node\n}\n"],"mappings":";;AAEA,SAAgB,aAAa,OAAqD;CAChF,OAAO,QAAS,MAAqB,cAAc;AACrD;AAEA,SAAgB,eAAe,OAAoB;CACjD,IAAI,MAAM,aAAa,QAAQ,iBAAiB,MAAM,MAAc,GAClE,OAAO,MAAM,aAAa,CAAC,CAAC;CAE9B,OAAO,MAAM;AACf"}
@@ -0,0 +1,8 @@
1
+ import "./mutationBatch.mjs";
2
+ import { createChangeDecoder } from "./encoding/changeDecoder.mjs";
3
+ import { aggregateSerializationStats, createSerializationStats } from "./serialization/serializationStats.mjs";
4
+ import "./serialization/index.mjs";
5
+ import "./elementsScrollPositions.mjs";
6
+ import { takeFullSnapshot, takeNodeSnapshot } from "./internalApi.mjs";
7
+ import { record } from "./record.mjs";
8
+ export { aggregateSerializationStats, createChangeDecoder, createSerializationStats, record, takeFullSnapshot, takeNodeSnapshot };