@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,66 @@
|
|
|
1
|
+
import { clearTimeout, fetch, setTimeout } from "@kubesense/kubesense-browser-core";
|
|
2
|
+
import { buildEndpointUrl } from "@kubesense/kubesense-js-core/transport";
|
|
3
|
+
//#region src/domain/profiling/quotaCheck.ts
|
|
4
|
+
function parseQuotaResult(body, httpStatusFallback) {
|
|
5
|
+
const attrs = body?.data?.attributes;
|
|
6
|
+
if (!attrs || typeof attrs.admitted !== "boolean" || typeof attrs.reason !== "string") return httpStatusFallback;
|
|
7
|
+
const reason = attrs.reason === "backend_client_not_initialized" ? "backend_unavailable" : attrs.reason;
|
|
8
|
+
return {
|
|
9
|
+
decision: attrs.admitted ? "quota_ok" : "quota_ko",
|
|
10
|
+
reason
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function buildQuotaUrl(configuration, sessionId) {
|
|
14
|
+
return buildEndpointUrl({
|
|
15
|
+
proxy: configuration.proxy,
|
|
16
|
+
kubesenseRumEndpoint: configuration.kubesenseRumEndpoint,
|
|
17
|
+
path: "/rum/api/v1/profiling/quota",
|
|
18
|
+
parameters: `session_id=${sessionId}`,
|
|
19
|
+
subdomain: "quota"
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function checkProfilingQuota(configuration, sessionId, timeoutMs = 5e3) {
|
|
23
|
+
const url = buildQuotaUrl(configuration, sessionId);
|
|
24
|
+
const controller = new AbortController();
|
|
25
|
+
let timeoutId;
|
|
26
|
+
const fetchPromise = fetch(url, {
|
|
27
|
+
credentials: "omit",
|
|
28
|
+
signal: controller.signal,
|
|
29
|
+
headers: new Headers({ "DD-CLIENT-TOKEN": configuration.clientToken })
|
|
30
|
+
}).then((response) => {
|
|
31
|
+
const statusFallback = response.status === 429 ? {
|
|
32
|
+
decision: "quota_ko",
|
|
33
|
+
reason: "quota_exceeded"
|
|
34
|
+
} : {
|
|
35
|
+
decision: "quota_ok",
|
|
36
|
+
reason: "api-error"
|
|
37
|
+
};
|
|
38
|
+
return response.json().then((body) => {
|
|
39
|
+
clearTimeout(timeoutId);
|
|
40
|
+
return parseQuotaResult(body, statusFallback);
|
|
41
|
+
}, () => {
|
|
42
|
+
clearTimeout(timeoutId);
|
|
43
|
+
return statusFallback;
|
|
44
|
+
});
|
|
45
|
+
}).catch(() => {
|
|
46
|
+
clearTimeout(timeoutId);
|
|
47
|
+
return {
|
|
48
|
+
decision: "quota_ok",
|
|
49
|
+
reason: "api-error"
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
53
|
+
timeoutId = setTimeout(() => {
|
|
54
|
+
controller.abort();
|
|
55
|
+
resolve({
|
|
56
|
+
decision: "quota_ok",
|
|
57
|
+
reason: "timeout"
|
|
58
|
+
});
|
|
59
|
+
}, timeoutMs);
|
|
60
|
+
});
|
|
61
|
+
return Promise.race([fetchPromise, timeoutPromise]);
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
export { checkProfilingQuota };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=quotaCheck.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quotaCheck.mjs","names":[],"sources":["../../../src/domain/profiling/quotaCheck.ts"],"sourcesContent":["import { fetch, setTimeout, clearTimeout } from '@kubesense/kubesense-browser-core'\nimport { buildEndpointUrl } from '@kubesense/kubesense-js-core/transport'\nimport type { RumConfiguration } from '@kubesense/kubesense-browser-rum-core'\n\n// Reason strings surfaced on RUM events. Backend reasons backend_unavailable and\n// backend_client_not_initialized are both normalised to backend_unavailable.\nexport type BackendQuotaReason = 'quota_ok' | 'quota_exceeded' | 'org_disabled' | 'backend_unavailable' | 'undefined'\n\n// SDK-only reasons used when the backend is not reachable.\nexport type FrontendQuotaReason = 'timeout' | 'api-error'\n\nexport type QuotaReason = BackendQuotaReason | FrontendQuotaReason\n\nexport interface QuotaResult {\n decision: 'quota_ok' | 'quota_ko'\n reason: QuotaReason\n}\n\nfunction parseQuotaResult(body: unknown, httpStatusFallback: QuotaResult): QuotaResult {\n const attrs = (body as any)?.data?.attributes\n if (!attrs || typeof attrs.admitted !== 'boolean' || typeof attrs.reason !== 'string') {\n return httpStatusFallback\n }\n const reason: BackendQuotaReason =\n attrs.reason === 'backend_client_not_initialized' ? 'backend_unavailable' : (attrs.reason as BackendQuotaReason)\n return {\n decision: attrs.admitted ? 'quota_ok' : 'quota_ko',\n reason,\n }\n}\n\nfunction buildQuotaUrl(configuration: RumConfiguration, sessionId: string): string {\n return buildEndpointUrl({\n proxy: configuration.proxy,\n kubesenseRumEndpoint: configuration.kubesenseRumEndpoint,\n path: '/rum/api/v1/profiling/quota',\n parameters: `session_id=${sessionId}`,\n subdomain: 'quota',\n })\n}\n\nexport function checkProfilingQuota(\n configuration: RumConfiguration,\n sessionId: string,\n timeoutMs = 5000\n): Promise<QuotaResult> {\n const url = buildQuotaUrl(configuration, sessionId)\n const controller = new AbortController()\n\n let timeoutId: ReturnType<typeof setTimeout>\n\n const fetchPromise = fetch(url, {\n credentials: 'omit',\n signal: controller.signal,\n headers: new Headers({\n 'DD-CLIENT-TOKEN': configuration.clientToken,\n }),\n })\n .then((response) => {\n const statusFallback: QuotaResult =\n response.status === 429\n ? { decision: 'quota_ko', reason: 'quota_exceeded' }\n : { decision: 'quota_ok', reason: 'api-error' }\n return response.json().then(\n (body): QuotaResult => {\n clearTimeout(timeoutId)\n return parseQuotaResult(body, statusFallback)\n },\n (): QuotaResult => {\n // Body unparseable — fall back to HTTP status\n clearTimeout(timeoutId)\n return statusFallback\n }\n )\n })\n .catch((): QuotaResult => {\n clearTimeout(timeoutId)\n return { decision: 'quota_ok', reason: 'api-error' }\n })\n\n const timeoutPromise = new Promise<QuotaResult>((resolve) => {\n timeoutId = setTimeout(() => {\n controller.abort()\n resolve({ decision: 'quota_ok', reason: 'timeout' })\n }, timeoutMs)\n })\n\n return Promise.race([fetchPromise, timeoutPromise])\n}\n"],"mappings":";;;AAkBA,SAAS,iBAAiB,MAAe,oBAA8C;CACrF,MAAM,QAAS,MAAc,MAAM;CACnC,IAAI,CAAC,SAAS,OAAO,MAAM,aAAa,aAAa,OAAO,MAAM,WAAW,UAC3E,OAAO;CAET,MAAM,SACJ,MAAM,WAAW,mCAAmC,wBAAyB,MAAM;CACrF,OAAO;EACL,UAAU,MAAM,WAAW,aAAa;EACxC;CACF;AACF;AAEA,SAAS,cAAc,eAAiC,WAA2B;CACjF,OAAO,iBAAiB;EACtB,OAAO,cAAc;EACrB,sBAAsB,cAAc;EACpC,MAAM;EACN,YAAY,cAAc;EAC1B,WAAW;CACb,CAAC;AACH;AAEA,SAAgB,oBACd,eACA,WACA,YAAY,KACU;CACtB,MAAM,MAAM,cAAc,eAAe,SAAS;CAClD,MAAM,aAAa,IAAI,gBAAgB;CAEvC,IAAI;CAEJ,MAAM,eAAe,MAAM,KAAK;EAC9B,aAAa;EACb,QAAQ,WAAW;EACnB,SAAS,IAAI,QAAQ,EACnB,mBAAmB,cAAc,YACnC,CAAC;CACH,CAAC,CAAC,CACC,MAAM,aAAa;EAClB,MAAM,iBACJ,SAAS,WAAW,MAChB;GAAE,UAAU;GAAY,QAAQ;EAAiB,IACjD;GAAE,UAAU;GAAY,QAAQ;EAAY;EAClD,OAAO,SAAS,KAAK,CAAC,CAAC,MACpB,SAAsB;GACrB,aAAa,SAAS;GACtB,OAAO,iBAAiB,MAAM,cAAc;EAC9C,SACmB;GAEjB,aAAa,SAAS;GACtB,OAAO;EACT,CACF;CACF,CAAC,CAAC,CACD,YAAyB;EACxB,aAAa,SAAS;EACtB,OAAO;GAAE,UAAU;GAAY,QAAQ;EAAY;CACrD,CAAC;CAEH,MAAM,iBAAiB,IAAI,SAAsB,YAAY;EAC3D,YAAY,iBAAiB;GAC3B,WAAW,MAAM;GACjB,QAAQ;IAAE,UAAU;IAAY,QAAQ;GAAU,CAAC;EACrD,GAAG,SAAS;CACd,CAAC;CAED,OAAO,QAAQ,KAAK,CAAC,cAAc,cAAc,CAAC;AACpD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { buildTags } from "@kubesense/kubesense-browser-core";
|
|
2
|
+
import { clockDrift } from "@kubesense/kubesense-js-core/time";
|
|
3
|
+
//#region src/domain/profiling/transport/buildProfileEvent.ts
|
|
4
|
+
/**
|
|
5
|
+
* Builds a BrowserProfileEvent from a trace.
|
|
6
|
+
*/
|
|
7
|
+
function buildProfileEvent(profilerTrace, configuration, sessionId) {
|
|
8
|
+
const tags = buildTags(configuration);
|
|
9
|
+
const profileAttributes = buildProfileEventAttributes(profilerTrace, configuration.applicationId, sessionId);
|
|
10
|
+
const profileEventTags = buildProfileEventTags(tags);
|
|
11
|
+
return {
|
|
12
|
+
...profileAttributes,
|
|
13
|
+
attachments: ["wall-time.json"],
|
|
14
|
+
start: new Date(profilerTrace.startClocks.timeStamp).toISOString(),
|
|
15
|
+
end: new Date(profilerTrace.endClocks.timeStamp).toISOString(),
|
|
16
|
+
family: "chrome",
|
|
17
|
+
runtime: "chrome",
|
|
18
|
+
format: "json",
|
|
19
|
+
version: 4,
|
|
20
|
+
tags_profiler: profileEventTags.join(","),
|
|
21
|
+
_kubesense: { clock_drift: clockDrift() }
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Builds attributes for the Profile Event.
|
|
26
|
+
*
|
|
27
|
+
* @param profilerTrace - Profiler trace
|
|
28
|
+
* @param applicationId - application id.
|
|
29
|
+
* @param sessionId - session id.
|
|
30
|
+
* @returns Additional attributes.
|
|
31
|
+
*/
|
|
32
|
+
function buildProfileEventAttributes(profilerTrace, applicationId, sessionId) {
|
|
33
|
+
const { ids, names } = extractViewIdsAndNames(profilerTrace.views);
|
|
34
|
+
const longTaskIds = profilerTrace.longTasks.map((longTask) => longTask.id).filter((id) => id !== void 0);
|
|
35
|
+
const actionIds = profilerTrace.actions?.map((longTask) => longTask.id).filter((id) => id !== void 0) ?? [];
|
|
36
|
+
const { ids: vitalIds, labels: vitalLabels } = extractVitalIdsAndLabels(profilerTrace.vitals);
|
|
37
|
+
const attributes = { application: { id: applicationId } };
|
|
38
|
+
if (sessionId) attributes.session = { id: sessionId };
|
|
39
|
+
if (ids.length) attributes.view = {
|
|
40
|
+
id: ids,
|
|
41
|
+
name: names
|
|
42
|
+
};
|
|
43
|
+
if (longTaskIds.length) attributes.long_task = { id: longTaskIds };
|
|
44
|
+
if (actionIds.length) attributes.action = {
|
|
45
|
+
id: actionIds,
|
|
46
|
+
label: []
|
|
47
|
+
};
|
|
48
|
+
if (vitalIds.length) attributes.vital = {
|
|
49
|
+
id: vitalIds,
|
|
50
|
+
label: vitalLabels
|
|
51
|
+
};
|
|
52
|
+
return attributes;
|
|
53
|
+
}
|
|
54
|
+
function extractViewIdsAndNames(views) {
|
|
55
|
+
const result = {
|
|
56
|
+
ids: [],
|
|
57
|
+
names: []
|
|
58
|
+
};
|
|
59
|
+
for (const view of views) {
|
|
60
|
+
result.ids.push(view.viewId);
|
|
61
|
+
if (view.viewName) result.names.push(view.viewName);
|
|
62
|
+
}
|
|
63
|
+
result.names = Array.from(new Set(result.names));
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
function extractVitalIdsAndLabels(vitals) {
|
|
67
|
+
const result = {
|
|
68
|
+
ids: [],
|
|
69
|
+
labels: []
|
|
70
|
+
};
|
|
71
|
+
if (!vitals) return result;
|
|
72
|
+
for (const vital of vitals) {
|
|
73
|
+
result.ids.push(vital.id);
|
|
74
|
+
result.labels.push(vital.label);
|
|
75
|
+
}
|
|
76
|
+
result.labels = Array.from(new Set(result.labels));
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
function buildProfileEventTags(tags) {
|
|
80
|
+
return tags.concat([
|
|
81
|
+
"language:javascript",
|
|
82
|
+
"runtime:chrome",
|
|
83
|
+
"family:chrome",
|
|
84
|
+
"host:browser"
|
|
85
|
+
]);
|
|
86
|
+
}
|
|
87
|
+
//#endregion
|
|
88
|
+
export { buildProfileEvent, buildProfileEventAttributes };
|
|
89
|
+
|
|
90
|
+
//# sourceMappingURL=buildProfileEvent.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildProfileEvent.mjs","names":[],"sources":["../../../../src/domain/profiling/transport/buildProfileEvent.ts"],"sourcesContent":["import { clockDrift } from '@kubesense/kubesense-js-core/time'\nimport { buildTags } from '@kubesense/kubesense-browser-core'\nimport type { RumConfiguration } from '@kubesense/kubesense-browser-rum-core'\nimport type { BrowserProfileEvent, BrowserProfilerTrace, RumProfilerVitalEntry, RumViewEntry } from '../../../types'\n\nexport interface ProfileEventAttributes {\n application: {\n id: string\n }\n session?: {\n id: string\n }\n view?: {\n id: string[]\n name: string[]\n }\n long_task?: {\n id: string[]\n }\n action?: {\n id: string[]\n label: string[]\n }\n vital?: {\n id: string[]\n label: string[]\n }\n}\n\n/**\n * Builds a BrowserProfileEvent from a trace.\n */\nexport function buildProfileEvent(\n profilerTrace: BrowserProfilerTrace,\n configuration: RumConfiguration,\n sessionId: string | undefined\n): BrowserProfileEvent {\n const tags = buildTags(configuration) // TODO: get that from the tagContext hook\n const profileAttributes = buildProfileEventAttributes(profilerTrace, configuration.applicationId, sessionId)\n const profileEventTags = buildProfileEventTags(tags)\n\n return {\n ...profileAttributes,\n attachments: ['wall-time.json'],\n start: new Date(profilerTrace.startClocks.timeStamp).toISOString(),\n end: new Date(profilerTrace.endClocks.timeStamp).toISOString(),\n family: 'chrome',\n runtime: 'chrome',\n format: 'json',\n version: 4, // Ingestion event version (not the version application tag)\n tags_profiler: profileEventTags.join(','),\n _kubesense: {\n clock_drift: clockDrift(),\n },\n }\n}\n\n/**\n * Builds attributes for the Profile Event.\n *\n * @param profilerTrace - Profiler trace\n * @param applicationId - application id.\n * @param sessionId - session id.\n * @returns Additional attributes.\n */\nexport function buildProfileEventAttributes(\n profilerTrace: BrowserProfilerTrace,\n applicationId: string,\n sessionId: string | undefined\n): ProfileEventAttributes {\n // Extract view ids and names from the profiler trace and add them as attributes of the profile event.\n // This will be used to filter the profiles by @view.id and/or @view.name.\n const { ids, names } = extractViewIdsAndNames(profilerTrace.views)\n\n const longTaskIds: string[] = profilerTrace.longTasks.map((longTask) => longTask.id).filter((id) => id !== undefined)\n\n const actionIds: string[] =\n profilerTrace.actions?.map((longTask) => longTask.id).filter((id) => id !== undefined) ?? []\n\n const { ids: vitalIds, labels: vitalLabels } = extractVitalIdsAndLabels(profilerTrace.vitals)\n\n const attributes: ProfileEventAttributes = { application: { id: applicationId } }\n\n if (sessionId) {\n attributes.session = { id: sessionId }\n }\n if (ids.length) {\n attributes.view = { id: ids, name: names }\n }\n if (longTaskIds.length) {\n attributes.long_task = { id: longTaskIds }\n }\n if (actionIds.length) {\n attributes.action = { id: actionIds, label: [] }\n }\n if (vitalIds.length) {\n attributes.vital = { id: vitalIds, label: vitalLabels }\n }\n return attributes\n}\n\nfunction extractViewIdsAndNames(views: RumViewEntry[]): { ids: string[]; names: string[] } {\n const result: { ids: string[]; names: string[] } = { ids: [], names: [] }\n for (const view of views) {\n result.ids.push(view.viewId)\n\n if (view.viewName) {\n result.names.push(view.viewName)\n }\n }\n\n // Remove duplicates\n result.names = Array.from(new Set(result.names))\n\n return result\n}\n\nfunction extractVitalIdsAndLabels(vitals?: RumProfilerVitalEntry[]): {\n ids: string[]\n labels: string[]\n} {\n const result: { ids: string[]; labels: string[] } = { ids: [], labels: [] }\n\n if (!vitals) {\n return result\n }\n\n for (const vital of vitals) {\n result.ids.push(vital.id)\n result.labels.push(vital.label)\n }\n\n // Remove duplicates\n result.labels = Array.from(new Set(result.labels))\n\n return result\n}\n\nfunction buildProfileEventTags(tags: string[]): string[] {\n // Tags already contains the common tags for all events. (service, env, version, etc.)\n // Here we are adding some specific-to-profiling tags.\n return tags.concat(['language:javascript', 'runtime:chrome', 'family:chrome', 'host:browser'])\n}\n"],"mappings":";;;;;;AAgCA,SAAgB,kBACd,eACA,eACA,WACqB;CACrB,MAAM,OAAO,UAAU,aAAa;CACpC,MAAM,oBAAoB,4BAA4B,eAAe,cAAc,eAAe,SAAS;CAC3G,MAAM,mBAAmB,sBAAsB,IAAI;CAEnD,OAAO;EACL,GAAG;EACH,aAAa,CAAC,gBAAgB;EAC9B,OAAO,IAAI,KAAK,cAAc,YAAY,SAAS,CAAC,CAAC,YAAY;EACjE,KAAK,IAAI,KAAK,cAAc,UAAU,SAAS,CAAC,CAAC,YAAY;EAC7D,QAAQ;EACR,SAAS;EACT,QAAQ;EACR,SAAS;EACT,eAAe,iBAAiB,KAAK,GAAG;EACxC,YAAY,EACV,aAAa,WAAW,EAC1B;CACF;AACF;;;;;;;;;AAUA,SAAgB,4BACd,eACA,eACA,WACwB;CAGxB,MAAM,EAAE,KAAK,UAAU,uBAAuB,cAAc,KAAK;CAEjE,MAAM,cAAwB,cAAc,UAAU,KAAK,aAAa,SAAS,EAAE,CAAC,CAAC,QAAQ,OAAO,OAAO,KAAA,CAAS;CAEpH,MAAM,YACJ,cAAc,SAAS,KAAK,aAAa,SAAS,EAAE,CAAC,CAAC,QAAQ,OAAO,OAAO,KAAA,CAAS,KAAK,CAAC;CAE7F,MAAM,EAAE,KAAK,UAAU,QAAQ,gBAAgB,yBAAyB,cAAc,MAAM;CAE5F,MAAM,aAAqC,EAAE,aAAa,EAAE,IAAI,cAAc,EAAE;CAEhF,IAAI,WACF,WAAW,UAAU,EAAE,IAAI,UAAU;CAEvC,IAAI,IAAI,QACN,WAAW,OAAO;EAAE,IAAI;EAAK,MAAM;CAAM;CAE3C,IAAI,YAAY,QACd,WAAW,YAAY,EAAE,IAAI,YAAY;CAE3C,IAAI,UAAU,QACZ,WAAW,SAAS;EAAE,IAAI;EAAW,OAAO,CAAC;CAAE;CAEjD,IAAI,SAAS,QACX,WAAW,QAAQ;EAAE,IAAI;EAAU,OAAO;CAAY;CAExD,OAAO;AACT;AAEA,SAAS,uBAAuB,OAA2D;CACzF,MAAM,SAA6C;EAAE,KAAK,CAAC;EAAG,OAAO,CAAC;CAAE;CACxE,KAAK,MAAM,QAAQ,OAAO;EACxB,OAAO,IAAI,KAAK,KAAK,MAAM;EAE3B,IAAI,KAAK,UACP,OAAO,MAAM,KAAK,KAAK,QAAQ;CAEnC;CAGA,OAAO,QAAQ,MAAM,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC;CAE/C,OAAO;AACT;AAEA,SAAS,yBAAyB,QAGhC;CACA,MAAM,SAA8C;EAAE,KAAK,CAAC;EAAG,QAAQ,CAAC;CAAE;CAE1E,IAAI,CAAC,QACH,OAAO;CAGT,KAAK,MAAM,SAAS,QAAQ;EAC1B,OAAO,IAAI,KAAK,MAAM,EAAE;EACxB,OAAO,OAAO,KAAK,MAAM,KAAK;CAChC;CAGA,OAAO,SAAS,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC;CAEjD,OAAO;AACT;AAEA,SAAS,sBAAsB,MAA0B;CAGvD,OAAO,KAAK,OAAO;EAAC;EAAuB;EAAkB;EAAiB;CAAc,CAAC;AAC/F"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createFormDataTransport } from "@kubesense/kubesense-browser-rum-core";
|
|
2
|
+
import { DeflateEncoderStreamId } from "@kubesense/kubesense-browser-core";
|
|
3
|
+
//#region src/domain/profiling/transport/formDataEmitter.ts
|
|
4
|
+
function createFormDataEmitter(configuration, lifeCycle, createEncoder) {
|
|
5
|
+
const transport = createFormDataTransport(configuration, lifeCycle, createEncoder, DeflateEncoderStreamId.PROFILING);
|
|
6
|
+
return ({ profile, trace }) => {
|
|
7
|
+
const formPayload = {
|
|
8
|
+
event: profile,
|
|
9
|
+
"wall-time.json": trace
|
|
10
|
+
};
|
|
11
|
+
transport.send(formPayload);
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { createFormDataEmitter };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=formDataEmitter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formDataEmitter.mjs","names":[],"sources":["../../../../src/domain/profiling/transport/formDataEmitter.ts"],"sourcesContent":["import type { Encoder } from '@kubesense/kubesense-browser-core'\nimport { DeflateEncoderStreamId } from '@kubesense/kubesense-browser-core'\nimport type { LifeCycle, RumConfiguration, TransportPayload } from '@kubesense/kubesense-browser-rum-core'\nimport { createFormDataTransport } from '@kubesense/kubesense-browser-rum-core'\nimport type { ProfilingPayload } from '../types'\n\nexport function createFormDataEmitter(\n configuration: RumConfiguration,\n lifeCycle: LifeCycle,\n createEncoder: (streamId: DeflateEncoderStreamId) => Encoder\n): (payload: ProfilingPayload) => void {\n const transport = createFormDataTransport(configuration, lifeCycle, createEncoder, DeflateEncoderStreamId.PROFILING)\n return ({ profile, trace }: ProfilingPayload) => {\n const formPayload = { event: profile, 'wall-time.json': trace }\n void transport.send(formPayload as unknown as TransportPayload)\n }\n}\n"],"mappings":";;;AAMA,SAAgB,sBACd,eACA,WACA,eACqC;CACrC,MAAM,YAAY,wBAAwB,eAAe,WAAW,eAAe,uBAAuB,SAAS;CACnH,QAAQ,EAAE,SAAS,YAA8B;EAC/C,MAAM,cAAc;GAAE,OAAO;GAAS,kBAAkB;EAAM;EAC9D,UAAe,KAAK,WAA0C;CAChE;AACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { getEventBridge } from "@kubesense/kubesense-browser-core";
|
|
2
|
+
//#region src/domain/profiling/transport/profilingBridge.ts
|
|
3
|
+
function createBridgeEmitter() {
|
|
4
|
+
const bridge = getEventBridge();
|
|
5
|
+
return (payload) => {
|
|
6
|
+
bridge.send("profile", payload);
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { createBridgeEmitter };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=profilingBridge.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profilingBridge.mjs","names":[],"sources":["../../../../src/domain/profiling/transport/profilingBridge.ts"],"sourcesContent":["import { getEventBridge } from '@kubesense/kubesense-browser-core'\nimport type { ProfilingPayload } from '../types'\n\nexport function createBridgeEmitter(): (payload: ProfilingPayload) => void {\n const bridge = getEventBridge<'profile', ProfilingPayload>()!\n return (payload: ProfilingPayload) => {\n bridge.send('profile', payload)\n }\n}\n"],"mappings":";;AAGA,SAAgB,sBAA2D;CACzE,MAAM,SAAS,eAA4C;CAC3D,QAAQ,YAA8B;EACpC,OAAO,KAAK,WAAW,OAAO;CAChC;AACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { getDefaultViewName } from "./getDefaultViewName.mjs";
|
|
2
|
+
//#region src/domain/profiling/utils/getCustomOrDefaultViewName.ts
|
|
3
|
+
const getCustomOrDefaultViewName = (customViewName, viewPathUrl) => customViewName || getDefaultViewName(viewPathUrl);
|
|
4
|
+
//#endregion
|
|
5
|
+
export { getCustomOrDefaultViewName };
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=getCustomOrDefaultViewName.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCustomOrDefaultViewName.mjs","names":[],"sources":["../../../../src/domain/profiling/utils/getCustomOrDefaultViewName.ts"],"sourcesContent":["import { getDefaultViewName } from './getDefaultViewName'\n\nexport const getCustomOrDefaultViewName = (customViewName: string | undefined, viewPathUrl: string): string =>\n customViewName || getDefaultViewName(viewPathUrl)\n"],"mappings":";;AAEA,MAAa,8BAA8B,gBAAoC,gBAC7E,kBAAkB,mBAAmB,WAAW"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/domain/profiling/utils/getDefaultViewName.ts
|
|
2
|
+
const PATH_MIXED_ALPHANUMERICS = /\/(?![vV]\d{1,2}\/)([^/\d?]*\d+[^/?]*)/g;
|
|
3
|
+
function getDefaultViewName(viewPathUrl) {
|
|
4
|
+
if (!viewPathUrl) return "/";
|
|
5
|
+
return viewPathUrl.replace(PATH_MIXED_ALPHANUMERICS, "/?");
|
|
6
|
+
}
|
|
7
|
+
//#endregion
|
|
8
|
+
export { getDefaultViewName };
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=getDefaultViewName.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getDefaultViewName.mjs","names":[],"sources":["../../../../src/domain/profiling/utils/getDefaultViewName.ts"],"sourcesContent":["// This is the regex used to extract the path from the url (from SimpleUrlGroupingProcessor.java)\n// It's a bit different from the one in the java code because we removed the lookbehind unsupported by Safari.\nconst PATH_MIXED_ALPHANUMERICS = /\\/(?![vV]\\d{1,2}\\/)([^/\\d?]*\\d+[^/?]*)/g\n\nexport function getDefaultViewName(viewPathUrl: string): string {\n if (!viewPathUrl) {\n return '/'\n }\n\n // Replace all the mixed alphanumerics with a ?\n return viewPathUrl.replace(PATH_MIXED_ALPHANUMERICS, '/?')\n}\n"],"mappings":";AAEA,MAAM,2BAA2B;AAEjC,SAAgB,mBAAmB,aAA6B;CAC9D,IAAI,CAAC,aACH,OAAO;CAIT,OAAO,YAAY,QAAQ,0BAA0B,IAAI;AAC3D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { LifeCycleEventType, VitalType } from "@kubesense/kubesense-browser-rum-core";
|
|
2
|
+
import { SESSION_TIME_OUT_DELAY, createValueHistory } from "@kubesense/kubesense-browser-core";
|
|
3
|
+
import { addDuration, elapsed } from "@kubesense/kubesense-js-core/time";
|
|
4
|
+
//#region src/domain/profiling/vitalHistory.ts
|
|
5
|
+
const VITAL_ID_HISTORY_TIME_OUT_DELAY = SESSION_TIME_OUT_DELAY;
|
|
6
|
+
function createVitalHistory(lifeCycle) {
|
|
7
|
+
const history = createValueHistory({ expireDelay: VITAL_ID_HISTORY_TIME_OUT_DELAY });
|
|
8
|
+
lifeCycle.subscribe(LifeCycleEventType.DURATION_VITAL_STARTED, (vitalStart) => {
|
|
9
|
+
history.add({
|
|
10
|
+
id: vitalStart.id,
|
|
11
|
+
type: VitalType.DURATION,
|
|
12
|
+
startClocks: vitalStart.startClocks,
|
|
13
|
+
duration: void 0,
|
|
14
|
+
label: vitalStart.name
|
|
15
|
+
}, vitalStart.startClocks.relative);
|
|
16
|
+
});
|
|
17
|
+
lifeCycle.subscribe(LifeCycleEventType.RAW_RUM_EVENT_COLLECTED, ({ rawRumEvent, startClocks, duration }) => {
|
|
18
|
+
if (rawRumEvent.type !== "vital") return;
|
|
19
|
+
if (rawRumEvent.vital.type === VitalType.OPERATION_STEP) {
|
|
20
|
+
if (rawRumEvent.vital.step_type === "start") history.add({
|
|
21
|
+
id: rawRumEvent.vital.id,
|
|
22
|
+
type: rawRumEvent.vital.type,
|
|
23
|
+
operationKey: rawRumEvent.vital.operation_key,
|
|
24
|
+
startClocks,
|
|
25
|
+
label: rawRumEvent.vital.name
|
|
26
|
+
}, startClocks.relative);
|
|
27
|
+
else if (rawRumEvent.vital.step_type === "end") {
|
|
28
|
+
const historyEntry = history.findAllEntries().find((entry) => entry.value.type === VitalType.OPERATION_STEP && entry.value.label === rawRumEvent.vital.name && entry.value.operationKey === rawRumEvent.vital.operation_key);
|
|
29
|
+
if (!historyEntry) return;
|
|
30
|
+
historyEntry.value.duration = elapsed(historyEntry.value.startClocks.relative, startClocks.relative);
|
|
31
|
+
historyEntry.close(startClocks.relative);
|
|
32
|
+
}
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const historyEntry = history.getEntries(startClocks.relative).find((entry) => entry.value.id === rawRumEvent.vital.id);
|
|
36
|
+
if (historyEntry) {
|
|
37
|
+
historyEntry.value.duration = duration;
|
|
38
|
+
historyEntry.close(addDuration(startClocks.relative, duration));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
history.add({
|
|
42
|
+
id: rawRumEvent.vital.id,
|
|
43
|
+
type: rawRumEvent.vital.type,
|
|
44
|
+
operationKey: rawRumEvent.vital.operation_key,
|
|
45
|
+
startClocks,
|
|
46
|
+
duration,
|
|
47
|
+
label: rawRumEvent.vital.name
|
|
48
|
+
}, startClocks.relative).close(addDuration(startClocks.relative, duration));
|
|
49
|
+
});
|
|
50
|
+
return history;
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
export { VITAL_ID_HISTORY_TIME_OUT_DELAY, createVitalHistory };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=vitalHistory.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitalHistory.mjs","names":[],"sources":["../../../src/domain/profiling/vitalHistory.ts"],"sourcesContent":["import type { ClocksState, Duration } from '@kubesense/kubesense-js-core/time'\nimport { elapsed, addDuration } from '@kubesense/kubesense-js-core/time'\nimport { createValueHistory, SESSION_TIME_OUT_DELAY } from '@kubesense/kubesense-browser-core'\nimport type { LifeCycle } from '@kubesense/kubesense-browser-rum-core'\nimport { LifeCycleEventType, VitalType } from '@kubesense/kubesense-browser-rum-core'\n\nexport const VITAL_ID_HISTORY_TIME_OUT_DELAY = SESSION_TIME_OUT_DELAY\n\nexport interface VitalContext {\n id: string\n type: VitalType\n label: string\n operationKey?: string\n duration?: Duration\n startClocks: ClocksState\n}\n\nexport function createVitalHistory(lifeCycle: LifeCycle) {\n const history = createValueHistory<VitalContext>({\n expireDelay: VITAL_ID_HISTORY_TIME_OUT_DELAY,\n })\n\n lifeCycle.subscribe(LifeCycleEventType.DURATION_VITAL_STARTED, (vitalStart) => {\n history.add(\n {\n id: vitalStart.id,\n type: VitalType.DURATION,\n startClocks: vitalStart.startClocks,\n duration: undefined,\n label: vitalStart.name,\n },\n vitalStart.startClocks.relative\n )\n })\n\n lifeCycle.subscribe(LifeCycleEventType.RAW_RUM_EVENT_COLLECTED, ({ rawRumEvent, startClocks, duration }) => {\n if (rawRumEvent.type !== 'vital') {\n return\n }\n\n // For operation step vitals, we only tag profiles with the start step's id.\n // This means that if we receive an end step vital, we need to look for the\n // corresponding start one and update its duration. If we receive a start step vital\n // however, we just store it and wait for the end step.\n if (rawRumEvent.vital.type === VitalType.OPERATION_STEP) {\n if (rawRumEvent.vital.step_type === 'start') {\n history.add(\n {\n id: rawRumEvent.vital.id,\n type: rawRumEvent.vital.type,\n operationKey: rawRumEvent.vital.operation_key,\n startClocks,\n label: rawRumEvent.vital.name,\n },\n startClocks.relative\n )\n } else if (rawRumEvent.vital.step_type === 'end') {\n const historyEntry = history\n .findAllEntries()\n .find(\n (entry) =>\n entry.value.type === VitalType.OPERATION_STEP &&\n entry.value.label === rawRumEvent.vital.name &&\n entry.value.operationKey === rawRumEvent.vital.operation_key\n )\n\n if (!historyEntry) {\n return\n }\n\n historyEntry.value.duration = elapsed(historyEntry.value.startClocks.relative, startClocks.relative)\n historyEntry.close(startClocks.relative)\n }\n\n return\n }\n\n // All the other vital types are handled normally (i.e. stored in the\n // history and tagged on the profiles)\n const historyEntry = history\n .getEntries(startClocks.relative)\n .find((entry) => entry.value.id === rawRumEvent.vital.id)\n\n if (historyEntry) {\n historyEntry.value.duration = duration!\n historyEntry.close(addDuration(startClocks.relative, duration!))\n return\n }\n\n history\n .add(\n {\n id: rawRumEvent.vital.id,\n type: rawRumEvent.vital.type,\n operationKey: rawRumEvent.vital.operation_key,\n startClocks,\n duration,\n label: rawRumEvent.vital.name,\n },\n startClocks.relative\n )\n .close(addDuration(startClocks.relative, duration!))\n })\n\n return history\n}\n"],"mappings":";;;;AAMA,MAAa,kCAAkC;AAW/C,SAAgB,mBAAmB,WAAsB;CACvD,MAAM,UAAU,mBAAiC,EAC/C,aAAa,gCACf,CAAC;CAED,UAAU,UAAU,mBAAmB,yBAAyB,eAAe;EAC7E,QAAQ,IACN;GACE,IAAI,WAAW;GACf,MAAM,UAAU;GAChB,aAAa,WAAW;GACxB,UAAU,KAAA;GACV,OAAO,WAAW;EACpB,GACA,WAAW,YAAY,QACzB;CACF,CAAC;CAED,UAAU,UAAU,mBAAmB,0BAA0B,EAAE,aAAa,aAAa,eAAe;EAC1G,IAAI,YAAY,SAAS,SACvB;EAOF,IAAI,YAAY,MAAM,SAAS,UAAU,gBAAgB;GACvD,IAAI,YAAY,MAAM,cAAc,SAClC,QAAQ,IACN;IACE,IAAI,YAAY,MAAM;IACtB,MAAM,YAAY,MAAM;IACxB,cAAc,YAAY,MAAM;IAChC;IACA,OAAO,YAAY,MAAM;GAC3B,GACA,YAAY,QACd;QACK,IAAI,YAAY,MAAM,cAAc,OAAO;IAChD,MAAM,eAAe,QAClB,eAAe,CAAC,CAChB,MACE,UACC,MAAM,MAAM,SAAS,UAAU,kBAC/B,MAAM,MAAM,UAAU,YAAY,MAAM,QACxC,MAAM,MAAM,iBAAiB,YAAY,MAAM,aACnD;IAEF,IAAI,CAAC,cACH;IAGF,aAAa,MAAM,WAAW,QAAQ,aAAa,MAAM,YAAY,UAAU,YAAY,QAAQ;IACnG,aAAa,MAAM,YAAY,QAAQ;GACzC;GAEA;EACF;EAIA,MAAM,eAAe,QAClB,WAAW,YAAY,QAAQ,CAAC,CAChC,MAAM,UAAU,MAAM,MAAM,OAAO,YAAY,MAAM,EAAE;EAE1D,IAAI,cAAc;GAChB,aAAa,MAAM,WAAW;GAC9B,aAAa,MAAM,YAAY,YAAY,UAAU,QAAS,CAAC;GAC/D;EACF;EAEA,QACG,IACC;GACE,IAAI,YAAY,MAAM;GACtB,MAAM,YAAY,MAAM;GACxB,cAAc,YAAY,MAAM;GAChC;GACA;GACA,OAAO,YAAY,MAAM;EAC3B,GACA,YAAY,QACd,CAAC,CACA,MAAM,YAAY,YAAY,UAAU,QAAS,CAAC;CACvD,CAAC;CAED,OAAO;AACT"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { RecordType } from "../../types/sessionReplayConstants.mjs";
|
|
2
|
+
import { timeStampNow } from "@kubesense/kubesense-js-core/time";
|
|
3
|
+
//#region src/domain/record/assembly.ts
|
|
4
|
+
function assembleIncrementalSnapshot(source, data, timestamp = timeStampNow()) {
|
|
5
|
+
return {
|
|
6
|
+
data: {
|
|
7
|
+
source,
|
|
8
|
+
...data
|
|
9
|
+
},
|
|
10
|
+
type: RecordType.IncrementalSnapshot,
|
|
11
|
+
timestamp
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { assembleIncrementalSnapshot };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=assembly.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assembly.mjs","names":[],"sources":["../../../src/domain/record/assembly.ts"],"sourcesContent":["import { timeStampNow } from '@kubesense/kubesense-js-core/time'\nimport type { TimeStamp } from '@kubesense/kubesense-js-core/time'\nimport type { BrowserIncrementalData, BrowserIncrementalSnapshotRecord } from '../../types'\nimport { RecordType } from '../../types'\n\nexport function assembleIncrementalSnapshot<Data extends BrowserIncrementalData>(\n source: Data['source'],\n data: Omit<Data, 'source'>,\n timestamp: TimeStamp = timeStampNow()\n): BrowserIncrementalSnapshotRecord {\n return {\n data: {\n source,\n ...data,\n } as Data,\n type: RecordType.IncrementalSnapshot,\n timestamp,\n }\n}\n"],"mappings":";;;AAKA,SAAgB,4BACd,QACA,MACA,YAAuB,aAAa,GACF;CAClC,OAAO;EACL,MAAM;GACJ;GACA,GAAG;EACL;EACA,MAAM,WAAW;EACjB;CACF;AACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createDownscaledCanvas } from "./canvasSnapshot.mjs";
|
|
2
|
+
import { mockable } from "@kubesense/kubesense-browser-core";
|
|
3
|
+
import { globalObject } from "@kubesense/kubesense-js-core/util";
|
|
4
|
+
//#region src/domain/record/canvas/canvasHash.ts
|
|
5
|
+
function computeImageHash(snapshot, maxHashDimension) {
|
|
6
|
+
const { height: sourceHeight, width: sourceWidth } = snapshot.source;
|
|
7
|
+
const thumbnail = Math.max(sourceWidth, sourceHeight) <= maxHashDimension ? snapshot.source : createDownscaledCanvas(snapshot.source, sourceWidth, sourceHeight, maxHashDimension);
|
|
8
|
+
if (!thumbnail) return Promise.resolve(void 0);
|
|
9
|
+
const context = thumbnail.getContext("2d");
|
|
10
|
+
if (!context) return Promise.resolve(void 0);
|
|
11
|
+
const data = context.getImageData(0, 0, thumbnail.width, thumbnail.height).data;
|
|
12
|
+
const subtleCrypto = mockable(globalObject.crypto?.subtle);
|
|
13
|
+
if (!subtleCrypto) return Promise.resolve(createChangeHash(snapshot.canvasWidth, snapshot.canvasHeight, fnv1aHash(data)));
|
|
14
|
+
return subtleCrypto.digest("SHA-256", data).then((buffer) => createChangeHash(snapshot.canvasWidth, snapshot.canvasHeight, arrayBufferToHex(buffer)), () => createChangeHash(snapshot.canvasWidth, snapshot.canvasHeight, fnv1aHash(data)));
|
|
15
|
+
}
|
|
16
|
+
function arrayBufferToHex(buffer) {
|
|
17
|
+
return Array.from(new Uint8Array(buffer), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
18
|
+
}
|
|
19
|
+
function createChangeHash(width, height, pixelHash) {
|
|
20
|
+
return `${width}x${height}-${pixelHash}`;
|
|
21
|
+
}
|
|
22
|
+
function fnv1aHash(data) {
|
|
23
|
+
let hash = 2166136261;
|
|
24
|
+
for (let index = 0; index < data.length; index += 1) {
|
|
25
|
+
hash ^= data[index];
|
|
26
|
+
hash = Math.imul(hash, 16777619);
|
|
27
|
+
}
|
|
28
|
+
return (hash >>> 0).toString(16).padStart(8, "0");
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { computeImageHash };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=canvasHash.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasHash.mjs","names":[],"sources":["../../../../src/domain/record/canvas/canvasHash.ts"],"sourcesContent":["import { mockable } from '@kubesense/kubesense-browser-core'\nimport { globalObject } from '@kubesense/kubesense-js-core/util'\nimport type { CanvasSnapshot } from './canvasSnapshot'\nimport { createDownscaledCanvas } from './canvasSnapshot'\n\nexport function computeImageHash(snapshot: CanvasSnapshot, maxHashDimension: number): Promise<string | undefined> {\n const { height: sourceHeight, width: sourceWidth } = snapshot.source\n // The snapshot is already frozen, so if it already fits, hash it directly instead of downscaling it again.\n const thumbnail =\n Math.max(sourceWidth, sourceHeight) <= maxHashDimension\n ? snapshot.source\n : createDownscaledCanvas(snapshot.source, sourceWidth, sourceHeight, maxHashDimension)\n if (!thumbnail) {\n return Promise.resolve(undefined)\n }\n\n const context = thumbnail.getContext('2d')\n if (!context) {\n return Promise.resolve(undefined)\n }\n\n const data = context.getImageData(0, 0, thumbnail.width, thumbnail.height).data\n // crypto.subtle is only exposed in secure contexts, so it is missing on plain HTTP pages.\n const subtleCrypto = mockable(globalObject.crypto?.subtle)\n if (!subtleCrypto) {\n return Promise.resolve(createChangeHash(snapshot.canvasWidth, snapshot.canvasHeight, fnv1aHash(data)))\n }\n\n return subtleCrypto.digest('SHA-256', data).then(\n (buffer) => createChangeHash(snapshot.canvasWidth, snapshot.canvasHeight, arrayBufferToHex(buffer)),\n () => createChangeHash(snapshot.canvasWidth, snapshot.canvasHeight, fnv1aHash(data))\n )\n}\n\nfunction arrayBufferToHex(buffer: ArrayBuffer): string {\n return Array.from(new Uint8Array(buffer), (byte) => byte.toString(16).padStart(2, '0')).join('')\n}\n\nfunction createChangeHash(width: number, height: number, pixelHash: string): string {\n return `${width}x${height}-${pixelHash}`\n}\n\n/* eslint-disable no-bitwise */\nfunction fnv1aHash(data: ArrayLike<number>): string {\n let hash = 0x811c9dc5\n\n for (let index = 0; index < data.length; index += 1) {\n hash ^= data[index]\n hash = Math.imul(hash, 0x01000193)\n }\n\n return (hash >>> 0).toString(16).padStart(8, '0')\n}\n/* eslint-enable no-bitwise */\n"],"mappings":";;;;AAKA,SAAgB,iBAAiB,UAA0B,kBAAuD;CAChH,MAAM,EAAE,QAAQ,cAAc,OAAO,gBAAgB,SAAS;CAE9D,MAAM,YACJ,KAAK,IAAI,aAAa,YAAY,KAAK,mBACnC,SAAS,SACT,uBAAuB,SAAS,QAAQ,aAAa,cAAc,gBAAgB;CACzF,IAAI,CAAC,WACH,OAAO,QAAQ,QAAQ,KAAA,CAAS;CAGlC,MAAM,UAAU,UAAU,WAAW,IAAI;CACzC,IAAI,CAAC,SACH,OAAO,QAAQ,QAAQ,KAAA,CAAS;CAGlC,MAAM,OAAO,QAAQ,aAAa,GAAG,GAAG,UAAU,OAAO,UAAU,MAAM,CAAC,CAAC;CAE3E,MAAM,eAAe,SAAS,aAAa,QAAQ,MAAM;CACzD,IAAI,CAAC,cACH,OAAO,QAAQ,QAAQ,iBAAiB,SAAS,aAAa,SAAS,cAAc,UAAU,IAAI,CAAC,CAAC;CAGvG,OAAO,aAAa,OAAO,WAAW,IAAI,CAAC,CAAC,MACzC,WAAW,iBAAiB,SAAS,aAAa,SAAS,cAAc,iBAAiB,MAAM,CAAC,SAC5F,iBAAiB,SAAS,aAAa,SAAS,cAAc,UAAU,IAAI,CAAC,CACrF;AACF;AAEA,SAAS,iBAAiB,QAA6B;CACrD,OAAO,MAAM,KAAK,IAAI,WAAW,MAAM,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;AACjG;AAEA,SAAS,iBAAiB,OAAe,QAAgB,WAA2B;CAClF,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG;AAC/B;AAGA,SAAS,UAAU,MAAiC;CAClD,IAAI,OAAO;CAEX,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,QAAQ,KAAK;EACb,OAAO,KAAK,KAAK,MAAM,QAAU;CACnC;CAEA,QAAQ,SAAS,EAAA,CAAG,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;AAClD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
//#region src/domain/record/canvas/canvasManager.ts
|
|
2
|
+
function createCanvasManager() {
|
|
3
|
+
const dirtyCanvases = /* @__PURE__ */ new Set();
|
|
4
|
+
const taintedCanvases = /* @__PURE__ */ new WeakSet();
|
|
5
|
+
let canvasContentMutations = [];
|
|
6
|
+
let canvasTrackingStates = /* @__PURE__ */ new WeakMap();
|
|
7
|
+
function getTrackingState(canvas) {
|
|
8
|
+
let trackingState = canvasTrackingStates.get(canvas);
|
|
9
|
+
if (!trackingState) {
|
|
10
|
+
trackingState = { capturePending: false };
|
|
11
|
+
canvasTrackingStates.set(canvas, trackingState);
|
|
12
|
+
}
|
|
13
|
+
return trackingState;
|
|
14
|
+
}
|
|
15
|
+
function startCaptureAttempt(canvas) {
|
|
16
|
+
const trackingState = getTrackingState(canvas);
|
|
17
|
+
trackingState.capturePending = true;
|
|
18
|
+
const isCurrent = () => canvasTrackingStates.get(canvas) === trackingState;
|
|
19
|
+
return {
|
|
20
|
+
lastChangeHash: trackingState.lastChangeHash,
|
|
21
|
+
isCurrent,
|
|
22
|
+
setLastChangeHash: (changeHash) => {
|
|
23
|
+
if (isCurrent()) trackingState.lastChangeHash = changeHash;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function markDirty(canvas) {
|
|
28
|
+
if (!canvas.isConnected || taintedCanvases.has(canvas)) return;
|
|
29
|
+
dirtyCanvases.add(canvas);
|
|
30
|
+
}
|
|
31
|
+
function markClean(canvas) {
|
|
32
|
+
dirtyCanvases.delete(canvas);
|
|
33
|
+
}
|
|
34
|
+
function markTainted(canvas) {
|
|
35
|
+
taintedCanvases.add(canvas);
|
|
36
|
+
dirtyCanvases.delete(canvas);
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
markCanvas: (canvas, status) => {
|
|
40
|
+
switch (status) {
|
|
41
|
+
case 1:
|
|
42
|
+
markDirty(canvas);
|
|
43
|
+
return;
|
|
44
|
+
case 0:
|
|
45
|
+
markClean(canvas);
|
|
46
|
+
return;
|
|
47
|
+
case 2:
|
|
48
|
+
markTainted(canvas);
|
|
49
|
+
return;
|
|
50
|
+
default: return;
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
forgetCanvas: (canvas) => {
|
|
54
|
+
dirtyCanvases.delete(canvas);
|
|
55
|
+
canvasTrackingStates.delete(canvas);
|
|
56
|
+
},
|
|
57
|
+
resetCanvasBitmap: (canvas) => {
|
|
58
|
+
canvasTrackingStates.delete(canvas);
|
|
59
|
+
markDirty(canvas);
|
|
60
|
+
},
|
|
61
|
+
takeCapturableCanvases: () => {
|
|
62
|
+
const capturableCanvases = [];
|
|
63
|
+
dirtyCanvases.forEach((canvas) => {
|
|
64
|
+
if (!canvas.isConnected) dirtyCanvases.delete(canvas);
|
|
65
|
+
else if (!taintedCanvases.has(canvas) && !getTrackingState(canvas).capturePending) {
|
|
66
|
+
dirtyCanvases.delete(canvas);
|
|
67
|
+
capturableCanvases.push(canvas);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
return capturableCanvases;
|
|
71
|
+
},
|
|
72
|
+
startCaptureAttempt,
|
|
73
|
+
discardCaptureAttempt: (canvas, captureAttempt) => {
|
|
74
|
+
if (captureAttempt.isCurrent()) getTrackingState(canvas).capturePending = false;
|
|
75
|
+
},
|
|
76
|
+
retryCanvas: (canvas) => {
|
|
77
|
+
canvasTrackingStates.delete(canvas);
|
|
78
|
+
markDirty(canvas);
|
|
79
|
+
},
|
|
80
|
+
addCanvasContentMutation: (mutation) => {
|
|
81
|
+
canvasContentMutations.push(mutation);
|
|
82
|
+
},
|
|
83
|
+
takeCanvasContentMutations: () => {
|
|
84
|
+
const mutations = canvasContentMutations;
|
|
85
|
+
canvasContentMutations = [];
|
|
86
|
+
for (const mutation of mutations) if (mutation.captureAttempt.isCurrent()) getTrackingState(mutation.canvas).capturePending = false;
|
|
87
|
+
return mutations;
|
|
88
|
+
},
|
|
89
|
+
reset: () => {
|
|
90
|
+
dirtyCanvases.clear();
|
|
91
|
+
canvasContentMutations = [];
|
|
92
|
+
canvasTrackingStates = /* @__PURE__ */ new WeakMap();
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//#endregion
|
|
97
|
+
export { createCanvasManager };
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=canvasManager.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasManager.mjs","names":[],"sources":["../../../../src/domain/record/canvas/canvasManager.ts"],"sourcesContent":["export const enum CanvasStatus {\n /** The canvas is clean, meaning it has not been marked as dirty or tainted */\n Clean,\n /** The canvas is dirty, meaning it has been marked as dirty by a draw operation */\n Dirty,\n /** The canvas is tainted, meaning it has been marked as tainted by a SecurityError */\n Tainted,\n}\n\nexport interface CanvasCaptureAttempt {\n /** changeHash emitted the last time this canvas was captured, taken when the attempt started */\n readonly lastChangeHash: string | undefined\n /** false if the canvas was forgotten/reset, or if another attempt took its place */\n isCurrent: () => boolean\n /** stores the changeHash */\n setLastChangeHash: (changeHash: string) => void\n}\n\nexport interface CanvasContentMutation {\n canvas: HTMLCanvasElement\n captureAttempt: CanvasCaptureAttempt\n hash: string\n image: Blob\n}\n\nexport interface CanvasManager {\n /** Single entry point for the canvas status */\n markCanvas: (canvas: HTMLCanvasElement, status: CanvasStatus) => void\n /** The node left the DOM: forget its tracking state, but not its taint */\n forgetCanvas: (canvas: HTMLCanvasElement) => void\n /** width/height were assigned: the bitmap was cleared, so drop the last hash and mark dirty */\n resetCanvasBitmap: (canvas: HTMLCanvasElement) => void\n /** Takes dirty, connected, non-tainted canvases and clears their dirty state */\n takeCapturableCanvases: () => HTMLCanvasElement[]\n /** Starts a capture attempt for a canvas */\n startCaptureAttempt: (canvas: HTMLCanvasElement) => CanvasCaptureAttempt\n discardCaptureAttempt: (canvas: HTMLCanvasElement, captureAttempt: CanvasCaptureAttempt) => void\n /** Discards the last capture hash and retries a rejected capture */\n retryCanvas: (canvas: HTMLCanvasElement) => void\n addCanvasContentMutation: (mutation: CanvasContentMutation) => void\n takeCanvasContentMutations: () => CanvasContentMutation[]\n /** New record stream: discards the per-stream tracking states (not the taint) */\n reset: () => void\n}\n\ninterface CanvasTrackingState {\n capturePending: boolean\n lastChangeHash?: string\n}\n\nexport function createCanvasManager(): CanvasManager {\n const dirtyCanvases = new Set<HTMLCanvasElement>()\n const taintedCanvases = new WeakSet<HTMLCanvasElement>()\n let canvasContentMutations: CanvasContentMutation[] = []\n let canvasTrackingStates = new WeakMap<HTMLCanvasElement, CanvasTrackingState>()\n\n function getTrackingState(canvas: HTMLCanvasElement): CanvasTrackingState {\n let trackingState = canvasTrackingStates.get(canvas)\n if (!trackingState) {\n trackingState = { capturePending: false }\n canvasTrackingStates.set(canvas, trackingState)\n }\n return trackingState\n }\n\n function startCaptureAttempt(canvas: HTMLCanvasElement): CanvasCaptureAttempt {\n const trackingState = getTrackingState(canvas)\n trackingState.capturePending = true\n const isCurrent = () => canvasTrackingStates.get(canvas) === trackingState\n\n return {\n lastChangeHash: trackingState.lastChangeHash,\n isCurrent,\n setLastChangeHash: (changeHash) => {\n if (isCurrent()) {\n trackingState.lastChangeHash = changeHash\n }\n },\n }\n }\n\n function markDirty(canvas: HTMLCanvasElement) {\n if (!canvas.isConnected || taintedCanvases.has(canvas)) {\n return\n }\n dirtyCanvases.add(canvas)\n }\n\n function markClean(canvas: HTMLCanvasElement) {\n dirtyCanvases.delete(canvas)\n }\n\n function markTainted(canvas: HTMLCanvasElement) {\n taintedCanvases.add(canvas)\n dirtyCanvases.delete(canvas)\n }\n\n return {\n markCanvas: (canvas, status) => {\n switch (status) {\n case CanvasStatus.Dirty:\n markDirty(canvas)\n return\n case CanvasStatus.Clean:\n markClean(canvas)\n return\n case CanvasStatus.Tainted:\n markTainted(canvas)\n return\n default:\n status satisfies never\n return\n }\n },\n\n forgetCanvas: (canvas) => {\n dirtyCanvases.delete(canvas)\n canvasTrackingStates.delete(canvas)\n },\n\n resetCanvasBitmap: (canvas) => {\n canvasTrackingStates.delete(canvas)\n markDirty(canvas)\n },\n\n takeCapturableCanvases: () => {\n const capturableCanvases: HTMLCanvasElement[] = []\n\n dirtyCanvases.forEach((canvas) => {\n if (!canvas.isConnected) {\n dirtyCanvases.delete(canvas)\n } else if (!taintedCanvases.has(canvas) && !getTrackingState(canvas).capturePending) {\n dirtyCanvases.delete(canvas)\n capturableCanvases.push(canvas)\n }\n })\n\n return capturableCanvases\n },\n\n startCaptureAttempt,\n\n discardCaptureAttempt: (canvas, captureAttempt) => {\n if (captureAttempt.isCurrent()) {\n getTrackingState(canvas).capturePending = false\n }\n },\n\n retryCanvas: (canvas) => {\n canvasTrackingStates.delete(canvas)\n markDirty(canvas)\n },\n\n addCanvasContentMutation: (mutation) => {\n canvasContentMutations.push(mutation)\n },\n\n takeCanvasContentMutations: () => {\n const mutations = canvasContentMutations\n canvasContentMutations = []\n for (const mutation of mutations) {\n if (mutation.captureAttempt.isCurrent()) {\n getTrackingState(mutation.canvas).capturePending = false\n }\n }\n return mutations\n },\n\n reset: () => {\n dirtyCanvases.clear()\n canvasContentMutations = []\n canvasTrackingStates = new WeakMap()\n },\n }\n}\n"],"mappings":";AAkDA,SAAgB,sBAAqC;CACnD,MAAM,gCAAgB,IAAI,IAAuB;CACjD,MAAM,kCAAkB,IAAI,QAA2B;CACvD,IAAI,yBAAkD,CAAC;CACvD,IAAI,uCAAuB,IAAI,QAAgD;CAE/E,SAAS,iBAAiB,QAAgD;EACxE,IAAI,gBAAgB,qBAAqB,IAAI,MAAM;EACnD,IAAI,CAAC,eAAe;GAClB,gBAAgB,EAAE,gBAAgB,MAAM;GACxC,qBAAqB,IAAI,QAAQ,aAAa;EAChD;EACA,OAAO;CACT;CAEA,SAAS,oBAAoB,QAAiD;EAC5E,MAAM,gBAAgB,iBAAiB,MAAM;EAC7C,cAAc,iBAAiB;EAC/B,MAAM,kBAAkB,qBAAqB,IAAI,MAAM,MAAM;EAE7D,OAAO;GACL,gBAAgB,cAAc;GAC9B;GACA,oBAAoB,eAAe;IACjC,IAAI,UAAU,GACZ,cAAc,iBAAiB;GAEnC;EACF;CACF;CAEA,SAAS,UAAU,QAA2B;EAC5C,IAAI,CAAC,OAAO,eAAe,gBAAgB,IAAI,MAAM,GACnD;EAEF,cAAc,IAAI,MAAM;CAC1B;CAEA,SAAS,UAAU,QAA2B;EAC5C,cAAc,OAAO,MAAM;CAC7B;CAEA,SAAS,YAAY,QAA2B;EAC9C,gBAAgB,IAAI,MAAM;EAC1B,cAAc,OAAO,MAAM;CAC7B;CAEA,OAAO;EACL,aAAa,QAAQ,WAAW;GAC9B,QAAQ,QAAR;IACE,KAAA;KACE,UAAU,MAAM;KAChB;IACF,KAAA;KACE,UAAU,MAAM;KAChB;IACF,KAAA;KACE,YAAY,MAAM;KAClB;IACF,SAEE;GACJ;EACF;EAEA,eAAe,WAAW;GACxB,cAAc,OAAO,MAAM;GAC3B,qBAAqB,OAAO,MAAM;EACpC;EAEA,oBAAoB,WAAW;GAC7B,qBAAqB,OAAO,MAAM;GAClC,UAAU,MAAM;EAClB;EAEA,8BAA8B;GAC5B,MAAM,qBAA0C,CAAC;GAEjD,cAAc,SAAS,WAAW;IAChC,IAAI,CAAC,OAAO,aACV,cAAc,OAAO,MAAM;SACtB,IAAI,CAAC,gBAAgB,IAAI,MAAM,KAAK,CAAC,iBAAiB,MAAM,CAAC,CAAC,gBAAgB;KACnF,cAAc,OAAO,MAAM;KAC3B,mBAAmB,KAAK,MAAM;IAChC;GACF,CAAC;GAED,OAAO;EACT;EAEA;EAEA,wBAAwB,QAAQ,mBAAmB;GACjD,IAAI,eAAe,UAAU,GAC3B,iBAAiB,MAAM,CAAC,CAAC,iBAAiB;EAE9C;EAEA,cAAc,WAAW;GACvB,qBAAqB,OAAO,MAAM;GAClC,UAAU,MAAM;EAClB;EAEA,2BAA2B,aAAa;GACtC,uBAAuB,KAAK,QAAQ;EACtC;EAEA,kCAAkC;GAChC,MAAM,YAAY;GAClB,yBAAyB,CAAC;GAC1B,KAAK,MAAM,YAAY,WACrB,IAAI,SAAS,eAAe,UAAU,GACpC,iBAAiB,SAAS,MAAM,CAAC,CAAC,iBAAiB;GAGvD,OAAO;EACT;EAEA,aAAa;GACX,cAAc,MAAM;GACpB,yBAAyB,CAAC;GAC1B,uCAAuB,IAAI,QAAQ;EACrC;CACF;AACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//#region src/domain/record/canvas/canvasSnapshot.ts
|
|
2
|
+
function createCanvasSnapshot(canvas, maxImageDimension) {
|
|
3
|
+
const canvasWidth = canvas.width;
|
|
4
|
+
const canvasHeight = canvas.height;
|
|
5
|
+
const source = createDownscaledCanvas(canvas, canvasWidth, canvasHeight, maxImageDimension);
|
|
6
|
+
if (!source) return;
|
|
7
|
+
return {
|
|
8
|
+
canvasHeight,
|
|
9
|
+
canvasWidth,
|
|
10
|
+
source
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function createDownscaledCanvas(image, width, height, maxDimension) {
|
|
14
|
+
const scale = Math.min(1, maxDimension / Math.max(width, height));
|
|
15
|
+
const scaledWidth = Math.max(1, Math.round(width * scale));
|
|
16
|
+
const scaledHeight = Math.max(1, Math.round(height * scale));
|
|
17
|
+
const canvas = document.createElement("canvas");
|
|
18
|
+
canvas.width = scaledWidth;
|
|
19
|
+
canvas.height = scaledHeight;
|
|
20
|
+
const context = canvas.getContext("2d");
|
|
21
|
+
if (!context) return;
|
|
22
|
+
context.imageSmoothingQuality = "low";
|
|
23
|
+
context.drawImage(image, 0, 0, scaledWidth, scaledHeight);
|
|
24
|
+
return canvas;
|
|
25
|
+
}
|
|
26
|
+
function captureCanvasImage(snapshot, encodeQuality) {
|
|
27
|
+
return new Promise((resolve) => {
|
|
28
|
+
try {
|
|
29
|
+
snapshot.source.toBlob((blob) => resolve(blob ?? void 0), "image/webp", encodeQuality);
|
|
30
|
+
} catch {
|
|
31
|
+
resolve(void 0);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { captureCanvasImage, createCanvasSnapshot, createDownscaledCanvas };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=canvasSnapshot.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasSnapshot.mjs","names":[],"sources":["../../../../src/domain/record/canvas/canvasSnapshot.ts"],"sourcesContent":["export interface CanvasSnapshot {\n canvasHeight: number\n canvasWidth: number\n source: HTMLCanvasElement\n}\n\nexport function createCanvasSnapshot(canvas: HTMLCanvasElement, maxImageDimension: number): CanvasSnapshot | undefined {\n const canvasWidth = canvas.width\n const canvasHeight = canvas.height\n const source = createDownscaledCanvas(canvas, canvasWidth, canvasHeight, maxImageDimension)\n if (!source) {\n return undefined\n }\n\n return { canvasHeight, canvasWidth, source }\n}\n\n// Downscales `image` (of size `width`x`height`) to fit within `maxDimension` on a fresh canvas.\nexport function createDownscaledCanvas(\n image: CanvasImageSource,\n width: number,\n height: number,\n maxDimension: number\n): HTMLCanvasElement | undefined {\n const scale = Math.min(1, maxDimension / Math.max(width, height))\n const scaledWidth = Math.max(1, Math.round(width * scale))\n const scaledHeight = Math.max(1, Math.round(height * scale))\n\n const canvas = document.createElement('canvas')\n canvas.width = scaledWidth\n canvas.height = scaledHeight\n\n const context = canvas.getContext('2d')\n if (!context) {\n return undefined\n }\n\n context.imageSmoothingQuality = 'low'\n context.drawImage(image, 0, 0, scaledWidth, scaledHeight)\n\n return canvas\n}\n\nexport function captureCanvasImage(snapshot: CanvasSnapshot, encodeQuality: number): Promise<Blob | undefined> {\n return new Promise((resolve) => {\n try {\n snapshot.source.toBlob((blob) => resolve(blob ?? undefined), 'image/webp', encodeQuality)\n } catch {\n resolve(undefined)\n }\n })\n}\n"],"mappings":";AAMA,SAAgB,qBAAqB,QAA2B,mBAAuD;CACrH,MAAM,cAAc,OAAO;CAC3B,MAAM,eAAe,OAAO;CAC5B,MAAM,SAAS,uBAAuB,QAAQ,aAAa,cAAc,iBAAiB;CAC1F,IAAI,CAAC,QACH;CAGF,OAAO;EAAE;EAAc;EAAa;CAAO;AAC7C;AAGA,SAAgB,uBACd,OACA,OACA,QACA,cAC+B;CAC/B,MAAM,QAAQ,KAAK,IAAI,GAAG,eAAe,KAAK,IAAI,OAAO,MAAM,CAAC;CAChE,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK,CAAC;CACzD,MAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,KAAK,CAAC;CAE3D,MAAM,SAAS,SAAS,cAAc,QAAQ;CAC9C,OAAO,QAAQ;CACf,OAAO,SAAS;CAEhB,MAAM,UAAU,OAAO,WAAW,IAAI;CACtC,IAAI,CAAC,SACH;CAGF,QAAQ,wBAAwB;CAChC,QAAQ,UAAU,OAAO,GAAG,GAAG,aAAa,YAAY;CAExD,OAAO;AACT;AAEA,SAAgB,mBAAmB,UAA0B,eAAkD;CAC7G,OAAO,IAAI,SAAS,YAAY;EAC9B,IAAI;GACF,SAAS,OAAO,QAAQ,SAAS,QAAQ,QAAQ,KAAA,CAAS,GAAG,cAAc,aAAa;EAC1F,QAAQ;GACN,QAAQ,KAAA,CAAS;EACnB;CACF,CAAC;AACH"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { isElementNode } from "@kubesense/kubesense-browser-rum-core";
|
|
2
|
+
//#region src/domain/record/canvas/canvasUtils.ts
|
|
3
|
+
const CANVAS_SIZE_ATTRIBUTES = ["width", "height"];
|
|
4
|
+
function isCanvasElement(node) {
|
|
5
|
+
return isElementNode(node) && node.tagName === "CANVAS";
|
|
6
|
+
}
|
|
7
|
+
function isCanvasSizeAttribute(attributeName) {
|
|
8
|
+
return CANVAS_SIZE_ATTRIBUTES.includes(attributeName.toLowerCase());
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { isCanvasElement, isCanvasSizeAttribute };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=canvasUtils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasUtils.mjs","names":[],"sources":["../../../../src/domain/record/canvas/canvasUtils.ts"],"sourcesContent":["import { isElementNode } from '@kubesense/kubesense-browser-rum-core'\n\nconst CANVAS_SIZE_ATTRIBUTES = ['width', 'height']\n\nexport function isCanvasElement(node: Node): node is HTMLCanvasElement {\n return isElementNode(node) && node.tagName === 'CANVAS'\n}\n\nexport function isCanvasSizeAttribute(attributeName: string): boolean {\n return CANVAS_SIZE_ATTRIBUTES.includes(attributeName.toLowerCase())\n}\n"],"mappings":";;AAEA,MAAM,yBAAyB,CAAC,SAAS,QAAQ;AAEjD,SAAgB,gBAAgB,MAAuC;CACrE,OAAO,cAAc,IAAI,KAAK,KAAK,YAAY;AACjD;AAEA,SAAgB,sBAAsB,eAAgC;CACpE,OAAO,uBAAuB,SAAS,cAAc,YAAY,CAAC;AACpE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/domain/record/elementsScrollPositions.ts
|
|
2
|
+
function createElementsScrollPositions() {
|
|
3
|
+
const scrollPositionsByElement = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
return {
|
|
5
|
+
set(element, scrollPositions) {
|
|
6
|
+
if (element === document && !document.scrollingElement) return;
|
|
7
|
+
scrollPositionsByElement.set(element === document ? document.scrollingElement : element, scrollPositions);
|
|
8
|
+
},
|
|
9
|
+
get(element) {
|
|
10
|
+
return scrollPositionsByElement.get(element);
|
|
11
|
+
},
|
|
12
|
+
has(element) {
|
|
13
|
+
return scrollPositionsByElement.has(element);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { createElementsScrollPositions };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=elementsScrollPositions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elementsScrollPositions.mjs","names":[],"sources":["../../../src/domain/record/elementsScrollPositions.ts"],"sourcesContent":["export type ElementsScrollPositions = ReturnType<typeof createElementsScrollPositions>\nexport interface ScrollPositions {\n scrollLeft: number\n scrollTop: number\n}\n\nexport function createElementsScrollPositions() {\n const scrollPositionsByElement = new WeakMap<Element, ScrollPositions>()\n return {\n set(element: Element | Document, scrollPositions: ScrollPositions) {\n if (element === document && !document.scrollingElement) {\n // cf https://drafts.csswg.org/cssom-view/#dom-document-scrollingelement,\n // in some cases scrolling elements can not be defined, we don't support those for now\n return\n }\n scrollPositionsByElement.set(\n element === document ? document.scrollingElement! : (element as Element),\n scrollPositions\n )\n },\n get(element: Element) {\n return scrollPositionsByElement.get(element)\n },\n has(element: Element) {\n return scrollPositionsByElement.has(element)\n },\n }\n}\n"],"mappings":";AAMA,SAAgB,gCAAgC;CAC9C,MAAM,2CAA2B,IAAI,QAAkC;CACvE,OAAO;EACL,IAAI,SAA6B,iBAAkC;GACjE,IAAI,YAAY,YAAY,CAAC,SAAS,kBAGpC;GAEF,yBAAyB,IACvB,YAAY,WAAW,SAAS,mBAAqB,SACrD,eACF;EACF;EACA,IAAI,SAAkB;GACpB,OAAO,yBAAyB,IAAI,OAAO;EAC7C;EACA,IAAI,SAAkB;GACpB,OAAO,yBAAyB,IAAI,OAAO;EAC7C;CACF;AACF"}
|