@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.
- package/LICENSE +1 -1
- package/README.md +23 -0
- package/bundle/chunks/kubesenseProfiler-4b8cfd8f889074788478-kubesense-rum.js +1 -0
- package/bundle/chunks/kubesenseRecorder-db948e96649585a2b3e9-kubesense-rum.js +1 -0
- package/bundle/kubesense-rum.js +1 -1
- package/cjs/boot/kubesenseRecorder.d.ts +6 -0
- package/cjs/boot/kubesenseRecorder.js +75 -0
- package/cjs/boot/kubesenseRecorder.js.map +1 -0
- package/cjs/boot/lazyLoadProfiler.d.ts +3 -4
- package/cjs/boot/lazyLoadProfiler.js +18 -50
- package/cjs/boot/lazyLoadProfiler.js.map +1 -1
- package/cjs/boot/lazyLoadRecorder.d.ts +3 -4
- package/cjs/boot/lazyLoadRecorder.js +18 -50
- package/cjs/boot/lazyLoadRecorder.js.map +1 -1
- package/cjs/boot/postStartStrategy.d.ts +4 -4
- package/cjs/boot/postStartStrategy.js +89 -110
- package/cjs/boot/postStartStrategy.js.map +1 -1
- package/cjs/boot/preStartStrategy.js +21 -21
- package/cjs/boot/preStartStrategy.js.map +1 -1
- package/cjs/boot/profilerApi.js +44 -50
- package/cjs/boot/profilerApi.js.map +1 -1
- package/cjs/boot/recorderApi.d.ts +1 -3
- package/cjs/boot/recorderApi.js +41 -71
- package/cjs/boot/recorderApi.js.map +1 -1
- package/cjs/domain/deflate/deflateEncoder.d.ts +1 -2
- package/cjs/domain/deflate/deflateEncoder.js +94 -108
- package/cjs/domain/deflate/deflateEncoder.js.map +1 -1
- package/cjs/domain/deflate/deflateWorker.d.ts +3 -4
- package/cjs/domain/deflate/deflateWorker.js +79 -90
- package/cjs/domain/deflate/deflateWorker.js.map +1 -1
- package/cjs/domain/deflate/index.d.ts +1 -1
- package/cjs/domain/deflate/index.js +5 -10
- package/cjs/domain/getSessionReplayLink.d.ts +3 -2
- package/cjs/domain/getSessionReplayLink.js +17 -31
- package/cjs/domain/getSessionReplayLink.js.map +1 -1
- package/cjs/domain/profiling/actionHistory.d.ts +10 -0
- package/cjs/domain/profiling/actionHistory.js +37 -0
- package/cjs/domain/profiling/actionHistory.js.map +1 -0
- package/cjs/domain/profiling/kubesenseProfiler.d.ts +6 -0
- package/cjs/domain/profiling/kubesenseProfiler.js +243 -0
- package/cjs/domain/profiling/kubesenseProfiler.js.map +1 -0
- package/cjs/domain/profiling/longTaskHistory.d.ts +11 -0
- package/cjs/domain/profiling/longTaskHistory.js +22 -0
- package/cjs/domain/profiling/longTaskHistory.js.map +1 -0
- package/cjs/domain/profiling/profilerDebugIds.d.ts +2 -0
- package/cjs/domain/profiling/profilerDebugIds.js +18 -0
- package/cjs/domain/profiling/profilerDebugIds.js.map +1 -0
- package/cjs/domain/profiling/profilingContext.js +20 -25
- package/cjs/domain/profiling/profilingContext.js.map +1 -1
- package/cjs/domain/profiling/profilingSupported.js +6 -8
- package/cjs/domain/profiling/profilingSupported.js.map +1 -1
- package/cjs/domain/profiling/quotaCheck.d.ts +9 -0
- package/cjs/domain/profiling/quotaCheck.js +66 -0
- package/cjs/domain/profiling/quotaCheck.js.map +1 -0
- package/cjs/domain/profiling/test-utils/mockedTrace.d.ts +1 -1
- package/cjs/domain/profiling/transport/buildProfileEvent.d.ts +38 -0
- package/cjs/domain/profiling/transport/buildProfileEvent.js +91 -0
- package/cjs/domain/profiling/transport/buildProfileEvent.js.map +1 -0
- package/cjs/domain/profiling/transport/formDataEmitter.d.ts +5 -0
- package/cjs/domain/profiling/transport/formDataEmitter.js +17 -0
- package/cjs/domain/profiling/transport/formDataEmitter.js.map +1 -0
- package/cjs/domain/profiling/transport/profilingBridge.d.ts +2 -0
- package/cjs/domain/profiling/transport/profilingBridge.js +12 -0
- package/cjs/domain/profiling/transport/profilingBridge.js.map +1 -0
- package/cjs/domain/profiling/{types/rumProfiler.types.d.ts → types.d.ts} +13 -24
- package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.js +5 -5
- package/cjs/domain/profiling/utils/getCustomOrDefaultViewName.js.map +1 -1
- package/cjs/domain/profiling/utils/getDefaultViewName.js +6 -10
- package/cjs/domain/profiling/utils/getDefaultViewName.js.map +1 -1
- package/cjs/domain/profiling/vitalHistory.d.ts +13 -0
- package/cjs/domain/profiling/vitalHistory.js +56 -0
- package/cjs/domain/profiling/vitalHistory.js.map +1 -0
- package/cjs/domain/record/assembly.d.ts +2 -1
- package/cjs/domain/record/assembly.js +15 -14
- package/cjs/domain/record/assembly.js.map +1 -1
- package/cjs/domain/record/canvas/canvasHash.d.ts +2 -0
- package/cjs/domain/record/canvas/canvasHash.js +33 -0
- package/cjs/domain/record/canvas/canvasHash.js.map +1 -0
- package/cjs/domain/record/canvas/canvasManager.d.ts +42 -0
- package/cjs/domain/record/canvas/canvasManager.js +99 -0
- package/cjs/domain/record/canvas/canvasManager.js.map +1 -0
- package/cjs/domain/record/canvas/canvasSnapshot.d.ts +8 -0
- package/cjs/domain/record/canvas/canvasSnapshot.js +40 -0
- package/cjs/domain/record/canvas/canvasSnapshot.js.map +1 -0
- package/cjs/domain/record/canvas/canvasUtils.d.ts +2 -0
- package/cjs/domain/record/canvas/canvasUtils.js +14 -0
- package/cjs/domain/record/canvas/canvasUtils.js.map +1 -0
- package/cjs/domain/record/elementsScrollPositions.js +17 -20
- package/cjs/domain/record/elementsScrollPositions.js.map +1 -1
- package/cjs/domain/record/encoding/changeDecoder.d.ts +39 -0
- package/cjs/domain/record/encoding/changeDecoder.js +152 -0
- package/cjs/domain/record/encoding/changeDecoder.js.map +1 -0
- package/cjs/domain/record/encoding/changeEncoder.d.ts +39 -0
- package/cjs/domain/record/encoding/changeEncoder.js +146 -0
- package/cjs/domain/record/encoding/changeEncoder.js.map +1 -0
- package/cjs/domain/record/encoding/index.d.ts +10 -0
- package/cjs/domain/record/encoding/itemIds.d.ts +32 -0
- package/cjs/domain/record/encoding/itemIds.js +49 -0
- package/cjs/domain/record/encoding/itemIds.js.map +1 -0
- package/cjs/domain/record/encoding/roles.d.ts +52 -0
- package/cjs/domain/record/encoding/roles.js +66 -0
- package/cjs/domain/record/encoding/roles.js.map +1 -0
- package/cjs/domain/record/encoding/stringIds.d.ts +15 -0
- package/cjs/domain/record/encoding/stringIds.js +47 -0
- package/cjs/domain/record/encoding/stringIds.js.map +1 -0
- package/cjs/domain/record/encoding/stringTable.d.ts +15 -0
- package/cjs/domain/record/encoding/stringTable.js +38 -0
- package/cjs/domain/record/encoding/stringTable.js.map +1 -0
- package/cjs/domain/record/eventsUtils.js +9 -10
- package/cjs/domain/record/eventsUtils.js.map +1 -1
- package/cjs/domain/record/index.d.ts +5 -2
- package/cjs/domain/record/index.js +13 -17
- package/cjs/domain/record/internalApi.d.ts +6 -6
- package/cjs/domain/record/internalApi.js +55 -49
- package/cjs/domain/record/internalApi.js.map +1 -1
- package/cjs/domain/record/mutationBatch.d.ts +1 -0
- package/cjs/domain/record/mutationBatch.js +38 -39
- package/cjs/domain/record/mutationBatch.js.map +1 -1
- package/cjs/domain/record/record.d.ts +7 -1
- package/cjs/domain/record/record.js +76 -87
- package/cjs/domain/record/record.js.map +1 -1
- package/cjs/domain/record/record.types.d.ts +1 -0
- package/cjs/domain/record/recordingScope.d.ts +7 -3
- package/cjs/domain/record/recordingScope.js +25 -11
- package/cjs/domain/record/recordingScope.js.map +1 -1
- package/cjs/domain/record/serialization/index.d.ts +4 -2
- package/cjs/domain/record/serialization/index.js +16 -18
- package/cjs/domain/record/serialization/insertionCursor.d.ts +57 -0
- package/cjs/domain/record/serialization/insertionCursor.js +55 -0
- package/cjs/domain/record/serialization/insertionCursor.js.map +1 -0
- package/cjs/domain/record/serialization/serialization.types.d.ts +0 -6
- package/cjs/domain/record/serialization/serializationStats.js +26 -25
- package/cjs/domain/record/serialization/serializationStats.js.map +1 -1
- package/cjs/domain/record/serialization/serializationTransaction.d.ts +44 -22
- package/cjs/domain/record/serialization/serializationTransaction.js +90 -36
- package/cjs/domain/record/serialization/serializationTransaction.js.map +1 -1
- package/cjs/domain/record/serialization/serializationUtils.d.ts +0 -1
- package/cjs/domain/record/serialization/serializationUtils.js +46 -75
- package/cjs/domain/record/serialization/serializationUtils.js.map +1 -1
- package/cjs/domain/record/serialization/serializeAttribute.js +24 -39
- package/cjs/domain/record/serialization/serializeAttribute.js.map +1 -1
- package/cjs/domain/record/serialization/serializeAttributes.d.ts +2 -2
- package/cjs/domain/record/serialization/serializeAttributes.js +100 -152
- package/cjs/domain/record/serialization/serializeAttributes.js.map +1 -1
- package/cjs/domain/record/serialization/serializeFullSnapshot.d.ts +5 -0
- package/cjs/domain/record/serialization/serializeFullSnapshot.js +14 -0
- package/cjs/domain/record/serialization/serializeFullSnapshot.js.map +1 -0
- package/cjs/domain/record/serialization/serializeMutations.d.ts +5 -0
- package/cjs/domain/record/serialization/serializeMutations.js +152 -0
- package/cjs/domain/record/serialization/serializeMutations.js.map +1 -0
- package/cjs/domain/record/serialization/serializeNode.d.ts +3 -6
- package/cjs/domain/record/serialization/serializeNode.js +116 -144
- package/cjs/domain/record/serialization/serializeNode.js.map +1 -1
- package/cjs/domain/record/shadowRootsController.d.ts +2 -2
- package/cjs/domain/record/shadowRootsController.js +37 -42
- package/cjs/domain/record/shadowRootsController.js.map +1 -1
- package/cjs/domain/record/startFullSnapshots.d.ts +1 -1
- package/cjs/domain/record/startFullSnapshots.js +38 -54
- package/cjs/domain/record/startFullSnapshots.js.map +1 -1
- package/cjs/domain/record/trackers/index.d.ts +2 -1
- package/cjs/domain/record/trackers/index.js +25 -27
- package/cjs/domain/record/trackers/trackCanvasCapture.d.ts +3 -0
- package/cjs/domain/record/trackers/trackCanvasCapture.js +102 -0
- package/cjs/domain/record/trackers/trackCanvasCapture.js.map +1 -0
- package/cjs/domain/record/trackers/trackCanvasContent.d.ts +3 -0
- package/cjs/domain/record/trackers/trackCanvasContent.js +31 -0
- package/cjs/domain/record/trackers/trackCanvasContent.js.map +1 -0
- package/cjs/domain/record/trackers/trackFocus.d.ts +1 -2
- package/cjs/domain/record/trackers/trackFocus.js +15 -13
- package/cjs/domain/record/trackers/trackFocus.js.map +1 -1
- package/cjs/domain/record/trackers/trackInput.d.ts +2 -2
- package/cjs/domain/record/trackers/trackInput.js +129 -102
- package/cjs/domain/record/trackers/trackInput.js.map +1 -1
- package/cjs/domain/record/trackers/trackMediaInteraction.js +22 -26
- package/cjs/domain/record/trackers/trackMediaInteraction.js.map +1 -1
- package/cjs/domain/record/trackers/trackMouseInteraction.js +47 -54
- package/cjs/domain/record/trackers/trackMouseInteraction.js.map +1 -1
- package/cjs/domain/record/trackers/trackMove.js +43 -49
- package/cjs/domain/record/trackers/trackMove.js.map +1 -1
- package/cjs/domain/record/trackers/trackMutation.d.ts +3 -3
- package/cjs/domain/record/trackers/trackMutation.js +42 -267
- package/cjs/domain/record/trackers/trackMutation.js.map +1 -1
- package/cjs/domain/record/trackers/trackScroll.js +36 -44
- package/cjs/domain/record/trackers/trackScroll.js.map +1 -1
- package/cjs/domain/record/trackers/trackStyleSheet.js +75 -84
- package/cjs/domain/record/trackers/trackStyleSheet.js.map +1 -1
- package/cjs/domain/record/trackers/trackViewEnd.js +17 -17
- package/cjs/domain/record/trackers/trackViewEnd.js.map +1 -1
- package/cjs/domain/record/trackers/trackViewportResize.d.ts +2 -3
- package/cjs/domain/record/trackers/trackViewportResize.js +36 -42
- package/cjs/domain/record/trackers/trackViewportResize.js.map +1 -1
- package/cjs/domain/record/viewports.js +32 -50
- package/cjs/domain/record/viewports.js.map +1 -1
- package/cjs/domain/replayStats.d.ts +1 -0
- package/cjs/domain/replayStats.js +36 -44
- package/cjs/domain/replayStats.js.map +1 -1
- package/cjs/domain/scriptLoadingError.js +15 -22
- package/cjs/domain/scriptLoadingError.js.map +1 -1
- package/cjs/domain/segmentCollection/buildReplayPayload.js +22 -23
- package/cjs/domain/segmentCollection/buildReplayPayload.js.map +1 -1
- package/cjs/domain/segmentCollection/buildResourcePayload.d.ts +5 -0
- package/cjs/domain/segmentCollection/buildResourcePayload.js +19 -0
- package/cjs/domain/segmentCollection/buildResourcePayload.js.map +1 -0
- package/cjs/domain/segmentCollection/index.d.ts +3 -0
- package/cjs/domain/segmentCollection/index.js +14 -11
- package/cjs/domain/segmentCollection/replayResourceCollection.d.ts +10 -0
- package/cjs/domain/segmentCollection/replayResourceCollection.js +52 -0
- package/cjs/domain/segmentCollection/replayResourceCollection.js.map +1 -0
- package/cjs/domain/segmentCollection/segment.js +50 -80
- package/cjs/domain/segmentCollection/segment.js.map +1 -1
- package/cjs/domain/segmentCollection/segmentCollection.d.ts +4 -4
- package/cjs/domain/segmentCollection/segmentCollection.js +87 -105
- package/cjs/domain/segmentCollection/segmentCollection.js.map +1 -1
- package/cjs/domain/segmentCollection/startDroppedSegmentRecovery.d.ts +16 -0
- package/cjs/domain/segmentCollection/startDroppedSegmentRecovery.js +29 -0
- package/cjs/domain/segmentCollection/startDroppedSegmentRecovery.js.map +1 -0
- package/cjs/domain/segmentCollection/startSegmentTelemetry.js +40 -42
- package/cjs/domain/segmentCollection/startSegmentTelemetry.js.map +1 -1
- package/cjs/domain/startRecordBridge.js +10 -14
- package/cjs/domain/startRecordBridge.js.map +1 -1
- package/cjs/domain/startRecorderInitTelemetry.js +42 -50
- package/cjs/domain/startRecorderInitTelemetry.js.map +1 -1
- package/cjs/entries/internal.d.ts +11 -2
- package/cjs/entries/internal.js +47 -28
- package/cjs/entries/internalSynthetics.js +26 -24
- package/cjs/entries/internalSynthetics.js.map +1 -1
- package/cjs/entries/main.d.ts +5 -3
- package/cjs/entries/main.js +50 -31
- package/cjs/entries/main.js.map +1 -1
- package/cjs/types/index.d.ts +1 -0
- package/cjs/types/profiling.d.ts +313 -0
- package/cjs/types/sessionReplay.d.ts +381 -3
- package/cjs/types/sessionReplayConstants.d.ts +57 -0
- package/cjs/types/sessionReplayConstants.js +104 -47
- package/cjs/types/sessionReplayConstants.js.map +1 -1
- package/esm/boot/kubesenseRecorder.mjs +75 -0
- package/esm/boot/kubesenseRecorder.mjs.map +1 -0
- package/esm/boot/lazyLoadProfiler.mjs +24 -0
- package/esm/boot/lazyLoadProfiler.mjs.map +1 -0
- package/esm/boot/lazyLoadRecorder.mjs +24 -0
- package/esm/boot/lazyLoadRecorder.mjs.map +1 -0
- package/esm/boot/postStartStrategy.mjs +97 -0
- package/esm/boot/postStartStrategy.mjs.map +1 -0
- package/esm/boot/preStartStrategy.mjs +24 -0
- package/esm/boot/preStartStrategy.mjs.map +1 -0
- package/esm/boot/profilerApi.mjs +47 -0
- package/esm/boot/profilerApi.mjs.map +1 -0
- package/esm/boot/recorderApi.mjs +43 -0
- package/esm/boot/recorderApi.mjs.map +1 -0
- package/esm/domain/deflate/deflateEncoder.mjs +96 -0
- package/esm/domain/deflate/deflateEncoder.mjs.map +1 -0
- package/esm/domain/deflate/deflateWorker.mjs +90 -0
- package/esm/domain/deflate/deflateWorker.mjs.map +1 -0
- package/esm/domain/deflate/index.mjs +3 -0
- package/esm/domain/getSessionReplayLink.mjs +21 -0
- package/esm/domain/getSessionReplayLink.mjs.map +1 -0
- package/esm/domain/profiling/actionHistory.mjs +36 -0
- package/esm/domain/profiling/actionHistory.mjs.map +1 -0
- package/esm/domain/profiling/kubesenseProfiler.mjs +242 -0
- package/esm/domain/profiling/kubesenseProfiler.mjs.map +1 -0
- package/esm/domain/profiling/longTaskHistory.mjs +21 -0
- package/esm/domain/profiling/longTaskHistory.mjs.map +1 -0
- package/esm/domain/profiling/profilerDebugIds.mjs +18 -0
- package/esm/domain/profiling/profilerDebugIds.mjs.map +1 -0
- package/esm/domain/profiling/profilingContext.mjs +23 -0
- package/esm/domain/profiling/profilingContext.mjs.map +1 -0
- package/esm/domain/profiling/profilingSupported.mjs +9 -0
- package/esm/domain/profiling/profilingSupported.mjs.map +1 -0
- package/esm/domain/profiling/quotaCheck.mjs +66 -0
- package/esm/domain/profiling/quotaCheck.mjs.map +1 -0
- package/esm/domain/profiling/transport/buildProfileEvent.mjs +90 -0
- package/esm/domain/profiling/transport/buildProfileEvent.mjs.map +1 -0
- package/esm/domain/profiling/transport/formDataEmitter.mjs +17 -0
- package/esm/domain/profiling/transport/formDataEmitter.mjs.map +1 -0
- package/esm/domain/profiling/transport/profilingBridge.mjs +12 -0
- package/esm/domain/profiling/transport/profilingBridge.mjs.map +1 -0
- package/esm/domain/profiling/utils/getCustomOrDefaultViewName.mjs +7 -0
- package/esm/domain/profiling/utils/getCustomOrDefaultViewName.mjs.map +1 -0
- package/esm/domain/profiling/utils/getDefaultViewName.mjs +10 -0
- package/esm/domain/profiling/utils/getDefaultViewName.mjs.map +1 -0
- package/esm/domain/profiling/vitalHistory.mjs +55 -0
- package/esm/domain/profiling/vitalHistory.mjs.map +1 -0
- package/esm/domain/record/assembly.mjs +17 -0
- package/esm/domain/record/assembly.mjs.map +1 -0
- package/esm/domain/record/canvas/canvasHash.mjs +33 -0
- package/esm/domain/record/canvas/canvasHash.mjs.map +1 -0
- package/esm/domain/record/canvas/canvasManager.mjs +99 -0
- package/esm/domain/record/canvas/canvasManager.mjs.map +1 -0
- package/esm/domain/record/canvas/canvasSnapshot.mjs +38 -0
- package/esm/domain/record/canvas/canvasSnapshot.mjs.map +1 -0
- package/esm/domain/record/canvas/canvasUtils.mjs +13 -0
- package/esm/domain/record/canvas/canvasUtils.mjs.map +1 -0
- package/esm/domain/record/elementsScrollPositions.mjs +20 -0
- package/esm/domain/record/elementsScrollPositions.mjs.map +1 -0
- package/esm/domain/record/encoding/changeDecoder.mjs +152 -0
- package/esm/domain/record/encoding/changeDecoder.mjs.map +1 -0
- package/esm/domain/record/encoding/changeEncoder.mjs +146 -0
- package/esm/domain/record/encoding/changeEncoder.mjs.map +1 -0
- package/esm/domain/record/encoding/itemIds.mjs +47 -0
- package/esm/domain/record/encoding/itemIds.mjs.map +1 -0
- package/esm/domain/record/encoding/roles.mjs +64 -0
- package/esm/domain/record/encoding/roles.mjs.map +1 -0
- package/esm/domain/record/encoding/stringIds.mjs +47 -0
- package/esm/domain/record/encoding/stringIds.mjs.map +1 -0
- package/esm/domain/record/encoding/stringTable.mjs +38 -0
- package/esm/domain/record/encoding/stringTable.mjs.map +1 -0
- package/esm/domain/record/eventsUtils.mjs +13 -0
- package/esm/domain/record/eventsUtils.mjs.map +1 -0
- package/esm/domain/record/index.mjs +8 -0
- package/esm/domain/record/internalApi.mjs +62 -0
- package/esm/domain/record/internalApi.mjs.map +1 -0
- package/esm/domain/record/mutationBatch.mjs +43 -0
- package/esm/domain/record/mutationBatch.mjs.map +1 -0
- package/esm/domain/record/record.mjs +79 -0
- package/esm/domain/record/record.mjs.map +1 -0
- package/esm/domain/record/recordingScope.mjs +27 -0
- package/esm/domain/record/recordingScope.mjs.map +1 -0
- package/esm/domain/record/serialization/index.mjs +9 -0
- package/esm/domain/record/serialization/insertionCursor.mjs +54 -0
- package/esm/domain/record/serialization/insertionCursor.mjs.map +1 -0
- package/esm/domain/record/serialization/serializationStats.mjs +31 -0
- package/esm/domain/record/serialization/serializationStats.mjs.map +1 -0
- package/esm/domain/record/serialization/serializationTransaction.mjs +92 -0
- package/esm/domain/record/serialization/serializationTransaction.mjs.map +1 -0
- package/esm/domain/record/serialization/serializationUtils.mjs +53 -0
- package/esm/domain/record/serialization/serializationUtils.mjs.map +1 -0
- package/esm/domain/record/serialization/serializeAttribute.mjs +26 -0
- package/esm/domain/record/serialization/serializeAttribute.mjs.map +1 -0
- package/esm/domain/record/serialization/serializeAttributes.mjs +113 -0
- package/esm/domain/record/serialization/serializeAttributes.mjs.map +1 -0
- package/esm/domain/record/serialization/serializeFullSnapshot.mjs +14 -0
- package/esm/domain/record/serialization/serializeFullSnapshot.mjs.map +1 -0
- package/esm/domain/record/serialization/serializeMutations.mjs +152 -0
- package/esm/domain/record/serialization/serializeMutations.mjs.map +1 -0
- package/esm/domain/record/serialization/serializeNode.mjs +126 -0
- package/esm/domain/record/serialization/serializeNode.mjs.map +1 -0
- package/esm/domain/record/shadowRootsController.mjs +40 -0
- package/esm/domain/record/shadowRootsController.mjs.map +1 -0
- package/esm/domain/record/startFullSnapshots.mjs +42 -0
- package/esm/domain/record/startFullSnapshots.mjs.map +1 -0
- package/esm/domain/record/trackers/index.mjs +13 -0
- package/esm/domain/record/trackers/trackCanvasCapture.mjs +102 -0
- package/esm/domain/record/trackers/trackCanvasCapture.mjs.map +1 -0
- package/esm/domain/record/trackers/trackCanvasContent.mjs +31 -0
- package/esm/domain/record/trackers/trackCanvasContent.mjs.map +1 -0
- package/esm/domain/record/trackers/trackFocus.mjs +17 -0
- package/esm/domain/record/trackers/trackFocus.mjs.map +1 -0
- package/esm/domain/record/trackers/trackInput.mjs +131 -0
- package/esm/domain/record/trackers/trackInput.mjs.map +1 -0
- package/esm/domain/record/trackers/trackMediaInteraction.mjs +25 -0
- package/esm/domain/record/trackers/trackMediaInteraction.mjs.map +1 -0
- package/esm/domain/record/trackers/trackMouseInteraction.mjs +52 -0
- package/esm/domain/record/trackers/trackMouseInteraction.mjs.map +1 -0
- package/esm/domain/record/trackers/trackMove.mjs +48 -0
- package/esm/domain/record/trackers/trackMove.mjs.map +1 -0
- package/esm/domain/record/trackers/trackMutation.mjs +45 -0
- package/esm/domain/record/trackers/trackMutation.mjs.map +1 -0
- package/esm/domain/record/trackers/trackScroll.mjs +40 -0
- package/esm/domain/record/trackers/trackScroll.mjs.map +1 -0
- package/esm/domain/record/trackers/trackStyleSheet.mjs +79 -0
- package/esm/domain/record/trackers/trackStyleSheet.mjs.map +1 -0
- package/esm/domain/record/trackers/trackViewEnd.mjs +20 -0
- package/esm/domain/record/trackers/trackViewEnd.mjs.map +1 -0
- package/esm/domain/record/trackers/trackViewportResize.mjs +39 -0
- package/esm/domain/record/trackers/trackViewportResize.mjs.map +1 -0
- package/esm/domain/record/viewports.mjs +41 -0
- package/esm/domain/record/viewports.mjs.map +1 -0
- package/esm/domain/replayStats.mjs +46 -0
- package/esm/domain/replayStats.mjs.map +1 -0
- package/esm/domain/scriptLoadingError.mjs +19 -0
- package/esm/domain/scriptLoadingError.mjs.map +1 -0
- package/esm/domain/segmentCollection/buildReplayPayload.mjs +25 -0
- package/esm/domain/segmentCollection/buildReplayPayload.mjs.map +1 -0
- package/esm/domain/segmentCollection/buildResourcePayload.mjs +19 -0
- package/esm/domain/segmentCollection/buildResourcePayload.mjs.map +1 -0
- package/esm/domain/segmentCollection/index.mjs +5 -0
- package/esm/domain/segmentCollection/replayResourceCollection.mjs +52 -0
- package/esm/domain/segmentCollection/replayResourceCollection.mjs.map +1 -0
- package/esm/domain/segmentCollection/segment.mjs +52 -0
- package/esm/domain/segmentCollection/segment.mjs.map +1 -0
- package/esm/domain/segmentCollection/segmentCollection.mjs +87 -0
- package/esm/domain/segmentCollection/segmentCollection.mjs.map +1 -0
- package/esm/domain/segmentCollection/startDroppedSegmentRecovery.mjs +28 -0
- package/esm/domain/segmentCollection/startDroppedSegmentRecovery.mjs.map +1 -0
- package/esm/domain/segmentCollection/startSegmentTelemetry.mjs +45 -0
- package/esm/domain/segmentCollection/startSegmentTelemetry.mjs.map +1 -0
- package/esm/domain/startRecordBridge.mjs +13 -0
- package/esm/domain/startRecordBridge.mjs.map +1 -0
- package/esm/domain/startRecorderInitTelemetry.mjs +47 -0
- package/esm/domain/startRecorderInitTelemetry.mjs.map +1 -0
- package/esm/entries/internal.mjs +8 -0
- package/esm/entries/internalSynthetics.mjs +22 -0
- package/esm/entries/internalSynthetics.mjs.map +1 -0
- package/esm/entries/main.mjs +35 -0
- package/esm/entries/main.mjs.map +1 -0
- package/esm/types/sessionReplayConstants.mjs +97 -0
- package/esm/types/sessionReplayConstants.mjs.map +1 -0
- package/internal/package.json +1 -1
- package/internal-synthetics/package.json +1 -1
- package/package.json +26 -15
- package/src/boot/kubesenseRecorder.ts +134 -0
- package/src/boot/lazyLoadProfiler.ts +6 -7
- package/src/boot/lazyLoadRecorder.ts +6 -7
- package/src/boot/postStartStrategy.ts +18 -16
- package/src/boot/profilerApi.ts +29 -19
- package/src/boot/recorderApi.ts +6 -21
- package/src/domain/deflate/deflateEncoder.ts +3 -8
- package/src/domain/deflate/deflateWorker.ts +8 -13
- package/src/domain/deflate/index.ts +1 -0
- package/src/domain/getSessionReplayLink.ts +15 -11
- package/src/domain/profiling/actionHistory.ts +66 -0
- package/src/domain/profiling/{profiler.ts → kubesenseProfiler.ts} +166 -79
- package/src/domain/profiling/longTaskHistory.ts +45 -0
- package/src/domain/profiling/profilerDebugIds.ts +17 -0
- package/src/domain/profiling/profilingContext.ts +8 -3
- package/src/domain/profiling/profilingSupported.ts +2 -7
- package/src/domain/profiling/quotaCheck.ts +89 -0
- package/src/domain/profiling/test-utils/mockedTrace.ts +1 -2
- package/src/domain/profiling/transport/buildProfileEvent.ts +143 -0
- package/src/domain/profiling/transport/formDataEmitter.ts +17 -0
- package/src/domain/profiling/transport/profilingBridge.ts +9 -0
- package/src/domain/profiling/{types/rumProfiler.types.ts → types.ts} +14 -26
- package/src/domain/profiling/vitalHistory.ts +106 -0
- package/src/domain/record/assembly.ts +5 -3
- package/src/domain/record/canvas/canvasHash.ts +54 -0
- package/src/domain/record/canvas/canvasManager.ts +175 -0
- package/src/domain/record/canvas/canvasSnapshot.ts +52 -0
- package/src/domain/record/canvas/canvasUtils.ts +11 -0
- package/src/domain/record/encoding/changeDecoder.ts +287 -0
- package/src/domain/record/encoding/changeEncoder.ts +327 -0
- package/src/domain/record/encoding/index.ts +19 -0
- package/src/domain/record/encoding/itemIds.ts +84 -0
- package/src/domain/record/encoding/roles.ts +136 -0
- package/src/domain/record/encoding/stringIds.ts +70 -0
- package/src/domain/record/encoding/stringTable.ts +68 -0
- package/src/domain/record/index.ts +5 -2
- package/src/domain/record/internalApi.ts +21 -18
- package/src/domain/record/mutationBatch.ts +14 -3
- package/src/domain/record/record.ts +35 -16
- package/src/domain/record/record.types.ts +1 -0
- package/src/domain/record/recordingScope.ts +28 -5
- package/src/domain/record/serialization/index.ts +4 -2
- package/src/domain/record/serialization/insertionCursor.ts +131 -0
- package/src/domain/record/serialization/serialization.types.ts +0 -16
- package/src/domain/record/serialization/serializationTransaction.ts +191 -37
- package/src/domain/record/serialization/serializationUtils.ts +1 -15
- package/src/domain/record/serialization/serializeAttributes.ts +36 -32
- package/src/domain/record/serialization/serializeFullSnapshot.ts +26 -0
- package/src/domain/record/serialization/serializeMutations.ts +357 -0
- package/src/domain/record/serialization/serializeNode.ts +200 -164
- package/src/domain/record/shadowRootsController.ts +4 -3
- package/src/domain/record/startFullSnapshots.ts +28 -41
- package/src/domain/record/trackers/index.ts +2 -1
- package/src/domain/record/trackers/trackCanvasCapture.ts +137 -0
- package/src/domain/record/trackers/trackCanvasContent.ts +46 -0
- package/src/domain/record/trackers/trackFocus.ts +4 -4
- package/src/domain/record/trackers/trackInput.ts +146 -41
- package/src/domain/record/trackers/trackMediaInteraction.ts +0 -1
- package/src/domain/record/trackers/trackMouseInteraction.ts +1 -2
- package/src/domain/record/trackers/trackMove.ts +0 -1
- package/src/domain/record/trackers/trackMutation.ts +17 -355
- package/src/domain/record/trackers/trackScroll.ts +1 -1
- package/src/domain/record/trackers/trackStyleSheet.ts +1 -1
- package/src/domain/record/trackers/trackViewEnd.ts +1 -1
- package/src/domain/record/trackers/trackViewportResize.ts +7 -16
- package/src/domain/record/trackers/tracker.types.ts +1 -1
- package/src/domain/replayStats.ts +5 -0
- package/src/domain/scriptLoadingError.ts +2 -1
- package/src/domain/segmentCollection/buildResourcePayload.ts +20 -0
- package/src/domain/segmentCollection/index.ts +3 -0
- package/src/domain/segmentCollection/replayResourceCollection.ts +79 -0
- package/src/domain/segmentCollection/segment.ts +2 -1
- package/src/domain/segmentCollection/segmentCollection.ts +14 -13
- package/src/domain/segmentCollection/startDroppedSegmentRecovery.ts +37 -0
- package/src/domain/segmentCollection/startSegmentTelemetry.ts +16 -2
- package/src/domain/startRecorderInitTelemetry.ts +5 -3
- package/src/entries/internal.ts +13 -2
- package/src/entries/internalSynthetics.ts +3 -4
- package/src/entries/main.ts +23 -14
- package/src/types/index.ts +1 -0
- package/src/types/profiling.ts +315 -0
- package/src/types/sessionReplay.ts +395 -3
- package/src/types/sessionReplayConstants.ts +109 -0
- package/bundle/chunks/profiler-6f621c66a29d9f39a9bd-kubesense-rum.js +0 -1
- package/bundle/chunks/recorder-c73b8d42b98d4a01f120-kubesense-rum.js +0 -1
- package/cjs/boot/isBrowserSupported.d.ts +0 -4
- package/cjs/boot/isBrowserSupported.js +0 -17
- package/cjs/boot/isBrowserSupported.js.map +0 -1
- package/cjs/boot/startRecording.d.ts +0 -6
- package/cjs/boot/startRecording.js +0 -45
- package/cjs/boot/startRecording.js.map +0 -1
- package/cjs/domain/deflate/index.js.map +0 -1
- package/cjs/domain/profiling/profiler.d.ts +0 -7
- package/cjs/domain/profiling/profiler.js +0 -244
- package/cjs/domain/profiling/profiler.js.map +0 -1
- package/cjs/domain/profiling/test-utils/mockedTrace.js +0 -57
- package/cjs/domain/profiling/test-utils/mockedTrace.js.map +0 -1
- package/cjs/domain/profiling/transport/assembly.d.ts +0 -21
- package/cjs/domain/profiling/transport/assembly.js +0 -45
- package/cjs/domain/profiling/transport/assembly.js.map +0 -1
- package/cjs/domain/profiling/transport/buildProfileEventAttributes.d.ts +0 -25
- package/cjs/domain/profiling/transport/buildProfileEventAttributes.js +0 -50
- package/cjs/domain/profiling/transport/buildProfileEventAttributes.js.map +0 -1
- package/cjs/domain/profiling/types/index.d.ts +0 -2
- package/cjs/domain/profiling/types/index.js +0 -3
- package/cjs/domain/profiling/types/index.js.map +0 -1
- package/cjs/domain/profiling/types/profilerApi.types.d.ts +0 -58
- package/cjs/domain/profiling/types/profilerApi.types.js +0 -5
- package/cjs/domain/profiling/types/profilerApi.types.js.map +0 -1
- package/cjs/domain/profiling/types/rumProfiler.types.js +0 -3
- package/cjs/domain/profiling/types/rumProfiler.types.js.map +0 -1
- package/cjs/domain/profiling/utils/getNumberOfSamples.d.ts +0 -7
- package/cjs/domain/profiling/utils/getNumberOfSamples.js +0 -18
- package/cjs/domain/profiling/utils/getNumberOfSamples.js.map +0 -1
- package/cjs/domain/record/eventIds.d.ts +0 -4
- package/cjs/domain/record/eventIds.js +0 -16
- package/cjs/domain/record/eventIds.js.map +0 -1
- package/cjs/domain/record/index.js.map +0 -1
- package/cjs/domain/record/nodeIds.d.ts +0 -15
- package/cjs/domain/record/nodeIds.js +0 -32
- package/cjs/domain/record/nodeIds.js.map +0 -1
- package/cjs/domain/record/record.types.js +0 -3
- package/cjs/domain/record/record.types.js.map +0 -1
- package/cjs/domain/record/serialization/index.js.map +0 -1
- package/cjs/domain/record/serialization/serialization.types.js +0 -3
- package/cjs/domain/record/serialization/serialization.types.js.map +0 -1
- package/cjs/domain/record/serialization/serializeDocument.d.ts +0 -3
- package/cjs/domain/record/serialization/serializeDocument.js +0 -11
- package/cjs/domain/record/serialization/serializeDocument.js.map +0 -1
- package/cjs/domain/record/serialization/serializeStyleSheets.d.ts +0 -2
- package/cjs/domain/record/serialization/serializeStyleSheets.js +0 -19
- package/cjs/domain/record/serialization/serializeStyleSheets.js.map +0 -1
- package/cjs/domain/record/trackers/index.js.map +0 -1
- package/cjs/domain/record/trackers/trackFrustration.d.ts +0 -7
- package/cjs/domain/record/trackers/trackFrustration.js +0 -31
- package/cjs/domain/record/trackers/trackFrustration.js.map +0 -1
- package/cjs/domain/record/trackers/tracker.types.js +0 -3
- package/cjs/domain/record/trackers/tracker.types.js.map +0 -1
- package/cjs/domain/segmentCollection/index.js.map +0 -1
- package/cjs/entries/internal.js.map +0 -1
- package/cjs/types/index.js +0 -18
- package/cjs/types/index.js.map +0 -1
- package/cjs/types/sessionReplay.js +0 -7
- package/cjs/types/sessionReplay.js.map +0 -1
- package/esm/boot/isBrowserSupported.d.ts +0 -4
- package/esm/boot/isBrowserSupported.js +0 -14
- package/esm/boot/isBrowserSupported.js.map +0 -1
- package/esm/boot/lazyLoadProfiler.d.ts +0 -4
- package/esm/boot/lazyLoadProfiler.js +0 -18
- package/esm/boot/lazyLoadProfiler.js.map +0 -1
- package/esm/boot/lazyLoadRecorder.d.ts +0 -4
- package/esm/boot/lazyLoadRecorder.js +0 -18
- package/esm/boot/lazyLoadRecorder.js.map +0 -1
- package/esm/boot/postStartStrategy.d.ts +0 -33
- package/esm/boot/postStartStrategy.js +0 -115
- package/esm/boot/postStartStrategy.js.map +0 -1
- package/esm/boot/preStartStrategy.d.ts +0 -6
- package/esm/boot/preStartStrategy.js +0 -21
- package/esm/boot/preStartStrategy.js.map +0 -1
- package/esm/boot/profilerApi.d.ts +0 -2
- package/esm/boot/profilerApi.js +0 -50
- package/esm/boot/profilerApi.js.map +0 -1
- package/esm/boot/recorderApi.d.ts +0 -4
- package/esm/boot/recorderApi.js +0 -70
- package/esm/boot/recorderApi.js.map +0 -1
- package/esm/boot/startRecording.d.ts +0 -6
- package/esm/boot/startRecording.js +0 -42
- package/esm/boot/startRecording.js.map +0 -1
- package/esm/domain/deflate/deflateEncoder.d.ts +0 -3
- package/esm/domain/deflate/deflateEncoder.js +0 -107
- package/esm/domain/deflate/deflateEncoder.js.map +0 -1
- package/esm/domain/deflate/deflateWorker.d.ts +0 -30
- package/esm/domain/deflate/deflateWorker.js +0 -97
- package/esm/domain/deflate/deflateWorker.js.map +0 -1
- package/esm/domain/deflate/index.d.ts +0 -3
- package/esm/domain/deflate/index.js +0 -3
- package/esm/domain/deflate/index.js.map +0 -1
- package/esm/domain/getSessionReplayLink.d.ts +0 -2
- package/esm/domain/getSessionReplayLink.js +0 -32
- package/esm/domain/getSessionReplayLink.js.map +0 -1
- package/esm/domain/profiling/profiler.d.ts +0 -7
- package/esm/domain/profiling/profiler.js +0 -240
- package/esm/domain/profiling/profiler.js.map +0 -1
- package/esm/domain/profiling/profilingContext.d.ts +0 -6
- package/esm/domain/profiling/profilingContext.js +0 -25
- package/esm/domain/profiling/profilingContext.js.map +0 -1
- package/esm/domain/profiling/profilingSupported.d.ts +0 -1
- package/esm/domain/profiling/profilingSupported.js +0 -8
- package/esm/domain/profiling/profilingSupported.js.map +0 -1
- package/esm/domain/profiling/test-utils/mockedTrace.d.ts +0 -3
- package/esm/domain/profiling/test-utils/mockedTrace.js +0 -54
- package/esm/domain/profiling/test-utils/mockedTrace.js.map +0 -1
- package/esm/domain/profiling/transport/assembly.d.ts +0 -21
- package/esm/domain/profiling/transport/assembly.js +0 -42
- package/esm/domain/profiling/transport/assembly.js.map +0 -1
- package/esm/domain/profiling/transport/buildProfileEventAttributes.d.ts +0 -25
- package/esm/domain/profiling/transport/buildProfileEventAttributes.js +0 -47
- package/esm/domain/profiling/transport/buildProfileEventAttributes.js.map +0 -1
- package/esm/domain/profiling/types/index.d.ts +0 -2
- package/esm/domain/profiling/types/index.js +0 -2
- package/esm/domain/profiling/types/index.js.map +0 -1
- package/esm/domain/profiling/types/profilerApi.types.d.ts +0 -58
- package/esm/domain/profiling/types/profilerApi.types.js +0 -4
- package/esm/domain/profiling/types/profilerApi.types.js.map +0 -1
- package/esm/domain/profiling/types/rumProfiler.types.d.ts +0 -72
- package/esm/domain/profiling/types/rumProfiler.types.js +0 -2
- package/esm/domain/profiling/types/rumProfiler.types.js.map +0 -1
- package/esm/domain/profiling/utils/getCustomOrDefaultViewName.d.ts +0 -1
- package/esm/domain/profiling/utils/getCustomOrDefaultViewName.js +0 -3
- package/esm/domain/profiling/utils/getCustomOrDefaultViewName.js.map +0 -1
- package/esm/domain/profiling/utils/getDefaultViewName.d.ts +0 -1
- package/esm/domain/profiling/utils/getDefaultViewName.js +0 -11
- package/esm/domain/profiling/utils/getDefaultViewName.js.map +0 -1
- package/esm/domain/profiling/utils/getNumberOfSamples.d.ts +0 -7
- package/esm/domain/profiling/utils/getNumberOfSamples.js +0 -15
- package/esm/domain/profiling/utils/getNumberOfSamples.js.map +0 -1
- package/esm/domain/record/assembly.d.ts +0 -2
- package/esm/domain/record/assembly.js +0 -13
- package/esm/domain/record/assembly.js.map +0 -1
- package/esm/domain/record/elementsScrollPositions.d.ts +0 -10
- package/esm/domain/record/elementsScrollPositions.js +0 -20
- package/esm/domain/record/elementsScrollPositions.js.map +0 -1
- package/esm/domain/record/eventIds.d.ts +0 -4
- package/esm/domain/record/eventIds.js +0 -13
- package/esm/domain/record/eventIds.js.map +0 -1
- package/esm/domain/record/eventsUtils.d.ts +0 -2
- package/esm/domain/record/eventsUtils.js +0 -11
- package/esm/domain/record/eventsUtils.js.map +0 -1
- package/esm/domain/record/index.d.ts +0 -7
- package/esm/domain/record/index.js +0 -6
- package/esm/domain/record/index.js.map +0 -1
- package/esm/domain/record/internalApi.d.ts +0 -22
- package/esm/domain/record/internalApi.js +0 -53
- package/esm/domain/record/internalApi.js.map +0 -1
- package/esm/domain/record/mutationBatch.d.ts +0 -12
- package/esm/domain/record/mutationBatch.js +0 -40
- package/esm/domain/record/mutationBatch.js.map +0 -1
- package/esm/domain/record/nodeIds.d.ts +0 -15
- package/esm/domain/record/nodeIds.js +0 -29
- package/esm/domain/record/nodeIds.js.map +0 -1
- package/esm/domain/record/record.d.ts +0 -16
- package/esm/domain/record/record.js +0 -54
- package/esm/domain/record/record.js.map +0 -1
- package/esm/domain/record/record.types.d.ts +0 -4
- package/esm/domain/record/record.types.js +0 -2
- package/esm/domain/record/record.types.js.map +0 -1
- package/esm/domain/record/recordingScope.d.ts +0 -19
- package/esm/domain/record/recordingScope.js +0 -10
- package/esm/domain/record/recordingScope.js.map +0 -1
- package/esm/domain/record/serialization/index.d.ts +0 -8
- package/esm/domain/record/serialization/index.js +0 -7
- package/esm/domain/record/serialization/index.js.map +0 -1
- package/esm/domain/record/serialization/serialization.types.d.ts +0 -28
- package/esm/domain/record/serialization/serialization.types.js +0 -2
- package/esm/domain/record/serialization/serialization.types.js.map +0 -1
- package/esm/domain/record/serialization/serializationStats.d.ts +0 -12
- package/esm/domain/record/serialization/serializationStats.js +0 -27
- package/esm/domain/record/serialization/serializationStats.js.map +0 -1
- package/esm/domain/record/serialization/serializationTransaction.d.ts +0 -45
- package/esm/domain/record/serialization/serializationTransaction.js +0 -35
- package/esm/domain/record/serialization/serializationTransaction.js.map +0 -1
- package/esm/domain/record/serialization/serializationUtils.d.ts +0 -18
- package/esm/domain/record/serialization/serializationUtils.js +0 -80
- package/esm/domain/record/serialization/serializationUtils.js.map +0 -1
- package/esm/domain/record/serialization/serializeAttribute.d.ts +0 -4
- package/esm/domain/record/serialization/serializeAttribute.js +0 -38
- package/esm/domain/record/serialization/serializeAttribute.js.map +0 -1
- package/esm/domain/record/serialization/serializeAttributes.d.ts +0 -7
- package/esm/domain/record/serialization/serializeAttributes.js +0 -161
- package/esm/domain/record/serialization/serializeAttributes.js.map +0 -1
- package/esm/domain/record/serialization/serializeDocument.d.ts +0 -3
- package/esm/domain/record/serialization/serializeDocument.js +0 -8
- package/esm/domain/record/serialization/serializeDocument.js.map +0 -1
- package/esm/domain/record/serialization/serializeNode.d.ts +0 -7
- package/esm/domain/record/serialization/serializeNode.js +0 -149
- package/esm/domain/record/serialization/serializeNode.js.map +0 -1
- package/esm/domain/record/serialization/serializeStyleSheets.d.ts +0 -2
- package/esm/domain/record/serialization/serializeStyleSheets.js +0 -16
- package/esm/domain/record/serialization/serializeStyleSheets.js.map +0 -1
- package/esm/domain/record/shadowRootsController.d.ts +0 -11
- package/esm/domain/record/shadowRootsController.js +0 -41
- package/esm/domain/record/shadowRootsController.js.map +0 -1
- package/esm/domain/record/startFullSnapshots.d.ts +0 -9
- package/esm/domain/record/startFullSnapshots.js +0 -55
- package/esm/domain/record/startFullSnapshots.js.map +0 -1
- package/esm/domain/record/trackers/index.d.ts +0 -12
- package/esm/domain/record/trackers/index.js +0 -12
- package/esm/domain/record/trackers/index.js.map +0 -1
- package/esm/domain/record/trackers/trackFocus.d.ts +0 -5
- package/esm/domain/record/trackers/trackFocus.js +0 -12
- package/esm/domain/record/trackers/trackFocus.js.map +0 -1
- package/esm/domain/record/trackers/trackFrustration.d.ts +0 -7
- package/esm/domain/record/trackers/trackFrustration.js +0 -28
- package/esm/domain/record/trackers/trackFrustration.js.map +0 -1
- package/esm/domain/record/trackers/trackInput.d.ts +0 -4
- package/esm/domain/record/trackers/trackInput.js +0 -101
- package/esm/domain/record/trackers/trackInput.js.map +0 -1
- package/esm/domain/record/trackers/trackMediaInteraction.d.ts +0 -5
- package/esm/domain/record/trackers/trackMediaInteraction.js +0 -26
- package/esm/domain/record/trackers/trackMediaInteraction.js.map +0 -1
- package/esm/domain/record/trackers/trackMouseInteraction.d.ts +0 -5
- package/esm/domain/record/trackers/trackMouseInteraction.js +0 -56
- package/esm/domain/record/trackers/trackMouseInteraction.js.map +0 -1
- package/esm/domain/record/trackers/trackMove.d.ts +0 -9
- package/esm/domain/record/trackers/trackMove.js +0 -51
- package/esm/domain/record/trackers/trackMove.js.map +0 -1
- package/esm/domain/record/trackers/trackMutation.d.ts +0 -11
- package/esm/domain/record/trackers/trackMutation.js +0 -266
- package/esm/domain/record/trackers/trackMutation.js.map +0 -1
- package/esm/domain/record/trackers/trackScroll.d.ts +0 -5
- package/esm/domain/record/trackers/trackScroll.js +0 -45
- package/esm/domain/record/trackers/trackScroll.js.map +0 -1
- package/esm/domain/record/trackers/trackStyleSheet.d.ts +0 -6
- package/esm/domain/record/trackers/trackStyleSheet.js +0 -85
- package/esm/domain/record/trackers/trackStyleSheet.js.map +0 -1
- package/esm/domain/record/trackers/trackViewEnd.d.ts +0 -5
- package/esm/domain/record/trackers/trackViewEnd.js +0 -17
- package/esm/domain/record/trackers/trackViewEnd.js.map +0 -1
- package/esm/domain/record/trackers/trackViewportResize.d.ts +0 -6
- package/esm/domain/record/trackers/trackViewportResize.js +0 -42
- package/esm/domain/record/trackers/trackViewportResize.js.map +0 -1
- package/esm/domain/record/trackers/tracker.types.d.ts +0 -3
- package/esm/domain/record/trackers/tracker.types.js +0 -2
- package/esm/domain/record/trackers/tracker.types.js.map +0 -1
- package/esm/domain/record/viewports.d.ts +0 -20
- package/esm/domain/record/viewports.js +0 -55
- package/esm/domain/record/viewports.js.map +0 -1
- package/esm/domain/replayStats.d.ts +0 -8
- package/esm/domain/replayStats.js +0 -51
- package/esm/domain/replayStats.js.map +0 -1
- package/esm/domain/scriptLoadingError.d.ts +0 -6
- package/esm/domain/scriptLoadingError.js +0 -23
- package/esm/domain/scriptLoadingError.js.map +0 -1
- package/esm/domain/segmentCollection/buildReplayPayload.d.ts +0 -15
- package/esm/domain/segmentCollection/buildReplayPayload.js +0 -23
- package/esm/domain/segmentCollection/buildReplayPayload.js.map +0 -1
- package/esm/domain/segmentCollection/index.d.ts +0 -4
- package/esm/domain/segmentCollection/index.js +0 -4
- package/esm/domain/segmentCollection/index.js.map +0 -1
- package/esm/domain/segmentCollection/segment.d.ts +0 -16
- package/esm/domain/segmentCollection/segment.js +0 -46
- package/esm/domain/segmentCollection/segment.js.map +0 -1
- package/esm/domain/segmentCollection/segmentCollection.d.ts +0 -31
- package/esm/domain/segmentCollection/segmentCollection.js +0 -106
- package/esm/domain/segmentCollection/segmentCollection.js.map +0 -1
- package/esm/domain/segmentCollection/startSegmentTelemetry.d.ts +0 -6
- package/esm/domain/segmentCollection/startSegmentTelemetry.js +0 -44
- package/esm/domain/segmentCollection/startSegmentTelemetry.js.map +0 -1
- package/esm/domain/startRecordBridge.d.ts +0 -5
- package/esm/domain/startRecordBridge.js +0 -14
- package/esm/domain/startRecordBridge.js.map +0 -1
- package/esm/domain/startRecorderInitTelemetry.d.ts +0 -15
- package/esm/domain/startRecorderInitTelemetry.js +0 -52
- package/esm/domain/startRecorderInitTelemetry.js.map +0 -1
- package/esm/entries/internal.d.ts +0 -11
- package/esm/entries/internal.js +0 -4
- package/esm/entries/internal.js.map +0 -1
- package/esm/entries/internalSynthetics.d.ts +0 -2
- package/esm/entries/internalSynthetics.js +0 -23
- package/esm/entries/internalSynthetics.js.map +0 -1
- package/esm/entries/main.d.ts +0 -23
- package/esm/entries/main.js +0 -31
- package/esm/entries/main.js.map +0 -1
- package/esm/types/index.d.ts +0 -2
- package/esm/types/index.js +0 -2
- package/esm/types/index.js.map +0 -1
- package/esm/types/sessionReplay.d.ts +0 -703
- package/esm/types/sessionReplay.js +0 -6
- package/esm/types/sessionReplay.js.map +0 -1
- package/esm/types/sessionReplayConstants.d.ts +0 -49
- package/esm/types/sessionReplayConstants.js +0 -46
- package/esm/types/sessionReplayConstants.js.map +0 -1
- package/src/boot/isBrowserSupported.ts +0 -14
- package/src/boot/startRecording.ts +0 -70
- package/src/domain/profiling/transport/assembly.ts +0 -78
- package/src/domain/profiling/transport/buildProfileEventAttributes.ts +0 -66
- package/src/domain/profiling/types/index.ts +0 -2
- package/src/domain/profiling/types/profilerApi.types.ts +0 -87
- package/src/domain/profiling/utils/getNumberOfSamples.ts +0 -16
- package/src/domain/record/eventIds.ts +0 -17
- package/src/domain/record/nodeIds.ts +0 -46
- package/src/domain/record/serialization/serializeDocument.ts +0 -13
- package/src/domain/record/serialization/serializeStyleSheets.ts +0 -18
- package/src/domain/record/trackers/trackFrustration.ts +0 -41
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { createRootInsertionCursor } from "./serialization/insertionCursor.mjs";
|
|
2
|
+
import { serializeInTransaction } from "./serialization/serializationTransaction.mjs";
|
|
3
|
+
import { createCanvasManager } from "./canvas/canvasManager.mjs";
|
|
4
|
+
import { serializeNode } from "./serialization/serializeNode.mjs";
|
|
5
|
+
import "./serialization/index.mjs";
|
|
6
|
+
import { takeFullSnapshot as takeFullSnapshot$1 } from "./startFullSnapshots.mjs";
|
|
7
|
+
import { createRecordingScope } from "./recordingScope.mjs";
|
|
8
|
+
import { createElementsScrollPositions } from "./elementsScrollPositions.mjs";
|
|
9
|
+
import { NodePrivacyLevel, getNodePrivacyLevel } from "@kubesense/kubesense-browser-rum-core";
|
|
10
|
+
import { noop } from "@kubesense/kubesense-browser-core";
|
|
11
|
+
import { timeStampNow } from "@kubesense/kubesense-js-core/time";
|
|
12
|
+
//#region src/domain/record/internalApi.ts
|
|
13
|
+
/**
|
|
14
|
+
* Take a full snapshot of the document, generating the same records that the browser SDK
|
|
15
|
+
* would generate.
|
|
16
|
+
*
|
|
17
|
+
* This is an internal API function. Be sure to update KubeSense-internal callers if you
|
|
18
|
+
* change its signature or behavior.
|
|
19
|
+
*/
|
|
20
|
+
function takeFullSnapshot({ configuration } = {}) {
|
|
21
|
+
const records = [];
|
|
22
|
+
const emitRecord = (record) => {
|
|
23
|
+
records.push(record);
|
|
24
|
+
};
|
|
25
|
+
takeFullSnapshot$1(timeStampNow(), 0, emitRecord, noop, createTemporaryRecordingScope(configuration));
|
|
26
|
+
return records;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Take a snapshot of a DOM node, generating the serialized representation that the
|
|
30
|
+
* browser SDK would generate.
|
|
31
|
+
*
|
|
32
|
+
* This is an internal API function. Be sure to update KubeSense-internal callers if you
|
|
33
|
+
* change its signature or behavior.
|
|
34
|
+
*/
|
|
35
|
+
function takeNodeSnapshot(node, { configuration } = {}) {
|
|
36
|
+
let nodeSnapshotRecord;
|
|
37
|
+
const emitRecord = (record) => {
|
|
38
|
+
nodeSnapshotRecord = record;
|
|
39
|
+
};
|
|
40
|
+
serializeInTransaction(0, emitRecord, noop, createTemporaryRecordingScope(configuration), timeStampNow(), (transaction) => {
|
|
41
|
+
const privacyLevel = getNodePrivacyLevel(node, transaction.scope.configuration.defaultPrivacyLevel);
|
|
42
|
+
if (privacyLevel === NodePrivacyLevel.HIDDEN || privacyLevel === NodePrivacyLevel.IGNORE) return;
|
|
43
|
+
const cursor = createRootInsertionCursor(transaction.scope.nodeIds);
|
|
44
|
+
serializeNode(cursor, node, privacyLevel, transaction);
|
|
45
|
+
});
|
|
46
|
+
return nodeSnapshotRecord;
|
|
47
|
+
}
|
|
48
|
+
function createTemporaryRecordingScope(configuration) {
|
|
49
|
+
return createRecordingScope(createCanvasManager(), {
|
|
50
|
+
defaultPrivacyLevel: NodePrivacyLevel.ALLOW,
|
|
51
|
+
...configuration
|
|
52
|
+
}, createElementsScrollPositions(), {
|
|
53
|
+
addShadowRoot: noop,
|
|
54
|
+
removeShadowRoot: noop,
|
|
55
|
+
flush: noop,
|
|
56
|
+
stop: noop
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
export { takeFullSnapshot, takeNodeSnapshot };
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=internalApi.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internalApi.mjs","names":[],"sources":["../../../src/domain/record/internalApi.ts"],"sourcesContent":["import { noop } from '@kubesense/kubesense-browser-core'\nimport { timeStampNow } from '@kubesense/kubesense-js-core/time'\nimport type { RumConfiguration } from '@kubesense/kubesense-browser-rum-core'\nimport { getNodePrivacyLevel, NodePrivacyLevel } from '@kubesense/kubesense-browser-rum-core'\nimport type { BrowserRecord } from '../../types'\nimport { takeFullSnapshot as doTakeFullSnapshot } from './startFullSnapshots'\nimport type { RecordingScope } from './recordingScope'\nimport { createRecordingScope } from './recordingScope'\nimport { createElementsScrollPositions } from './elementsScrollPositions'\nimport type { EmitRecordCallback } from './record.types'\nimport type { SerializationTransaction } from './serialization'\nimport { createRootInsertionCursor, SerializationKind, serializeInTransaction, serializeNode } from './serialization'\nimport { createCanvasManager } from './canvas/canvasManager'\n\n/**\n * Take a full snapshot of the document, generating the same records that the browser SDK\n * would generate.\n *\n * This is an internal API function. Be sure to update KubeSense-internal callers if you\n * change its signature or behavior.\n */\nexport function takeFullSnapshot({\n configuration,\n}: { configuration?: Partial<RumConfiguration> } = {}): BrowserRecord[] {\n const records: BrowserRecord[] = []\n const emitRecord: EmitRecordCallback = (record: BrowserRecord) => {\n records.push(record)\n }\n\n doTakeFullSnapshot(\n timeStampNow(),\n SerializationKind.INITIAL_FULL_SNAPSHOT,\n emitRecord,\n noop,\n createTemporaryRecordingScope(configuration)\n )\n\n return records\n}\n\n/**\n * Take a snapshot of a DOM node, generating the serialized representation that the\n * browser SDK would generate.\n *\n * This is an internal API function. Be sure to update KubeSense-internal callers if you\n * change its signature or behavior.\n */\nexport function takeNodeSnapshot(\n node: Node,\n { configuration }: { configuration?: Partial<RumConfiguration> } = {}\n): BrowserRecord | undefined {\n let nodeSnapshotRecord: BrowserRecord | undefined\n const emitRecord = (record: BrowserRecord) => {\n nodeSnapshotRecord = record\n }\n\n serializeInTransaction(\n SerializationKind.INITIAL_FULL_SNAPSHOT,\n emitRecord,\n noop,\n createTemporaryRecordingScope(configuration),\n timeStampNow(),\n (transaction: SerializationTransaction): void => {\n const privacyLevel = getNodePrivacyLevel(node, transaction.scope.configuration.defaultPrivacyLevel)\n if (privacyLevel === NodePrivacyLevel.HIDDEN || privacyLevel === NodePrivacyLevel.IGNORE) {\n return\n }\n const cursor = createRootInsertionCursor(transaction.scope.nodeIds)\n serializeNode(cursor, node, privacyLevel, transaction)\n }\n )\n\n return nodeSnapshotRecord\n}\n\nfunction createTemporaryRecordingScope(configuration?: Partial<RumConfiguration>): RecordingScope {\n return createRecordingScope(\n createCanvasManager(),\n {\n defaultPrivacyLevel: NodePrivacyLevel.ALLOW,\n ...configuration,\n } as RumConfiguration,\n createElementsScrollPositions(),\n {\n addShadowRoot: noop,\n removeShadowRoot: noop,\n flush: noop,\n stop: noop,\n }\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,iBAAiB,EAC/B,kBACiD,CAAC,GAAoB;CACtE,MAAM,UAA2B,CAAC;CAClC,MAAM,cAAkC,WAA0B;EAChE,QAAQ,KAAK,MAAM;CACrB;CAEA,mBACE,aAAa,GAAA,GAEb,YACA,MACA,8BAA8B,aAAa,CAC7C;CAEA,OAAO;AACT;;;;;;;;AASA,SAAgB,iBACd,MACA,EAAE,kBAAiE,CAAC,GACzC;CAC3B,IAAI;CACJ,MAAM,cAAc,WAA0B;EAC5C,qBAAqB;CACvB;CAEA,uBAAA,GAEE,YACA,MACA,8BAA8B,aAAa,GAC3C,aAAa,IACZ,gBAAgD;EAC/C,MAAM,eAAe,oBAAoB,MAAM,YAAY,MAAM,cAAc,mBAAmB;EAClG,IAAI,iBAAiB,iBAAiB,UAAU,iBAAiB,iBAAiB,QAChF;EAEF,MAAM,SAAS,0BAA0B,YAAY,MAAM,OAAO;EAClE,cAAc,QAAQ,MAAM,cAAc,WAAW;CACvD,CACF;CAEA,OAAO;AACT;AAEA,SAAS,8BAA8B,eAA2D;CAChG,OAAO,qBACL,oBAAoB,GACpB;EACE,qBAAqB,iBAAiB;EACtC,GAAG;CACL,GACA,8BAA8B,GAC9B;EACE,eAAe;EACf,kBAAkB;EAClB,OAAO;EACP,MAAM;CACR,CACF;AACF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { noop, requestIdleCallback, throttle } from "@kubesense/kubesense-browser-core";
|
|
2
|
+
//#region src/domain/record/mutationBatch.ts
|
|
3
|
+
/**
|
|
4
|
+
* Maximum duration to wait before processing mutations. If the browser is idle, mutations will be
|
|
5
|
+
* processed more quickly. If the browser is busy executing small tasks (ex: rendering frames), the
|
|
6
|
+
* mutations will wait MUTATION_PROCESS_MAX_DELAY milliseconds before being processed. If the
|
|
7
|
+
* browser is busy executing a longer task, mutations will be processed after this task.
|
|
8
|
+
*/
|
|
9
|
+
const MUTATION_PROCESS_MAX_DELAY = 100;
|
|
10
|
+
function createMutationBatch(processMutationBatch) {
|
|
11
|
+
let cancelScheduledFlush = noop;
|
|
12
|
+
let pendingMutations = [];
|
|
13
|
+
let flushScheduled = false;
|
|
14
|
+
function scheduleFlush() {
|
|
15
|
+
if (!flushScheduled) {
|
|
16
|
+
flushScheduled = true;
|
|
17
|
+
cancelScheduledFlush = requestIdleCallback(throttledFlush, { timeout: MUTATION_PROCESS_MAX_DELAY });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function flush() {
|
|
21
|
+
cancelScheduledFlush();
|
|
22
|
+
flushScheduled = false;
|
|
23
|
+
processMutationBatch(pendingMutations);
|
|
24
|
+
pendingMutations = [];
|
|
25
|
+
}
|
|
26
|
+
const { throttled: throttledFlush, cancel: cancelThrottle } = throttle(flush, 16, { leading: false });
|
|
27
|
+
return {
|
|
28
|
+
addMutations: (mutations) => {
|
|
29
|
+
scheduleFlush();
|
|
30
|
+
for (const mutation of mutations) pendingMutations.push(mutation);
|
|
31
|
+
},
|
|
32
|
+
notifyContentMutated: scheduleFlush,
|
|
33
|
+
flush,
|
|
34
|
+
stop: () => {
|
|
35
|
+
cancelScheduledFlush();
|
|
36
|
+
cancelThrottle();
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { createMutationBatch };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=mutationBatch.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutationBatch.mjs","names":[],"sources":["../../../src/domain/record/mutationBatch.ts"],"sourcesContent":["import { noop, throttle, requestIdleCallback } from '@kubesense/kubesense-browser-core'\nimport type { RumMutationRecord } from '@kubesense/kubesense-browser-rum-core'\n\n/**\n * Maximum duration to wait before processing mutations. If the browser is idle, mutations will be\n * processed more quickly. If the browser is busy executing small tasks (ex: rendering frames), the\n * mutations will wait MUTATION_PROCESS_MAX_DELAY milliseconds before being processed. If the\n * browser is busy executing a longer task, mutations will be processed after this task.\n */\nconst MUTATION_PROCESS_MAX_DELAY = 100\n/**\n * Minimum duration to wait before processing mutations. This is used to batch mutations together\n * and be able to deduplicate them to save processing time and bandwidth.\n * 16ms is the duration of a frame at 60fps that ensure fluid UI.\n */\nexport const MUTATION_PROCESS_MIN_DELAY = 16\n\nexport function createMutationBatch(processMutationBatch: (mutations: RumMutationRecord[]) => void) {\n let cancelScheduledFlush = noop\n let pendingMutations: RumMutationRecord[] = []\n let flushScheduled = false\n\n function scheduleFlush() {\n if (!flushScheduled) {\n flushScheduled = true\n cancelScheduledFlush = requestIdleCallback(throttledFlush, { timeout: MUTATION_PROCESS_MAX_DELAY })\n }\n }\n\n function flush() {\n cancelScheduledFlush()\n flushScheduled = false\n processMutationBatch(pendingMutations)\n pendingMutations = []\n }\n\n const { throttled: throttledFlush, cancel: cancelThrottle } = throttle(flush, MUTATION_PROCESS_MIN_DELAY, {\n leading: false,\n })\n\n return {\n addMutations: (mutations: RumMutationRecord[]) => {\n scheduleFlush()\n for (const mutation of mutations) {\n pendingMutations.push(mutation)\n }\n },\n\n notifyContentMutated: scheduleFlush,\n\n flush,\n\n stop: () => {\n cancelScheduledFlush()\n cancelThrottle()\n },\n }\n}\n"],"mappings":";;;;;;;;AASA,MAAM,6BAA6B;AAQnC,SAAgB,oBAAoB,sBAAgE;CAClG,IAAI,uBAAuB;CAC3B,IAAI,mBAAwC,CAAC;CAC7C,IAAI,iBAAiB;CAErB,SAAS,gBAAgB;EACvB,IAAI,CAAC,gBAAgB;GACnB,iBAAiB;GACjB,uBAAuB,oBAAoB,gBAAgB,EAAE,SAAS,2BAA2B,CAAC;EACpG;CACF;CAEA,SAAS,QAAQ;EACf,qBAAqB;EACrB,iBAAiB;EACjB,qBAAqB,gBAAgB;EACrC,mBAAmB,CAAC;CACtB;CAEA,MAAM,EAAE,WAAW,gBAAgB,QAAQ,mBAAmB,SAAS,OAAA,IAAmC,EACxG,SAAS,MACX,CAAC;CAED,OAAO;EACL,eAAe,cAAmC;GAChD,cAAc;GACd,KAAK,MAAM,YAAY,WACrB,iBAAiB,KAAK,QAAQ;EAElC;EAEA,sBAAsB;EAEtB;EAEA,YAAY;GACV,qBAAqB;GACrB,eAAe;EACjB;CACF;AACF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { createCanvasManager } from "./canvas/canvasManager.mjs";
|
|
2
|
+
import "./serialization/index.mjs";
|
|
3
|
+
import { startFullSnapshots, takeFullSnapshot } from "./startFullSnapshots.mjs";
|
|
4
|
+
import { createRecordingScope } from "./recordingScope.mjs";
|
|
5
|
+
import { createElementsScrollPositions } from "./elementsScrollPositions.mjs";
|
|
6
|
+
import { addRecord, addResource } from "../replayStats.mjs";
|
|
7
|
+
import { trackMove } from "./trackers/trackMove.mjs";
|
|
8
|
+
import { trackMouseInteraction } from "./trackers/trackMouseInteraction.mjs";
|
|
9
|
+
import { trackScroll } from "./trackers/trackScroll.mjs";
|
|
10
|
+
import { trackViewportResize, trackVisualViewportResize } from "./trackers/trackViewportResize.mjs";
|
|
11
|
+
import { trackMediaInteraction } from "./trackers/trackMediaInteraction.mjs";
|
|
12
|
+
import { trackStyleSheet } from "./trackers/trackStyleSheet.mjs";
|
|
13
|
+
import { trackFocus } from "./trackers/trackFocus.mjs";
|
|
14
|
+
import { trackViewEnd } from "./trackers/trackViewEnd.mjs";
|
|
15
|
+
import { trackInput } from "./trackers/trackInput.mjs";
|
|
16
|
+
import { trackMutation } from "./trackers/trackMutation.mjs";
|
|
17
|
+
import { trackCanvasContent } from "./trackers/trackCanvasContent.mjs";
|
|
18
|
+
import { trackCanvasCapture } from "./trackers/trackCanvasCapture.mjs";
|
|
19
|
+
import "./trackers/index.mjs";
|
|
20
|
+
import { initShadowRootsController } from "./shadowRootsController.mjs";
|
|
21
|
+
import { sendToExtension } from "@kubesense/kubesense-browser-core";
|
|
22
|
+
import { timeStampNow } from "@kubesense/kubesense-js-core/time";
|
|
23
|
+
//#region src/domain/record/record.ts
|
|
24
|
+
function record(options) {
|
|
25
|
+
const { emitRecord, emitResource, emitStats, configuration, lifeCycle } = options;
|
|
26
|
+
if (!emitRecord || !emitResource || !emitStats) throw new Error("emit functions are required");
|
|
27
|
+
const processRecord = (record) => {
|
|
28
|
+
emitRecord(record);
|
|
29
|
+
sendToExtension("record", { record });
|
|
30
|
+
const view = options.viewHistory.findView();
|
|
31
|
+
addRecord(view.id);
|
|
32
|
+
};
|
|
33
|
+
const processResource = (hash, content, onDiscard) => {
|
|
34
|
+
emitResource(hash, content, onDiscard);
|
|
35
|
+
const view = options.viewHistory.findView();
|
|
36
|
+
addResource(view.id);
|
|
37
|
+
};
|
|
38
|
+
const canvasManager = createCanvasManager();
|
|
39
|
+
const shadowRootsController = initShadowRootsController(processRecord, processResource, emitStats);
|
|
40
|
+
const scope = createRecordingScope(canvasManager, configuration, createElementsScrollPositions(), shadowRootsController);
|
|
41
|
+
const { stop: stopFullSnapshots } = startFullSnapshots(lifeCycle, processRecord, emitStats, flushMutations, scope);
|
|
42
|
+
function flushMutations() {
|
|
43
|
+
shadowRootsController.flush();
|
|
44
|
+
mutationTracker.flush();
|
|
45
|
+
}
|
|
46
|
+
const mutationTracker = trackMutation(document, processRecord, processResource, emitStats, scope);
|
|
47
|
+
const trackers = [
|
|
48
|
+
mutationTracker,
|
|
49
|
+
trackMove(processRecord, scope),
|
|
50
|
+
trackMouseInteraction(processRecord, scope),
|
|
51
|
+
trackScroll(document, processRecord, scope),
|
|
52
|
+
trackViewportResize(processRecord),
|
|
53
|
+
trackInput(document, processRecord, emitStats, scope),
|
|
54
|
+
trackMediaInteraction(processRecord, scope),
|
|
55
|
+
trackStyleSheet(processRecord, scope),
|
|
56
|
+
trackFocus(processRecord),
|
|
57
|
+
trackVisualViewportResize(processRecord),
|
|
58
|
+
trackViewEnd(lifeCycle, processRecord, flushMutations),
|
|
59
|
+
trackCanvasContent(scope),
|
|
60
|
+
trackCanvasCapture(scope, mutationTracker.notifyContentMutated)
|
|
61
|
+
];
|
|
62
|
+
return {
|
|
63
|
+
stop: () => {
|
|
64
|
+
shadowRootsController.stop();
|
|
65
|
+
trackers.forEach((tracker) => tracker.stop());
|
|
66
|
+
stopFullSnapshots();
|
|
67
|
+
},
|
|
68
|
+
flushMutations,
|
|
69
|
+
shadowRootsController,
|
|
70
|
+
takeFullSnapshot: () => {
|
|
71
|
+
flushMutations();
|
|
72
|
+
takeFullSnapshot(timeStampNow(), 1, processRecord, emitStats, scope);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
export { record };
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=record.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.mjs","names":[],"sources":["../../../src/domain/record/record.ts"],"sourcesContent":["import { sendToExtension } from '@kubesense/kubesense-browser-core'\nimport { timeStampNow } from '@kubesense/kubesense-js-core/time'\nimport type { LifeCycle, RumConfiguration, ViewHistory } from '@kubesense/kubesense-browser-rum-core'\nimport * as replayStats from '../replayStats'\nimport type { BrowserRecord } from '../../types'\nimport type { Tracker } from './trackers'\nimport {\n trackFocus,\n trackInput,\n trackMediaInteraction,\n trackMouseInteraction,\n trackMove,\n trackMutation,\n trackScroll,\n trackStyleSheet,\n trackViewEnd,\n trackViewportResize,\n trackVisualViewportResize,\n trackCanvasContent,\n trackCanvasCapture,\n} from './trackers'\nimport { createElementsScrollPositions } from './elementsScrollPositions'\nimport type { ShadowRootsController } from './shadowRootsController'\nimport { initShadowRootsController } from './shadowRootsController'\nimport { startFullSnapshots, takeFullSnapshot } from './startFullSnapshots'\nimport type { EmitRecordCallback, EmitStatsCallback, EmitResourceCallback } from './record.types'\nimport { createRecordingScope } from './recordingScope'\nimport { createCanvasManager } from './canvas/canvasManager'\nimport { SerializationKind } from './serialization'\n\nexport interface RecordOptions {\n emitRecord: EmitRecordCallback\n emitResource: EmitResourceCallback\n emitStats: EmitStatsCallback\n configuration: RumConfiguration\n lifeCycle: LifeCycle\n viewHistory: ViewHistory\n}\n\nexport interface RecordAPI {\n stop: () => void\n flushMutations: () => void\n shadowRootsController: ShadowRootsController\n /**\n * Starts the record stream over with a new full snapshot, so replay can recover when records\n * already emitted never reached the intake.\n */\n takeFullSnapshot: () => void\n}\n\nexport function record(options: RecordOptions): RecordAPI {\n const { emitRecord, emitResource, emitStats, configuration, lifeCycle } = options\n // runtime checks for user options\n if (!emitRecord || !emitResource || !emitStats) {\n throw new Error('emit functions are required')\n }\n\n const processRecord: EmitRecordCallback = (record: BrowserRecord) => {\n emitRecord(record)\n sendToExtension('record', { record })\n const view = options.viewHistory.findView()!\n replayStats.addRecord(view.id)\n }\n\n const processResource: EmitResourceCallback = (hash, content, onDiscard) => {\n emitResource(hash, content, onDiscard)\n const view = options.viewHistory.findView()!\n replayStats.addResource(view.id)\n }\n\n const canvasManager = createCanvasManager()\n const shadowRootsController = initShadowRootsController(processRecord, processResource, emitStats)\n const scope = createRecordingScope(\n canvasManager,\n configuration,\n createElementsScrollPositions(),\n shadowRootsController\n )\n\n const { stop: stopFullSnapshots } = startFullSnapshots(lifeCycle, processRecord, emitStats, flushMutations, scope)\n\n function flushMutations() {\n shadowRootsController.flush()\n mutationTracker.flush()\n }\n\n const mutationTracker = trackMutation(document, processRecord, processResource, emitStats, scope)\n const trackers: Tracker[] = [\n mutationTracker,\n trackMove(processRecord, scope),\n trackMouseInteraction(processRecord, scope),\n trackScroll(document, processRecord, scope),\n trackViewportResize(processRecord),\n trackInput(document, processRecord, emitStats, scope),\n trackMediaInteraction(processRecord, scope),\n trackStyleSheet(processRecord, scope),\n trackFocus(processRecord),\n trackVisualViewportResize(processRecord),\n trackViewEnd(lifeCycle, processRecord, flushMutations),\n trackCanvasContent(scope),\n trackCanvasCapture(scope, mutationTracker.notifyContentMutated),\n ]\n\n return {\n stop: () => {\n shadowRootsController.stop()\n trackers.forEach((tracker) => tracker.stop())\n stopFullSnapshots()\n },\n flushMutations,\n shadowRootsController,\n takeFullSnapshot: () => {\n flushMutations()\n takeFullSnapshot(timeStampNow(), SerializationKind.SUBSEQUENT_FULL_SNAPSHOT, processRecord, emitStats, scope)\n },\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAkDA,SAAgB,OAAO,SAAmC;CACxD,MAAM,EAAE,YAAY,cAAc,WAAW,eAAe,cAAc;CAE1E,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,WACnC,MAAM,IAAI,MAAM,6BAA6B;CAG/C,MAAM,iBAAqC,WAA0B;EACnE,WAAW,MAAM;EACjB,gBAAgB,UAAU,EAAE,OAAO,CAAC;EACpC,MAAM,OAAO,QAAQ,YAAY,SAAS;EAC1C,UAAsB,KAAK,EAAE;CAC/B;CAEA,MAAM,mBAAyC,MAAM,SAAS,cAAc;EAC1E,aAAa,MAAM,SAAS,SAAS;EACrC,MAAM,OAAO,QAAQ,YAAY,SAAS;EAC1C,YAAwB,KAAK,EAAE;CACjC;CAEA,MAAM,gBAAgB,oBAAoB;CAC1C,MAAM,wBAAwB,0BAA0B,eAAe,iBAAiB,SAAS;CACjG,MAAM,QAAQ,qBACZ,eACA,eACA,8BAA8B,GAC9B,qBACF;CAEA,MAAM,EAAE,MAAM,sBAAsB,mBAAmB,WAAW,eAAe,WAAW,gBAAgB,KAAK;CAEjH,SAAS,iBAAiB;EACxB,sBAAsB,MAAM;EAC5B,gBAAgB,MAAM;CACxB;CAEA,MAAM,kBAAkB,cAAc,UAAU,eAAe,iBAAiB,WAAW,KAAK;CAChG,MAAM,WAAsB;EAC1B;EACA,UAAU,eAAe,KAAK;EAC9B,sBAAsB,eAAe,KAAK;EAC1C,YAAY,UAAU,eAAe,KAAK;EAC1C,oBAAoB,aAAa;EACjC,WAAW,UAAU,eAAe,WAAW,KAAK;EACpD,sBAAsB,eAAe,KAAK;EAC1C,gBAAgB,eAAe,KAAK;EACpC,WAAW,aAAa;EACxB,0BAA0B,aAAa;EACvC,aAAa,WAAW,eAAe,cAAc;EACrD,mBAAmB,KAAK;EACxB,mBAAmB,OAAO,gBAAgB,oBAAoB;CAChE;CAEA,OAAO;EACL,YAAY;GACV,sBAAsB,KAAK;GAC3B,SAAS,SAAS,YAAY,QAAQ,KAAK,CAAC;GAC5C,kBAAkB;EACpB;EACA;EACA;EACA,wBAAwB;GACtB,eAAe;GACf,iBAAiB,aAAa,GAAA,GAA+C,eAAe,WAAW,KAAK;EAC9G;CACF;AACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createStringIds } from "./encoding/stringIds.mjs";
|
|
2
|
+
import { createEventIds, createNodeIds, createStyleSheetIds } from "./encoding/itemIds.mjs";
|
|
3
|
+
//#region src/domain/record/recordingScope.ts
|
|
4
|
+
function createRecordingScope(canvasManager, configuration, elementsScrollPositions, shadowRootsController) {
|
|
5
|
+
const scope = {
|
|
6
|
+
resetIds() {
|
|
7
|
+
scope.eventIds.clear();
|
|
8
|
+
scope.nodeIds.clear();
|
|
9
|
+
scope.stringIds.clear();
|
|
10
|
+
scope.styleSheetIds.clear();
|
|
11
|
+
scope.canvasManager.reset();
|
|
12
|
+
},
|
|
13
|
+
canvasManager,
|
|
14
|
+
configuration,
|
|
15
|
+
elementsScrollPositions,
|
|
16
|
+
eventIds: createEventIds(),
|
|
17
|
+
nodeIds: createNodeIds(),
|
|
18
|
+
shadowRootsController,
|
|
19
|
+
stringIds: createStringIds(),
|
|
20
|
+
styleSheetIds: createStyleSheetIds()
|
|
21
|
+
};
|
|
22
|
+
return scope;
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
25
|
+
export { createRecordingScope };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=recordingScope.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordingScope.mjs","names":[],"sources":["../../../src/domain/record/recordingScope.ts"],"sourcesContent":["import type { RumConfiguration } from '@kubesense/kubesense-browser-rum-core'\n\nimport type { ElementsScrollPositions } from './elementsScrollPositions'\nimport { createEventIds, createNodeIds, createStringIds, createStyleSheetIds } from './encoding'\nimport type { EventIds, NodeIds, StringIds, StyleSheetIds } from './encoding'\nimport type { ShadowRootsController } from './shadowRootsController'\nimport type { CanvasManager } from './canvas/canvasManager'\n\n/**\n * State associated with a stream of session replay records. When a new stream of records\n * starts (e.g. because recording has shut down and restarted), a new RecordingScope\n * object must be created; this ensures that we don't generate records that reference ids\n * or data which aren't present in the current stream.\n */\nexport interface RecordingScope {\n resetIds(): void\n\n canvasManager: CanvasManager\n configuration: RumConfiguration\n elementsScrollPositions: ElementsScrollPositions\n eventIds: EventIds\n nodeIds: NodeIds\n shadowRootsController: ShadowRootsController\n stringIds: StringIds\n styleSheetIds: StyleSheetIds\n}\n\nexport function createRecordingScope(\n canvasManager: CanvasManager,\n configuration: RumConfiguration,\n elementsScrollPositions: ElementsScrollPositions,\n shadowRootsController: ShadowRootsController\n): RecordingScope {\n const eventIds = createEventIds()\n const nodeIds = createNodeIds()\n const stringIds = createStringIds()\n const styleSheetIds = createStyleSheetIds()\n\n const scope: RecordingScope = {\n resetIds(): void {\n scope.eventIds.clear()\n scope.nodeIds.clear()\n scope.stringIds.clear()\n scope.styleSheetIds.clear()\n scope.canvasManager.reset()\n },\n\n canvasManager,\n configuration,\n elementsScrollPositions,\n eventIds,\n nodeIds,\n shadowRootsController,\n stringIds,\n styleSheetIds,\n }\n\n return scope\n}\n"],"mappings":";;;AA2BA,SAAgB,qBACd,eACA,eACA,yBACA,uBACgB;CAMhB,MAAM,QAAwB;EAC5B,WAAiB;GACf,MAAM,SAAS,MAAM;GACrB,MAAM,QAAQ,MAAM;GACpB,MAAM,UAAU,MAAM;GACtB,MAAM,cAAc,MAAM;GAC1B,MAAM,cAAc,MAAM;EAC5B;EAEA;EACA;EACA;EACA,UAjBe,eAiBR;EACP,SAjBc,cAiBR;EACN;EACA,WAlBgB,gBAkBR;EACR,eAlBoB,oBAkBR;CACd;CAEA,OAAO;AACT"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createRootInsertionCursor } from "./insertionCursor.mjs";
|
|
2
|
+
import { getElementInputValue } from "./serializationUtils.mjs";
|
|
3
|
+
import { aggregateSerializationStats, createSerializationStats } from "./serializationStats.mjs";
|
|
4
|
+
import { serializeInTransaction } from "./serializationTransaction.mjs";
|
|
5
|
+
import "./serializeAttribute.mjs";
|
|
6
|
+
import { serializeNode } from "./serializeNode.mjs";
|
|
7
|
+
import { serializeFullSnapshot } from "./serializeFullSnapshot.mjs";
|
|
8
|
+
import { serializeMutations } from "./serializeMutations.mjs";
|
|
9
|
+
export { aggregateSerializationStats, createRootInsertionCursor, createSerializationStats, getElementInputValue, serializeFullSnapshot, serializeInTransaction, serializeMutations, serializeNode };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//#region src/domain/record/serialization/insertionCursor.ts
|
|
2
|
+
/** Returns an InsertionCursor which starts positioned at the root of the document. */
|
|
3
|
+
function createRootInsertionCursor(nodeIds) {
|
|
4
|
+
return createInsertionCursor(void 0, void 0, nodeIds);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Returns an InsertionCursor which starts positioned in the child list of the given
|
|
8
|
+
* parent node. If a next sibling is provided, the cursor points to the position
|
|
9
|
+
* immediately before the next sibling; otherwise, the cursor points to the end of the
|
|
10
|
+
* child list.
|
|
11
|
+
*/
|
|
12
|
+
function createChildInsertionCursor(parentId, nextSiblingId, nodeIds) {
|
|
13
|
+
return createInsertionCursor(parentId, nextSiblingId, nodeIds);
|
|
14
|
+
}
|
|
15
|
+
function createInsertionCursor(parentId, nextSiblingId, nodeIds) {
|
|
16
|
+
let cursor = {
|
|
17
|
+
container: void 0,
|
|
18
|
+
parentId,
|
|
19
|
+
previousSiblingId: void 0,
|
|
20
|
+
nextSiblingId
|
|
21
|
+
};
|
|
22
|
+
const computeInsertionPoint = (nodeId) => {
|
|
23
|
+
if (cursor.previousSiblingId === nodeId - 1) return 0;
|
|
24
|
+
if (cursor.nextSiblingId !== void 0) return cursor.nextSiblingId - nodeId;
|
|
25
|
+
if (cursor.parentId !== void 0) return nodeId - cursor.parentId;
|
|
26
|
+
return null;
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
advance(node) {
|
|
30
|
+
const nodeId = nodeIds.getOrInsert(node);
|
|
31
|
+
const insertionPoint = computeInsertionPoint(nodeId);
|
|
32
|
+
cursor.previousSiblingId = nodeId;
|
|
33
|
+
return {
|
|
34
|
+
nodeId,
|
|
35
|
+
insertionPoint
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
ascend() {
|
|
39
|
+
if (cursor.container) cursor = cursor.container;
|
|
40
|
+
},
|
|
41
|
+
descend() {
|
|
42
|
+
if (cursor.previousSiblingId !== void 0) cursor = {
|
|
43
|
+
container: cursor,
|
|
44
|
+
parentId: cursor.previousSiblingId,
|
|
45
|
+
previousSiblingId: void 0,
|
|
46
|
+
nextSiblingId: void 0
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
export { createChildInsertionCursor, createRootInsertionCursor };
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=insertionCursor.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertionCursor.mjs","names":[],"sources":["../../../../src/domain/record/serialization/insertionCursor.ts"],"sourcesContent":["import type { InsertionPoint } from '../../../types'\nimport type { NodeId, NodeIds } from '../encoding'\n\n/**\n * InsertionCursor tracks the point at which the next node will be inserted during\n * Change-style DOM serialization.\n *\n * When a new node is added to the document, we use an InsertionPoint to encode its\n * position. There are often multiple equally-valid ways to express the same insertion\n * point; we generally want to favor encodings that use as few characters as possible (to\n * reduce uncompressed size) and that are as repetitive as possible (to reduce compressed\n * size). InsertionCursor's purpose is to heuristically pick an efficient encoding based\n * on the nodes we've recently serialized, while doing as little work as possible. The\n * results are not optimal, but should be close to it in most situations.\n *\n * At the beginning of the serialization process, use a factory function like\n * createRootInsertionCursor() to create a new cursor with an appropriate initial\n * position.\n *\n * When visiting a node, the expected usage pattern is as follows:\n * 1. Call advance() to get a node id and insertion point for the node.\n * 2. Serialize the node.\n * 3. If the node has no children, we're done; continue to the node's next\n * sibling and apply this algorithm again.\n * 4. Otherwise, call descend() to move the cursor into the node's child list.\n * 5. Recursively apply this algorithm.\n * 6. Call ascend() to move the cursor out of the node's child list. We're done;\n * continue to the node's next sibling and apply this algorithm again.\n */\nexport interface InsertionCursor {\n /**\n * Given the node id for a new node, returns the InsertionPoint for that node.\n * Updates the cursor to point to the new node's next sibling.\n */\n advance(node: Node): { nodeId: NodeId; insertionPoint: InsertionPoint }\n\n /**\n * Ascends out of the current child list and updates the cursor to point to the parent\n * node's next sibling.\n */\n ascend(): void\n\n /**\n * Descends into the child list of the last node we inserted and updates the cursor to\n * point to the node's first child.\n */\n descend(): void\n}\n\n/** Returns an InsertionCursor which starts positioned at the root of the document. */\nexport function createRootInsertionCursor(nodeIds: NodeIds): InsertionCursor {\n return createInsertionCursor(undefined, undefined, nodeIds)\n}\n\n/**\n * Returns an InsertionCursor which starts positioned in the child list of the given\n * parent node. If a next sibling is provided, the cursor points to the position\n * immediately before the next sibling; otherwise, the cursor points to the end of the\n * child list.\n */\nexport function createChildInsertionCursor(\n parentId: NodeId,\n nextSiblingId: NodeId | undefined,\n nodeIds: NodeIds\n): InsertionCursor {\n return createInsertionCursor(parentId, nextSiblingId, nodeIds)\n}\n\nfunction createInsertionCursor(\n parentId: NodeId | undefined,\n nextSiblingId: NodeId | undefined,\n nodeIds: NodeIds\n): InsertionCursor {\n interface ChildListCursor {\n container: ChildListCursor | undefined\n parentId: NodeId | undefined\n previousSiblingId: NodeId | undefined\n nextSiblingId: NodeId | undefined\n }\n\n let cursor: ChildListCursor = {\n container: undefined,\n parentId,\n previousSiblingId: undefined,\n nextSiblingId,\n }\n\n const computeInsertionPoint = (nodeId: NodeId): InsertionPoint => {\n if (cursor.previousSiblingId === nodeId - 1) {\n // Use an AppendAfterPreviousInsertionPoint. (i.e., 0)\n return 0\n }\n if (cursor.nextSiblingId !== undefined) {\n // Use an InsertBeforeInsertionPoint. We identify the next sibling using a\n // negative integer indicating the difference between the new node's id and its next\n // sibling's id.\n return cursor.nextSiblingId - nodeId\n }\n if (cursor.parentId !== undefined) {\n // Use an AppendChildInsertionPoint. We identify the parent node using a positive\n // integer indicating the difference between the new node's id and its parent's id.\n return nodeId - cursor.parentId\n }\n // There's no parent. Use a RootInsertionPoint. (i.e., null)\n return null\n }\n\n return {\n advance(node: Node): { nodeId: NodeId; insertionPoint: InsertionPoint } {\n const nodeId = nodeIds.getOrInsert(node)\n const insertionPoint = computeInsertionPoint(nodeId)\n cursor.previousSiblingId = nodeId\n return { nodeId, insertionPoint }\n },\n ascend(): void {\n if (cursor.container) {\n cursor = cursor.container\n }\n },\n descend(): void {\n if (cursor.previousSiblingId !== undefined) {\n cursor = {\n container: cursor,\n parentId: cursor.previousSiblingId,\n previousSiblingId: undefined,\n nextSiblingId: undefined,\n }\n }\n },\n }\n}\n"],"mappings":";;AAkDA,SAAgB,0BAA0B,SAAmC;CAC3E,OAAO,sBAAsB,KAAA,GAAW,KAAA,GAAW,OAAO;AAC5D;;;;;;;AAQA,SAAgB,2BACd,UACA,eACA,SACiB;CACjB,OAAO,sBAAsB,UAAU,eAAe,OAAO;AAC/D;AAEA,SAAS,sBACP,UACA,eACA,SACiB;CAQjB,IAAI,SAA0B;EAC5B,WAAW,KAAA;EACX;EACA,mBAAmB,KAAA;EACnB;CACF;CAEA,MAAM,yBAAyB,WAAmC;EAChE,IAAI,OAAO,sBAAsB,SAAS,GAExC,OAAO;EAET,IAAI,OAAO,kBAAkB,KAAA,GAI3B,OAAO,OAAO,gBAAgB;EAEhC,IAAI,OAAO,aAAa,KAAA,GAGtB,OAAO,SAAS,OAAO;EAGzB,OAAO;CACT;CAEA,OAAO;EACL,QAAQ,MAAgE;GACtE,MAAM,SAAS,QAAQ,YAAY,IAAI;GACvC,MAAM,iBAAiB,sBAAsB,MAAM;GACnD,OAAO,oBAAoB;GAC3B,OAAO;IAAE;IAAQ;GAAe;EAClC;EACA,SAAe;GACb,IAAI,OAAO,WACT,SAAS,OAAO;EAEpB;EACA,UAAgB;GACd,IAAI,OAAO,sBAAsB,KAAA,GAC/B,SAAS;IACP,WAAW;IACX,UAAU,OAAO;IACjB,mBAAmB,KAAA;IACnB,eAAe,KAAA;GACjB;EAEJ;CACF;AACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//#region src/domain/record/serialization/serializationStats.ts
|
|
2
|
+
function createSerializationStats() {
|
|
3
|
+
return {
|
|
4
|
+
cssText: {
|
|
5
|
+
count: 0,
|
|
6
|
+
max: 0,
|
|
7
|
+
sum: 0
|
|
8
|
+
},
|
|
9
|
+
serializationDuration: {
|
|
10
|
+
count: 0,
|
|
11
|
+
max: 0,
|
|
12
|
+
sum: 0
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function updateSerializationStats(stats, metric, value) {
|
|
17
|
+
stats[metric].count += 1;
|
|
18
|
+
stats[metric].max = Math.max(stats[metric].max, value);
|
|
19
|
+
stats[metric].sum += value;
|
|
20
|
+
}
|
|
21
|
+
function aggregateSerializationStats(aggregateStats, stats) {
|
|
22
|
+
for (const metric of ["cssText", "serializationDuration"]) {
|
|
23
|
+
aggregateStats[metric].count += stats[metric].count;
|
|
24
|
+
aggregateStats[metric].max = Math.max(aggregateStats[metric].max, stats[metric].max);
|
|
25
|
+
aggregateStats[metric].sum += stats[metric].sum;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { aggregateSerializationStats, createSerializationStats, updateSerializationStats };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=serializationStats.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializationStats.mjs","names":[],"sources":["../../../../src/domain/record/serialization/serializationStats.ts"],"sourcesContent":["export interface SerializationMetric {\n count: number\n max: number\n sum: number\n}\n\nexport interface SerializationStats {\n cssText: SerializationMetric\n serializationDuration: SerializationMetric\n}\n\nexport function createSerializationStats(): SerializationStats {\n return {\n cssText: {\n count: 0,\n max: 0,\n sum: 0,\n },\n serializationDuration: {\n count: 0,\n max: 0,\n sum: 0,\n },\n }\n}\n\nexport function updateSerializationStats(\n stats: SerializationStats,\n metric: keyof SerializationStats,\n value: number\n): void {\n stats[metric].count += 1\n stats[metric].max = Math.max(stats[metric].max, value)\n stats[metric].sum += value\n}\n\nexport function aggregateSerializationStats(aggregateStats: SerializationStats, stats: SerializationStats) {\n for (const metric of ['cssText', 'serializationDuration'] as const) {\n aggregateStats[metric].count += stats[metric].count\n aggregateStats[metric].max = Math.max(aggregateStats[metric].max, stats[metric].max)\n aggregateStats[metric].sum += stats[metric].sum\n }\n}\n"],"mappings":";AAWA,SAAgB,2BAA+C;CAC7D,OAAO;EACL,SAAS;GACP,OAAO;GACP,KAAK;GACL,KAAK;EACP;EACA,uBAAuB;GACrB,OAAO;GACP,KAAK;GACL,KAAK;EACP;CACF;AACF;AAEA,SAAgB,yBACd,OACA,QACA,OACM;CACN,MAAM,OAAO,CAAC,SAAS;CACvB,MAAM,OAAO,CAAC,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,KAAK,KAAK;CACrD,MAAM,OAAO,CAAC,OAAO;AACvB;AAEA,SAAgB,4BAA4B,gBAAoC,OAA2B;CACzG,KAAK,MAAM,UAAU,CAAC,WAAW,uBAAuB,GAAY;EAClE,eAAe,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC;EAC9C,eAAe,OAAO,CAAC,MAAM,KAAK,IAAI,eAAe,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,GAAG;EACnF,eAAe,OAAO,CAAC,OAAO,MAAM,OAAO,CAAC;CAC9C;AACF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { ChangeType, RecordType, SnapshotFormat } from "../../../types/sessionReplayConstants.mjs";
|
|
2
|
+
import { createChangeEncoder } from "../encoding/changeEncoder.mjs";
|
|
3
|
+
import { createSerializationStats, updateSerializationStats } from "./serializationStats.mjs";
|
|
4
|
+
import { elapsed, timeStampNow } from "@kubesense/kubesense-js-core/time";
|
|
5
|
+
//#region src/domain/record/serialization/serializationTransaction.ts
|
|
6
|
+
function serializeInTransaction(kind, emitRecord, emitStats, scope, timestamp, serialize) {
|
|
7
|
+
const encoder = createChangeEncoder(scope.stringIds);
|
|
8
|
+
const stats = createSerializationStats();
|
|
9
|
+
const transaction = {
|
|
10
|
+
addMetric(metric, value) {
|
|
11
|
+
updateSerializationStats(stats, metric, value);
|
|
12
|
+
},
|
|
13
|
+
addNode(...change) {
|
|
14
|
+
encoder.add(ChangeType.AddNode, change);
|
|
15
|
+
},
|
|
16
|
+
addStyleSheet(rules, mediaList, disabled) {
|
|
17
|
+
if (disabled) encoder.add(ChangeType.AddStyleSheet, [
|
|
18
|
+
rules,
|
|
19
|
+
mediaList || [],
|
|
20
|
+
disabled
|
|
21
|
+
]);
|
|
22
|
+
else if (mediaList) encoder.add(ChangeType.AddStyleSheet, [rules, mediaList]);
|
|
23
|
+
else encoder.add(ChangeType.AddStyleSheet, [rules]);
|
|
24
|
+
},
|
|
25
|
+
attachStyleSheets(nodeId, sheetIds) {
|
|
26
|
+
const change = [nodeId];
|
|
27
|
+
for (const sheetId of sheetIds) change.push(sheetId);
|
|
28
|
+
encoder.add(ChangeType.AttachedStyleSheets, change);
|
|
29
|
+
},
|
|
30
|
+
removeNode(nodeId) {
|
|
31
|
+
encoder.add(ChangeType.RemoveNode, nodeId);
|
|
32
|
+
},
|
|
33
|
+
setAttributes(change) {
|
|
34
|
+
encoder.add(ChangeType.Attribute, change);
|
|
35
|
+
},
|
|
36
|
+
setInputSelection(state, nodeIds) {
|
|
37
|
+
const change = [state];
|
|
38
|
+
for (const nodeId of nodeIds) change.push(nodeId);
|
|
39
|
+
encoder.add(ChangeType.InputSelection, change);
|
|
40
|
+
},
|
|
41
|
+
setInputValue(nodeId, value) {
|
|
42
|
+
encoder.add(ChangeType.InputValue, [nodeId, value]);
|
|
43
|
+
},
|
|
44
|
+
setMediaPlaybackState(nodeId, state) {
|
|
45
|
+
encoder.add(ChangeType.MediaPlaybackState, [nodeId, state]);
|
|
46
|
+
},
|
|
47
|
+
setScrollPosition(nodeId, x, y) {
|
|
48
|
+
encoder.add(ChangeType.ScrollPosition, [
|
|
49
|
+
nodeId,
|
|
50
|
+
x,
|
|
51
|
+
y
|
|
52
|
+
]);
|
|
53
|
+
},
|
|
54
|
+
setSize(nodeId, width, height) {
|
|
55
|
+
encoder.add(ChangeType.Size, [
|
|
56
|
+
nodeId,
|
|
57
|
+
width,
|
|
58
|
+
height
|
|
59
|
+
]);
|
|
60
|
+
},
|
|
61
|
+
setText(nodeId, content) {
|
|
62
|
+
encoder.add(ChangeType.Text, [nodeId, content]);
|
|
63
|
+
},
|
|
64
|
+
setImageContent(nodeId, resourceId) {
|
|
65
|
+
encoder.add(ChangeType.ImageContent, [nodeId, resourceId]);
|
|
66
|
+
},
|
|
67
|
+
kind,
|
|
68
|
+
scope
|
|
69
|
+
};
|
|
70
|
+
const start = timeStampNow();
|
|
71
|
+
serialize(transaction);
|
|
72
|
+
updateSerializationStats(stats, "serializationDuration", elapsed(start, timeStampNow()));
|
|
73
|
+
const changes = encoder.flush();
|
|
74
|
+
if (changes.length > 0) {
|
|
75
|
+
if (kind === 0 || kind === 1) emitRecord({
|
|
76
|
+
data: changes,
|
|
77
|
+
format: SnapshotFormat.Change,
|
|
78
|
+
type: RecordType.FullSnapshot,
|
|
79
|
+
timestamp
|
|
80
|
+
});
|
|
81
|
+
else emitRecord({
|
|
82
|
+
data: changes,
|
|
83
|
+
type: RecordType.Change,
|
|
84
|
+
timestamp
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
emitStats(stats);
|
|
88
|
+
}
|
|
89
|
+
//#endregion
|
|
90
|
+
export { serializeInTransaction };
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=serializationTransaction.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializationTransaction.mjs","names":[],"sources":["../../../../src/domain/record/serialization/serializationTransaction.ts"],"sourcesContent":["import { elapsed, timeStampNow } from '@kubesense/kubesense-js-core/time'\nimport type { TimeStamp } from '@kubesense/kubesense-js-core/time'\nimport { ChangeType, RecordType, SnapshotFormat } from '../../../types'\nimport type {\n AddCDataSectionNodeChange,\n AddDocTypeNodeChange,\n AddDocumentFragmentNodeChange,\n AddDocumentNodeChange,\n AddElementNodeChange,\n AddNodeChange,\n AddShadowRootNodeChange,\n AddTextNodeChange,\n AttachedStyleSheetsChange,\n InputSelectionChange,\n InputSelectionState,\n InsertionPoint,\n MediaInteractionType,\n RoleAnnotatedStringLiteral,\n} from '../../../types'\nimport type {\n NodeId,\n RoleAnnotatedAddNodeName,\n RoleAnnotatedAddNodeParams,\n RoleAnnotatedAttributeChange,\n RoleAnnotatedStringLiteralValue,\n RoleAnnotatedStyleSheetMediaList,\n RoleAnnotatedStyleSheetRules,\n StyleSheetId,\n} from '../encoding'\nimport { createChangeEncoder } from '../encoding'\nimport type { EmitRecordCallback, EmitStatsCallback } from '../record.types'\nimport type { RecordingScope } from '../recordingScope'\nimport type { SerializationStats } from './serializationStats'\nimport { createSerializationStats, updateSerializationStats } from './serializationStats'\n\nexport const enum SerializationKind {\n INITIAL_FULL_SNAPSHOT,\n SUBSEQUENT_FULL_SNAPSHOT,\n INCREMENTAL_SNAPSHOT,\n}\n\nexport type SerializationTransactionCallback = (transaction: SerializationTransaction) => void\n\n/**\n * SerializationTransaction is used to build and emit a `BrowserChangeRecord` containing a\n * serialized snapshot of the DOM. The term \"transaction\" is used because all the changes\n * in a serialization transaction are applied together, atomically. A serialization\n * transaction is thus always associated with a single timestamp.\n *\n * To use `SerializationTransaction`, call the builder methods it exposes to add changes\n * to the transaction. At the end of the transaction, the changes will be combined into a\n * single `BrowserChangeRecord` and emitted.\n */\nexport interface SerializationTransaction {\n /**\n * Add a metric to the transaction's statistics. The aggregated statistics will be\n * emitted when the transaction ends.\n */\n addMetric(metric: keyof SerializationStats, value: number): void\n\n /** Add a node to the document at the given insertion point. */\n addNode(\n pos: InsertionPoint,\n nodeName: RoleAnnotatedAddNodeName<AddCDataSectionNodeChange>,\n ...params: RoleAnnotatedAddNodeParams<AddCDataSectionNodeChange>\n ): void\n addNode(\n pos: InsertionPoint,\n nodeName: RoleAnnotatedAddNodeName<AddDocTypeNodeChange>,\n ...params: RoleAnnotatedAddNodeParams<AddDocTypeNodeChange>\n ): void\n addNode(\n pos: InsertionPoint,\n nodeName: RoleAnnotatedAddNodeName<AddDocumentNodeChange>,\n ...params: RoleAnnotatedAddNodeParams<AddDocumentNodeChange>\n ): void\n addNode(\n pos: InsertionPoint,\n nodeName: RoleAnnotatedAddNodeName<AddDocumentFragmentNodeChange>,\n ...params: RoleAnnotatedAddNodeParams<AddDocumentFragmentNodeChange>\n ): void\n addNode(\n pos: InsertionPoint,\n nodeName: RoleAnnotatedAddNodeName<AddShadowRootNodeChange>,\n ...params: RoleAnnotatedAddNodeParams<AddShadowRootNodeChange>\n ): void\n addNode(\n pos: InsertionPoint,\n nodeName: RoleAnnotatedAddNodeName<AddTextNodeChange>,\n ...params: RoleAnnotatedAddNodeParams<AddTextNodeChange>\n ): void\n addNode<Name extends RoleAnnotatedAddNodeName<AddElementNodeChange>>(\n pos: InsertionPoint,\n nodeName: Name,\n // This overload is deliberately unsatisfiable; a '#'-prefixed name belongs to one of\n // the node kinds above, so we should never reach it unless the caller provided\n // invalid parameters.\n ...params: RoleAnnotatedStringLiteralValue<Name> extends `#${string}`\n ? [never]\n : RoleAnnotatedAddNodeParams<AddElementNodeChange>\n ): void\n\n /** Add a stylesheet to the document. */\n addStyleSheet(\n rules: RoleAnnotatedStyleSheetRules,\n mediaList?: RoleAnnotatedStyleSheetMediaList,\n disabled?: boolean\n ): void\n\n /**\n * Attach one or more stylesheets to a <link>, <style>, #document, #document-fragment,\n * or #shadow-root node.\n */\n attachStyleSheets(nodeId: NodeId, sheetIds: StyleSheetId[]): void\n\n /** Remove a node from the document. */\n removeNode(nodeId: NodeId): void\n\n /** Set a node's attributes to the given values. */\n setAttributes(change: RoleAnnotatedAttributeChange): void\n\n /** Set the content of a canvas node to the given resource ID. */\n setImageContent(nodeId: NodeId, resourceId: RoleAnnotatedStringLiteral): void\n\n /** Set the selection state of one or more checkboxes, radio buttons, or <option> elements. */\n setInputSelection(state: InputSelectionState, nodeIds: NodeId[]): void\n\n /** Set the value of a form element. */\n setInputValue(nodeId: NodeId, value: RoleAnnotatedStringLiteral): void\n\n /** Set the media playback state of an <audio> or <video> element. */\n setMediaPlaybackState(nodeId: NodeId, state: MediaInteractionType): void\n\n /** Set the given node's scroll position in CSS pixels. */\n setScrollPosition(nodeId: NodeId, x: number, y: number): void\n\n /** Set the given node's size in CSS pixels. */\n setSize(nodeId: NodeId, width: number, height: number): void\n\n /** Set the given node's text content. */\n setText(nodeId: NodeId, content: RoleAnnotatedStringLiteral): void\n\n /** The kind of serialization being performed in this transaction. */\n kind: SerializationKind\n\n /** The recording scope in which this transaction is occurring. */\n scope: RecordingScope\n}\n\nexport function serializeInTransaction(\n kind: SerializationKind,\n emitRecord: EmitRecordCallback,\n emitStats: EmitStatsCallback,\n scope: RecordingScope,\n timestamp: TimeStamp,\n serialize: SerializationTransactionCallback\n): void {\n const encoder = createChangeEncoder(scope.stringIds)\n const stats = createSerializationStats()\n\n const transaction: SerializationTransaction = {\n addMetric(metric: keyof SerializationStats, value: number): void {\n updateSerializationStats(stats, metric, value)\n },\n // The overloads declared above are what callers are checked against; this implementation\n // takes the parameters of any of them.\n addNode(...change: unknown[]): void {\n encoder.add(ChangeType.AddNode, change as AddNodeChange)\n },\n addStyleSheet(\n rules: RoleAnnotatedStyleSheetRules,\n mediaList?: RoleAnnotatedStyleSheetMediaList,\n disabled?: boolean\n ): void {\n if (disabled) {\n encoder.add(ChangeType.AddStyleSheet, [rules, mediaList || [], disabled])\n } else if (mediaList) {\n encoder.add(ChangeType.AddStyleSheet, [rules, mediaList])\n } else {\n encoder.add(ChangeType.AddStyleSheet, [rules])\n }\n },\n attachStyleSheets(nodeId: NodeId, sheetIds: StyleSheetId[]): void {\n const change: AttachedStyleSheetsChange = [nodeId]\n for (const sheetId of sheetIds) {\n change.push(sheetId)\n }\n encoder.add(ChangeType.AttachedStyleSheets, change)\n },\n removeNode(nodeId: NodeId): void {\n encoder.add(ChangeType.RemoveNode, nodeId)\n },\n setAttributes(change: RoleAnnotatedAttributeChange): void {\n encoder.add(ChangeType.Attribute, change)\n },\n setInputSelection(state: InputSelectionState, nodeIds: NodeId[]): void {\n const change: InputSelectionChange = [state]\n for (const nodeId of nodeIds) {\n change.push(nodeId)\n }\n encoder.add(ChangeType.InputSelection, change)\n },\n setInputValue(nodeId: NodeId, value: RoleAnnotatedStringLiteral): void {\n encoder.add(ChangeType.InputValue, [nodeId, value])\n },\n setMediaPlaybackState(nodeId: NodeId, state: MediaInteractionType): void {\n encoder.add(ChangeType.MediaPlaybackState, [nodeId, state])\n },\n setScrollPosition(nodeId: NodeId, x: number, y: number): void {\n encoder.add(ChangeType.ScrollPosition, [nodeId, x, y])\n },\n setSize(nodeId: NodeId, width: number, height: number): void {\n encoder.add(ChangeType.Size, [nodeId, width, height])\n },\n setText(nodeId: NodeId, content: RoleAnnotatedStringLiteral): void {\n encoder.add(ChangeType.Text, [nodeId, content])\n },\n setImageContent(nodeId: NodeId, resourceId: RoleAnnotatedStringLiteral): void {\n encoder.add(ChangeType.ImageContent, [nodeId, resourceId])\n },\n kind,\n scope,\n }\n\n const start = timeStampNow()\n serialize(transaction)\n updateSerializationStats(stats, 'serializationDuration', elapsed(start, timeStampNow()))\n\n const changes = encoder.flush()\n if (changes.length > 0) {\n if (kind === SerializationKind.INITIAL_FULL_SNAPSHOT || kind === SerializationKind.SUBSEQUENT_FULL_SNAPSHOT) {\n emitRecord({\n data: changes,\n format: SnapshotFormat.Change,\n type: RecordType.FullSnapshot,\n timestamp,\n })\n } else {\n emitRecord({\n data: changes,\n type: RecordType.Change,\n timestamp,\n })\n }\n }\n\n emitStats(stats)\n}\n"],"mappings":";;;;;AAqJA,SAAgB,uBACd,MACA,YACA,WACA,OACA,WACA,WACM;CACN,MAAM,UAAU,oBAAoB,MAAM,SAAS;CACnD,MAAM,QAAQ,yBAAyB;CAEvC,MAAM,cAAwC;EAC5C,UAAU,QAAkC,OAAqB;GAC/D,yBAAyB,OAAO,QAAQ,KAAK;EAC/C;EAGA,QAAQ,GAAG,QAAyB;GAClC,QAAQ,IAAI,WAAW,SAAS,MAAuB;EACzD;EACA,cACE,OACA,WACA,UACM;GACN,IAAI,UACF,QAAQ,IAAI,WAAW,eAAe;IAAC;IAAO,aAAa,CAAC;IAAG;GAAQ,CAAC;QACnE,IAAI,WACT,QAAQ,IAAI,WAAW,eAAe,CAAC,OAAO,SAAS,CAAC;QAExD,QAAQ,IAAI,WAAW,eAAe,CAAC,KAAK,CAAC;EAEjD;EACA,kBAAkB,QAAgB,UAAgC;GAChE,MAAM,SAAoC,CAAC,MAAM;GACjD,KAAK,MAAM,WAAW,UACpB,OAAO,KAAK,OAAO;GAErB,QAAQ,IAAI,WAAW,qBAAqB,MAAM;EACpD;EACA,WAAW,QAAsB;GAC/B,QAAQ,IAAI,WAAW,YAAY,MAAM;EAC3C;EACA,cAAc,QAA4C;GACxD,QAAQ,IAAI,WAAW,WAAW,MAAM;EAC1C;EACA,kBAAkB,OAA4B,SAAyB;GACrE,MAAM,SAA+B,CAAC,KAAK;GAC3C,KAAK,MAAM,UAAU,SACnB,OAAO,KAAK,MAAM;GAEpB,QAAQ,IAAI,WAAW,gBAAgB,MAAM;EAC/C;EACA,cAAc,QAAgB,OAAyC;GACrE,QAAQ,IAAI,WAAW,YAAY,CAAC,QAAQ,KAAK,CAAC;EACpD;EACA,sBAAsB,QAAgB,OAAmC;GACvE,QAAQ,IAAI,WAAW,oBAAoB,CAAC,QAAQ,KAAK,CAAC;EAC5D;EACA,kBAAkB,QAAgB,GAAW,GAAiB;GAC5D,QAAQ,IAAI,WAAW,gBAAgB;IAAC;IAAQ;IAAG;GAAC,CAAC;EACvD;EACA,QAAQ,QAAgB,OAAe,QAAsB;GAC3D,QAAQ,IAAI,WAAW,MAAM;IAAC;IAAQ;IAAO;GAAM,CAAC;EACtD;EACA,QAAQ,QAAgB,SAA2C;GACjE,QAAQ,IAAI,WAAW,MAAM,CAAC,QAAQ,OAAO,CAAC;EAChD;EACA,gBAAgB,QAAgB,YAA8C;GAC5E,QAAQ,IAAI,WAAW,cAAc,CAAC,QAAQ,UAAU,CAAC;EAC3D;EACA;EACA;CACF;CAEA,MAAM,QAAQ,aAAa;CAC3B,UAAU,WAAW;CACrB,yBAAyB,OAAO,yBAAyB,QAAQ,OAAO,aAAa,CAAC,CAAC;CAEvF,MAAM,UAAU,QAAQ,MAAM;CAC9B,IAAI,QAAQ,SAAS,GAAG;EACtB,IAAI,SAAA,KAAoD,SAAA,GACtD,WAAW;GACT,MAAM;GACN,QAAQ,eAAe;GACvB,MAAM,WAAW;GACjB;EACF,CAAC;OAED,WAAW;GACT,MAAM;GACN,MAAM,WAAW;GACjB;EACF,CAAC;CAEL;CAEA,UAAU,KAAK;AACjB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { CENSORED_STRING_MARK, shouldMaskNode } from "@kubesense/kubesense-browser-rum-core";
|
|
2
|
+
import { buildUrl } from "@kubesense/kubesense-js-core/util";
|
|
3
|
+
//#region src/domain/record/serialization/serializationUtils.ts
|
|
4
|
+
/**
|
|
5
|
+
* Get the element "value" to be serialized as an attribute or an input update record. It respects
|
|
6
|
+
* the input privacy mode of the element.
|
|
7
|
+
* PERFROMANCE OPTIMIZATION: Assumes that privacy level `HIDDEN` is never encountered because of earlier checks.
|
|
8
|
+
*/
|
|
9
|
+
function getElementInputValue(element, nodePrivacyLevel) {
|
|
10
|
+
const tagName = element.tagName;
|
|
11
|
+
const value = element.value;
|
|
12
|
+
if (shouldMaskNode(element, nodePrivacyLevel)) {
|
|
13
|
+
const type = element.type;
|
|
14
|
+
if (tagName === "INPUT" && (type === "button" || type === "submit" || type === "reset")) return value;
|
|
15
|
+
else if (!value || tagName === "OPTION") return;
|
|
16
|
+
return CENSORED_STRING_MARK;
|
|
17
|
+
}
|
|
18
|
+
if (tagName === "OPTION" || tagName === "SELECT") return element.value;
|
|
19
|
+
if (tagName !== "INPUT" && tagName !== "TEXTAREA") return;
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
const URL_IN_CSS_REF = /url\((?:(')([^']*)'|(")([^"]*)"|([^)]*))\)/gm;
|
|
23
|
+
const ABSOLUTE_URL = /^[A-Za-z]+:|^\/\//;
|
|
24
|
+
const DATA_URI = /^["']?data:.*,/i;
|
|
25
|
+
function switchToAbsoluteUrl(cssText, cssHref) {
|
|
26
|
+
return cssText.replace(URL_IN_CSS_REF, (matchingSubstring, singleQuote, urlWrappedInSingleQuotes, doubleQuote, urlWrappedInDoubleQuotes, urlNotWrappedInQuotes) => {
|
|
27
|
+
const url = urlWrappedInSingleQuotes || urlWrappedInDoubleQuotes || urlNotWrappedInQuotes;
|
|
28
|
+
if (!cssHref || !url || ABSOLUTE_URL.test(url) || DATA_URI.test(url)) return matchingSubstring;
|
|
29
|
+
const quote = singleQuote || doubleQuote || "";
|
|
30
|
+
return `url(${quote}${makeUrlAbsolute(url, cssHref)}${quote})`;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function makeUrlAbsolute(url, baseUrl) {
|
|
34
|
+
try {
|
|
35
|
+
return buildUrl(url, baseUrl).href;
|
|
36
|
+
} catch {
|
|
37
|
+
return url;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns the tag name of the given element, normalized to ensure a consistent lowercase
|
|
42
|
+
* representation regardless of whether the element is HTML, XHTML, or SVG.
|
|
43
|
+
*/
|
|
44
|
+
function normalizedTagName(element) {
|
|
45
|
+
return element.tagName.toLowerCase();
|
|
46
|
+
}
|
|
47
|
+
function censoredImageForSize(width, height) {
|
|
48
|
+
return `data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='${width}' height='${height}' style='background-color:silver'%3E%3C/svg%3E`;
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
export { ABSOLUTE_URL, DATA_URI, URL_IN_CSS_REF, censoredImageForSize, getElementInputValue, normalizedTagName, switchToAbsoluteUrl };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=serializationUtils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializationUtils.mjs","names":[],"sources":["../../../../src/domain/record/serialization/serializationUtils.ts"],"sourcesContent":["import { buildUrl } from '@kubesense/kubesense-js-core/util'\nimport { CENSORED_STRING_MARK, shouldMaskNode } from '@kubesense/kubesense-browser-rum-core'\nimport type { NodePrivacyLevel } from '@kubesense/kubesense-browser-rum-core'\n\n/**\n * Get the element \"value\" to be serialized as an attribute or an input update record. It respects\n * the input privacy mode of the element.\n * PERFROMANCE OPTIMIZATION: Assumes that privacy level `HIDDEN` is never encountered because of earlier checks.\n */\nexport function getElementInputValue(element: Element, nodePrivacyLevel: NodePrivacyLevel) {\n /*\n BROWSER SPEC NOTE: <input>, <select>\n For some <input> elements, the `value` is an exceptional property/attribute that has the\n value synced between el.value and el.getAttribute()\n input[type=button,checkbox,hidden,image,radio,reset,submit]\n */\n const tagName = element.tagName\n const value = (element as HTMLInputElement | HTMLTextAreaElement).value\n\n if (shouldMaskNode(element, nodePrivacyLevel)) {\n const type = (element as HTMLInputElement | HTMLTextAreaElement).type\n if (tagName === 'INPUT' && (type === 'button' || type === 'submit' || type === 'reset')) {\n // Overrule `MASK` privacy level for button-like element values, as they are used during replay\n // to display their label. They can still be hidden via the \"hidden\" privacy attribute or class name.\n return value\n } else if (!value || tagName === 'OPTION') {\n // <Option> value provides no benefit\n return\n }\n return CENSORED_STRING_MARK\n }\n\n if (tagName === 'OPTION' || tagName === 'SELECT') {\n return (element as HTMLOptionElement | HTMLSelectElement).value\n }\n\n if (tagName !== 'INPUT' && tagName !== 'TEXTAREA') {\n return\n }\n\n return value\n}\n\nexport const URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")([^\"]*)\"|([^)]*))\\)/gm\nexport const ABSOLUTE_URL = /^[A-Za-z]+:|^\\/\\//\nexport const DATA_URI = /^[\"']?data:.*,/i\n\nexport function switchToAbsoluteUrl(cssText: string, cssHref: string | null): string {\n return cssText.replace(\n URL_IN_CSS_REF,\n (\n matchingSubstring: string,\n singleQuote: string | undefined,\n urlWrappedInSingleQuotes: string | undefined,\n doubleQuote: string | undefined,\n urlWrappedInDoubleQuotes: string | undefined,\n urlNotWrappedInQuotes: string | undefined\n ) => {\n const url = urlWrappedInSingleQuotes || urlWrappedInDoubleQuotes || urlNotWrappedInQuotes\n\n if (!cssHref || !url || ABSOLUTE_URL.test(url) || DATA_URI.test(url)) {\n return matchingSubstring\n }\n\n const quote = singleQuote || doubleQuote || ''\n return `url(${quote}${makeUrlAbsolute(url, cssHref)}${quote})`\n }\n )\n}\n\nfunction makeUrlAbsolute(url: string, baseUrl: string): string {\n try {\n return buildUrl(url, baseUrl).href\n } catch {\n return url\n }\n}\n\n/**\n * Returns the tag name of the given element, normalized to ensure a consistent lowercase\n * representation regardless of whether the element is HTML, XHTML, or SVG.\n */\nexport function normalizedTagName(element: Element): string {\n return element.tagName.toLowerCase()\n}\n\nexport function censoredImageForSize(width: number, height: number) {\n return `data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='${width}' height='${height}' style='background-color:silver'%3E%3C/svg%3E`\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,qBAAqB,SAAkB,kBAAoC;CAOzF,MAAM,UAAU,QAAQ;CACxB,MAAM,QAAS,QAAmD;CAElE,IAAI,eAAe,SAAS,gBAAgB,GAAG;EAC7C,MAAM,OAAQ,QAAmD;EACjE,IAAI,YAAY,YAAY,SAAS,YAAY,SAAS,YAAY,SAAS,UAG7E,OAAO;OACF,IAAI,CAAC,SAAS,YAAY,UAE/B;EAEF,OAAO;CACT;CAEA,IAAI,YAAY,YAAY,YAAY,UACtC,OAAQ,QAAkD;CAG5D,IAAI,YAAY,WAAW,YAAY,YACrC;CAGF,OAAO;AACT;AAEA,MAAa,iBAAiB;AAC9B,MAAa,eAAe;AAC5B,MAAa,WAAW;AAExB,SAAgB,oBAAoB,SAAiB,SAAgC;CACnF,OAAO,QAAQ,QACb,iBAEE,mBACA,aACA,0BACA,aACA,0BACA,0BACG;EACH,MAAM,MAAM,4BAA4B,4BAA4B;EAEpE,IAAI,CAAC,WAAW,CAAC,OAAO,aAAa,KAAK,GAAG,KAAK,SAAS,KAAK,GAAG,GACjE,OAAO;EAGT,MAAM,QAAQ,eAAe,eAAe;EAC5C,OAAO,OAAO,QAAQ,gBAAgB,KAAK,OAAO,IAAI,MAAM;CAC9D,CACF;AACF;AAEA,SAAS,gBAAgB,KAAa,SAAyB;CAC7D,IAAI;EACF,OAAO,SAAS,KAAK,OAAO,CAAC,CAAC;CAChC,QAAQ;EACN,OAAO;CACT;AACF;;;;;AAMA,SAAgB,kBAAkB,SAA0B;CAC1D,OAAO,QAAQ,QAAQ,YAAY;AACrC;AAEA,SAAgB,qBAAqB,OAAe,QAAgB;CAClE,OAAO,uEAAuE,MAAM,YAAY,OAAO;AACzG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { censoredImageForSize } from "./serializationUtils.mjs";
|
|
2
|
+
import { CENSORED_IMG_MARK, CENSORED_STRING_MARK, NodePrivacyLevel, sanitizeIfLongDataUrl, shouldMaskAttribute } from "@kubesense/kubesense-browser-rum-core";
|
|
3
|
+
//#region src/domain/record/serialization/serializeAttribute.ts
|
|
4
|
+
const MAX_ATTRIBUTE_VALUE_CHAR_LENGTH = 1e6;
|
|
5
|
+
function serializeAttribute(element, nodePrivacyLevel, attributeName, configuration) {
|
|
6
|
+
if (nodePrivacyLevel === NodePrivacyLevel.HIDDEN) return null;
|
|
7
|
+
const attributeValue = element.getAttribute(attributeName);
|
|
8
|
+
const tagName = element.tagName;
|
|
9
|
+
if (shouldMaskAttribute(tagName, attributeName, attributeValue, nodePrivacyLevel, configuration)) {
|
|
10
|
+
if (tagName === "IMG") {
|
|
11
|
+
const image = element;
|
|
12
|
+
if (image.naturalWidth > 0) return censoredImageForSize(image.naturalWidth, image.naturalHeight);
|
|
13
|
+
const { width, height } = element.getBoundingClientRect();
|
|
14
|
+
if (width > 0 || height > 0) return censoredImageForSize(width, height);
|
|
15
|
+
return CENSORED_IMG_MARK;
|
|
16
|
+
}
|
|
17
|
+
if (tagName === "SOURCE") return CENSORED_IMG_MARK;
|
|
18
|
+
return CENSORED_STRING_MARK;
|
|
19
|
+
}
|
|
20
|
+
if (!attributeValue) return attributeValue;
|
|
21
|
+
return sanitizeIfLongDataUrl(attributeValue, MAX_ATTRIBUTE_VALUE_CHAR_LENGTH);
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
export { MAX_ATTRIBUTE_VALUE_CHAR_LENGTH, serializeAttribute };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=serializeAttribute.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializeAttribute.mjs","names":[],"sources":["../../../../src/domain/record/serialization/serializeAttribute.ts"],"sourcesContent":["import {\n NodePrivacyLevel,\n CENSORED_STRING_MARK,\n CENSORED_IMG_MARK,\n sanitizeIfLongDataUrl,\n shouldMaskAttribute,\n} from '@kubesense/kubesense-browser-rum-core'\nimport type { RumConfiguration } from '@kubesense/kubesense-browser-rum-core'\nimport { censoredImageForSize } from './serializationUtils'\n\n// TODO: temporarily bump the Session Replay limit to 1Mb for dataUrls\n// This limit should be removed after [PANA-2843] is implemented\nexport const MAX_ATTRIBUTE_VALUE_CHAR_LENGTH = 1_000_000\n\nexport function serializeAttribute(\n element: Element,\n nodePrivacyLevel: NodePrivacyLevel,\n attributeName: string,\n configuration: RumConfiguration\n): string | null {\n if (nodePrivacyLevel === NodePrivacyLevel.HIDDEN) {\n // dup condition for direct access case\n return null\n }\n\n const attributeValue = element.getAttribute(attributeName)\n const tagName = element.tagName\n if (shouldMaskAttribute(tagName, attributeName, attributeValue, nodePrivacyLevel, configuration)) {\n // mask image URLs\n if (tagName === 'IMG') {\n // generate image with similar dimension than the original to have the same rendering behaviour\n const image = element as HTMLImageElement\n if (image.naturalWidth > 0) {\n return censoredImageForSize(image.naturalWidth, image.naturalHeight)\n }\n const { width, height } = element.getBoundingClientRect()\n if (width > 0 || height > 0) {\n return censoredImageForSize(width, height)\n }\n // if we can't get the image size, fallback to the censored image\n return CENSORED_IMG_MARK\n }\n if (tagName === 'SOURCE') {\n return CENSORED_IMG_MARK\n }\n\n return CENSORED_STRING_MARK\n }\n\n if (!attributeValue) {\n return attributeValue\n }\n\n return sanitizeIfLongDataUrl(attributeValue, MAX_ATTRIBUTE_VALUE_CHAR_LENGTH)\n}\n"],"mappings":";;;AAYA,MAAa,kCAAkC;AAE/C,SAAgB,mBACd,SACA,kBACA,eACA,eACe;CACf,IAAI,qBAAqB,iBAAiB,QAExC,OAAO;CAGT,MAAM,iBAAiB,QAAQ,aAAa,aAAa;CACzD,MAAM,UAAU,QAAQ;CACxB,IAAI,oBAAoB,SAAS,eAAe,gBAAgB,kBAAkB,aAAa,GAAG;EAEhG,IAAI,YAAY,OAAO;GAErB,MAAM,QAAQ;GACd,IAAI,MAAM,eAAe,GACvB,OAAO,qBAAqB,MAAM,cAAc,MAAM,aAAa;GAErE,MAAM,EAAE,OAAO,WAAW,QAAQ,sBAAsB;GACxD,IAAI,QAAQ,KAAK,SAAS,GACxB,OAAO,qBAAqB,OAAO,MAAM;GAG3C,OAAO;EACT;EACA,IAAI,YAAY,UACd,OAAO;EAGT,OAAO;CACT;CAEA,IAAI,CAAC,gBACH,OAAO;CAGT,OAAO,sBAAsB,gBAAgB,+BAA+B;AAC9E"}
|