@scalebun-release/react-native 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +154 -0
- package/android/build.gradle +94 -0
- package/android/consumer-rules.pro +28 -0
- package/android/src/androidTest/java/com/scalebun/rn/ota/ScaleBunOtaVerifierInstrumentedTest.kt +112 -0
- package/android/src/main/AndroidManifest.xml +14 -0
- package/android/src/main/java/com/scalebun/core/crash/CrashStorage.kt +155 -0
- package/android/src/main/java/com/scalebun/core/crash/NativeCrashHandler.kt +93 -0
- package/android/src/main/java/com/scalebun/core/performance/ANRWatchdog.kt +100 -0
- package/android/src/main/java/com/scalebun/core/performance/AppStartCollector.kt +180 -0
- package/android/src/main/java/com/scalebun/core/performance/FrameMetricsCollector.kt +230 -0
- package/android/src/main/java/com/scalebun/core/performance/PerformanceCore.kt +165 -0
- package/android/src/main/java/com/scalebun/profiler/ProfilerModule.kt +398 -0
- package/android/src/main/java/com/scalebun/profiler/ProfilerPackage.kt +24 -0
- package/android/src/main/java/com/scalebun/profiler/collectors/CpuCollector.kt +161 -0
- package/android/src/main/java/com/scalebun/profiler/collectors/IncidentDetector.kt +223 -0
- package/android/src/main/java/com/scalebun/profiler/collectors/MemoryCollector.kt +157 -0
- package/android/src/main/java/com/scalebun/profiler/collectors/RenderCollector.kt +194 -0
- package/android/src/main/java/com/scalebun/profiler/collectors/SamplerScheduler.kt +218 -0
- package/android/src/main/java/com/scalebun/profiler/collectors/ThreadCollector.kt +142 -0
- package/android/src/main/java/com/scalebun/replaysdk/ReplaySdkModule.kt +1117 -0
- package/android/src/main/java/com/scalebun/replaysdk/ReplaySdkPackage.kt +24 -0
- package/android/src/main/java/com/scalebun/replaysdk/capture/CaptureReason.kt +47 -0
- package/android/src/main/java/com/scalebun/replaysdk/capture/FrameCaptureManager.kt +574 -0
- package/android/src/main/java/com/scalebun/replaysdk/capture/FrameCaptureScheduler.kt +187 -0
- package/android/src/main/java/com/scalebun/replaysdk/capture/UiStabilityDetector.kt +214 -0
- package/android/src/main/java/com/scalebun/replaysdk/core/ReplayConfig.kt +144 -0
- package/android/src/main/java/com/scalebun/replaysdk/core/ReplayLogger.kt +31 -0
- package/android/src/main/java/com/scalebun/replaysdk/core/SessionIdGenerator.kt +15 -0
- package/android/src/main/java/com/scalebun/replaysdk/models/ReplayModels.kt +94 -0
- package/android/src/main/java/com/scalebun/replaysdk/outbox/NativeOutbox.kt +574 -0
- package/android/src/main/java/com/scalebun/replaysdk/outbox/OutboxUploader.kt +559 -0
- package/android/src/main/java/com/scalebun/replaysdk/privacy/PrivacyMaskProcessor.kt +126 -0
- package/android/src/main/java/com/scalebun/replaysdk/session/SessionManager.kt +322 -0
- package/android/src/main/java/com/scalebun/replaysdk/storage/ReplayStorage.kt +136 -0
- package/android/src/main/java/com/scalebun/replaysdk/timeline/TimelineCollector.kt +28 -0
- package/android/src/main/java/com/scalebun/replaysdk/tracking/InteractionTracker.kt +470 -0
- package/android/src/main/java/com/scalebun/replaysdk/tracking/ScreenTracker.kt +20 -0
- package/android/src/main/java/com/scalebun/replaysdk/tracking/ScrollContextProbe.kt +188 -0
- package/android/src/main/java/com/scalebun/replaysdk/transport/ReplayTransport.kt +99 -0
- package/android/src/main/java/com/scalebun/replaysdk/voice/VoiceRecorder.kt +121 -0
- package/android/src/main/java/com/scalebun/replaysdk/voice/VoiceTranscriber.kt +170 -0
- package/android/src/main/java/com/scalebun/rn/ScaleBunPackage.kt +113 -0
- package/android/src/main/java/com/scalebun/rn/crash/ScaleBunCrashModule.kt +188 -0
- package/android/src/main/java/com/scalebun/rn/crash/ScaleBunCrashPackage.kt +22 -0
- package/android/src/main/java/com/scalebun/rn/engage/ScaleBunEngageModule.kt +579 -0
- package/android/src/main/java/com/scalebun/rn/engage/ScaleBunEngagePackage.kt +22 -0
- package/android/src/main/java/com/scalebun/rn/engage/ScaleBunNotificationPresenter.kt +110 -0
- package/android/src/main/java/com/scalebun/rn/ota/BsPatch.kt +240 -0
- package/android/src/main/java/com/scalebun/rn/ota/BundleDownloader.kt +195 -0
- package/android/src/main/java/com/scalebun/rn/ota/DeviceIntegrity.kt +81 -0
- package/android/src/main/java/com/scalebun/rn/ota/DownloadFailure.kt +55 -0
- package/android/src/main/java/com/scalebun/rn/ota/OtaProtocol.kt +244 -0
- package/android/src/main/java/com/scalebun/rn/ota/ScaleBunOtaKeyRegistry.kt +100 -0
- package/android/src/main/java/com/scalebun/rn/ota/ScaleBunOtaModule.kt +683 -0
- package/android/src/main/java/com/scalebun/rn/ota/ScaleBunOtaReleaseVerifier.kt +136 -0
- package/android/src/main/java/com/scalebun/rn/ota/SlotManager.kt +578 -0
- package/android/src/main/java/com/scalebun/rn/ota/TlsPinning.kt +118 -0
- package/android/src/main/java/com/scalebun/rn/performance/PerformanceModule.kt +217 -0
- package/android/src/main/java/com/scalebun/rn/referrer/ScaleBunInstallReferrerModule.kt +77 -0
- package/android/src/main/java/com/scalebun/rn/storage/ScaleBunStorageModule.kt +68 -0
- package/android/src/main/java/com/scalebun/storage/KvFileStore.kt +174 -0
- package/android/src/newarch/java/com/scalebun/profiler/ProfilerSpec.kt +12 -0
- package/android/src/newarch/java/com/scalebun/replaysdk/ReplaySdkSpec.kt +12 -0
- package/android/src/newarch/java/com/scalebun/rn/crash/ScaleBunCrashSpec.kt +15 -0
- package/android/src/newarch/java/com/scalebun/rn/ota/ScaleBunOtaSpec.kt +16 -0
- package/android/src/newarch/java/com/scalebun/rn/performance/PerformanceSpec.kt +12 -0
- package/android/src/newarch/java/com/scalebun/rn/referrer/ScaleBunInstallReferrerSpec.kt +14 -0
- package/android/src/newarch/java/com/scalebun/rn/storage/ScaleBunStorageSpec.kt +16 -0
- package/android/src/oldarch/java/com/scalebun/profiler/ProfilerSpec.kt +34 -0
- package/android/src/oldarch/java/com/scalebun/replaysdk/ReplaySdkSpec.kt +77 -0
- package/android/src/oldarch/java/com/scalebun/rn/crash/ScaleBunCrashSpec.kt +40 -0
- package/android/src/oldarch/java/com/scalebun/rn/ota/ScaleBunOtaSpec.kt +42 -0
- package/android/src/oldarch/java/com/scalebun/rn/performance/PerformanceSpec.kt +27 -0
- package/android/src/oldarch/java/com/scalebun/rn/referrer/ScaleBunInstallReferrerSpec.kt +18 -0
- package/android/src/oldarch/java/com/scalebun/rn/storage/ScaleBunStorageSpec.kt +26 -0
- package/bin/lib/androidCodemod.js +370 -0
- package/bin/lib/iosCodemod.js +343 -0
- package/bin/scalebun.js +1004 -0
- package/dist/scalebun.full.js +37348 -0
- package/dist/scalebun.slim.js +34137 -0
- package/ios/Capture/InteractionTracker.swift +237 -0
- package/ios/Capture/PrivacyMaskProcessor.swift +158 -0
- package/ios/Capture/ScreenshotCaptureManager.swift +398 -0
- package/ios/Capture/WindowResolver.swift +63 -0
- package/ios/Core/DeviceIdentity.swift +50 -0
- package/ios/Core/ReplayConfig.swift +100 -0
- package/ios/Core/ReplayLogger.swift +22 -0
- package/ios/Core/SessionIdGenerator.swift +18 -0
- package/ios/Crash/ScaleBunCrashBridge.mm +74 -0
- package/ios/Crash/ScaleBunCrashHandler.swift +84 -0
- package/ios/Crash/ScaleBunCrashModule.swift +98 -0
- package/ios/Crash/ScaleBunCrashSignalBridge.h +49 -0
- package/ios/Crash/ScaleBunCrashSignalBridge.m +296 -0
- package/ios/Crash/ScaleBunCrashSignalStress.c +137 -0
- package/ios/Crash/ScaleBunCrashStorage.swift +121 -0
- package/ios/Crash/ScaleBunExceptionChain.swift +71 -0
- package/ios/CrashTests/ScaleBunExceptionChainTests.swift +144 -0
- package/ios/Engage/ScaleBunEngageBridge.m +32 -0
- package/ios/Engage/ScaleBunEngageModule.swift +250 -0
- package/ios/Engage/ScaleBunPushNotificationCenter.swift +185 -0
- package/ios/Ota/BsPatch.swift +203 -0
- package/ios/Ota/BundleDownloader.swift +249 -0
- package/ios/Ota/DeviceIntegrity.swift +112 -0
- package/ios/Ota/DownloadFailure.swift +56 -0
- package/ios/Ota/OtaProtocol.swift +246 -0
- package/ios/Ota/OtaSlotManager.swift +613 -0
- package/ios/Ota/ScaleBunOtaBridge.mm +92 -0
- package/ios/Ota/ScaleBunOtaEventsModule.swift +61 -0
- package/ios/Ota/ScaleBunOtaKeyRegistry.swift +147 -0
- package/ios/Ota/ScaleBunOtaModule.swift +587 -0
- package/ios/Ota/ScaleBunOtaReleaseVerifier.swift +119 -0
- package/ios/Ota/TlsPinning.swift +222 -0
- package/ios/OtaTests/DownloadFailureTests.swift +78 -0
- package/ios/OtaTests/ScaleBunOtaVerifierTests.swift +548 -0
- package/ios/Outbox/NativeOutbox.swift +632 -0
- package/ios/Outbox/OutboxUploader.swift +578 -0
- package/ios/Performance/ScaleBunPerformanceBridge.m +32 -0
- package/ios/Performance/ScaleBunPerformanceModule.swift +290 -0
- package/ios/PrivacyInfo.xcprivacy +97 -0
- package/ios/Profiler/ScaleBunProfilerBridge.m +55 -0
- package/ios/Profiler/ScaleBunProfilerModule.swift +966 -0
- package/ios/ReplaySdk-Bridging-Header.h +2 -0
- package/ios/ReplaySdk.swift +793 -0
- package/ios/ReplaySdkBridge.m +97 -0
- package/ios/Session/SessionManager.swift +273 -0
- package/ios/Skan/ScaleBunSkanBridge.m +14 -0
- package/ios/Skan/ScaleBunSkanModule.swift +61 -0
- package/ios/Storage/ReplayStorage.swift +61 -0
- package/ios/Storage/ScaleBunKvFileStore.swift +125 -0
- package/ios/Storage/ScaleBunStorageBridge.mm +72 -0
- package/ios/Storage/ScaleBunStorageModule.swift +57 -0
- package/ios/Transport/ReplayTransport.swift +70 -0
- package/ios/VoiceRecorder.swift +145 -0
- package/lib/commonjs/analytics/EventTracker.js +598 -0
- package/lib/commonjs/analytics/automaticEvents.js +71 -0
- package/lib/commonjs/analytics/batching.js +64 -0
- package/lib/commonjs/analytics/eventLane.js +55 -0
- package/lib/commonjs/analytics/revenue.js +125 -0
- package/lib/commonjs/analytics/subscription.js +94 -0
- package/lib/commonjs/bootstrap/FeatureRegistry.js +86 -0
- package/lib/commonjs/bootstrap/SDKBootstrapper.js +748 -0
- package/lib/commonjs/bucketing/fnv1a32.js +45 -0
- package/lib/commonjs/compat/codepush.js +153 -0
- package/lib/commonjs/config/ConfigManager.js +238 -0
- package/lib/commonjs/config/configTypes.js +16 -0
- package/lib/commonjs/config/otaPolicyState.js +85 -0
- package/lib/commonjs/config/quotaState.js +435 -0
- package/lib/commonjs/core/architecture.js +45 -0
- package/lib/commonjs/core/clock/now.js +13 -0
- package/lib/commonjs/core/config/defaults.js +2 -0
- package/lib/commonjs/core/config/schema.js +512 -0
- package/lib/commonjs/core/constants/endpoints.js +19 -0
- package/lib/commonjs/core/constants/protocol.js +31 -0
- package/lib/commonjs/core/constants/timings.js +39 -0
- package/lib/commonjs/core/constants/version.js +18 -0
- package/lib/commonjs/core/context/app.js +2 -0
- package/lib/commonjs/core/context/device.js +155 -0
- package/lib/commonjs/core/context/session.js +2 -0
- package/lib/commonjs/core/context/user.js +2 -0
- package/lib/commonjs/core/contracts/IFeature.js +2 -0
- package/lib/commonjs/core/di/container.js +29 -0
- package/lib/commonjs/core/encoding/base64.js +50 -0
- package/lib/commonjs/core/id/deviceId.js +52 -0
- package/lib/commonjs/core/id/installationId.js +55 -0
- package/lib/commonjs/core/id/sessionId.js +2 -0
- package/lib/commonjs/core/lifecycle/appLifecycle.js +31 -0
- package/lib/commonjs/core/lifecycle/crashSafe.js +33 -0
- package/lib/commonjs/core/logger/errorClassification.js +107 -0
- package/lib/commonjs/core/logger/internalLogger.js +63 -0
- package/lib/commonjs/core/logger/levels.js +2 -0
- package/lib/commonjs/crypto/hmacSha256.js +132 -0
- package/lib/commonjs/debug/bootstrap.js +429 -0
- package/lib/commonjs/debug/commands.js +732 -0
- package/lib/commonjs/debug/configBuilder.js +70 -0
- package/lib/commonjs/debug/exportBridge.js +155 -0
- package/lib/commonjs/debug/hostResolver.js +42 -0
- package/lib/commonjs/debug/index.js +141 -0
- package/lib/commonjs/debug/metrics.js +39 -0
- package/lib/commonjs/debug/perf.js +186 -0
- package/lib/commonjs/debug/perfWiring.js +109 -0
- package/lib/commonjs/debug/protocol.js +121 -0
- package/lib/commonjs/debug/redaction.js +422 -0
- package/lib/commonjs/debug/replayWiring.js +149 -0
- package/lib/commonjs/debug/screenTracking.js +60 -0
- package/lib/commonjs/debug/sessionWiring.js +48 -0
- package/lib/commonjs/debug/stream.js +542 -0
- package/lib/commonjs/debug/transport.js +368 -0
- package/lib/commonjs/features/bugreport/BugReportFeature.js +112 -0
- package/lib/commonjs/features/bugreport/buildPayload.js +97 -0
- package/lib/commonjs/features/bugreport/index.js +2 -0
- package/lib/commonjs/features/crash/CrashFeature.js +86 -0
- package/lib/commonjs/features/crash/CrashReporter.js +160 -0
- package/lib/commonjs/features/crash/NativeCrashFeature.js +42 -0
- package/lib/commonjs/features/crash/capture.js +48 -0
- package/lib/commonjs/features/crash/globalHandler.js +41 -0
- package/lib/commonjs/features/crash/index.js +14 -0
- package/lib/commonjs/features/crash/nativeCrashBridge.js +361 -0
- package/lib/commonjs/features/crash/rejectionHandler.js +180 -0
- package/lib/commonjs/features/crash/scrubCrash.js +158 -0
- package/lib/commonjs/features/engage/EngageAnchor.js +132 -0
- package/lib/commonjs/features/engage/EngageArchetypeRenderers.js +4292 -0
- package/lib/commonjs/features/engage/EngageInAppView.js +2670 -0
- package/lib/commonjs/features/engage/EngageInlinePlacement.js +133 -0
- package/lib/commonjs/features/engage/EngagePromptProvider.js +1063 -0
- package/lib/commonjs/features/engage/EngagePromptView.js +1252 -0
- package/lib/commonjs/features/engage/EngageTransport.js +608 -0
- package/lib/commonjs/features/engage/EngageVariantContent.js +1778 -0
- package/lib/commonjs/features/engage/__test-support__/reactNativeStub.js +54 -0
- package/lib/commonjs/features/engage/attachmentCapture.js +48 -0
- package/lib/commonjs/features/engage/captureVoiceAttachment.js +88 -0
- package/lib/commonjs/features/engage/engageCoachmarkTour.js +106 -0
- package/lib/commonjs/features/engage/engageGameLogic.js +308 -0
- package/lib/commonjs/features/engage/engageMediaSizing.js +60 -0
- package/lib/commonjs/features/engage/engageMultiStepSheet.js +43 -0
- package/lib/commonjs/features/engage/engageOutcome.js +118 -0
- package/lib/commonjs/features/engage/engagePushTokenBridge.js +72 -0
- package/lib/commonjs/features/engage/engageShakeBridge.js +62 -0
- package/lib/commonjs/features/engage/engageSignals.js +39 -0
- package/lib/commonjs/features/engage/engageStoreReviewBridge.js +49 -0
- package/lib/commonjs/features/engage/engageTestSeenStore.js +99 -0
- package/lib/commonjs/features/engage/engageThrottle.js +404 -0
- package/lib/commonjs/features/engage/engageTriggerEngine.js +365 -0
- package/lib/commonjs/features/engage/engageTypes.js +116 -0
- package/lib/commonjs/features/engage/engageVariantResolver.js +143 -0
- package/lib/commonjs/features/engage/engageWindowInsets.js +98 -0
- package/lib/commonjs/features/engage/gestureTriggerDetector.js +85 -0
- package/lib/commonjs/features/engage/transcription/TranscriptionProvider.js +55 -0
- package/lib/commonjs/features/install-referrer/installReferrer.js +113 -0
- package/lib/commonjs/features/journey/ScaleBunDebugRoot.js +1038 -0
- package/lib/commonjs/features/journey/ScaleBunFlatList.js +39 -0
- package/lib/commonjs/features/journey/ScaleBunImpression.js +113 -0
- package/lib/commonjs/features/journey/ScaleBunScrollView.js +102 -0
- package/lib/commonjs/features/journey/ScaleBunSectionList.js +39 -0
- package/lib/commonjs/features/journey/autoInstrumentScroll.js +161 -0
- package/lib/commonjs/features/journey/calibrationContext.js +42 -0
- package/lib/commonjs/features/journey/gestureBuffer.js +63 -0
- package/lib/commonjs/features/journey/gestureDetector.js +176 -0
- package/lib/commonjs/features/journey/impression.js +93 -0
- package/lib/commonjs/features/journey/interactionProtocol.js +168 -0
- package/lib/commonjs/features/journey/journeyManager.js +466 -0
- package/lib/commonjs/features/journey/journeyTypes.js +55 -0
- package/lib/commonjs/features/journey/nativeScroll.js +85 -0
- package/lib/commonjs/features/journey/navDetector.js +161 -0
- package/lib/commonjs/features/journey/screenshotHelper.js +136 -0
- package/lib/commonjs/features/journey/scrollContext.js +154 -0
- package/lib/commonjs/features/journey/targetGeometry.js +185 -0
- package/lib/commonjs/features/journey/targetRegistry.js +53 -0
- package/lib/commonjs/features/journey/touchTarget.js +249 -0
- package/lib/commonjs/features/journey/uiState.js +188 -0
- package/lib/commonjs/features/navigation/AutoScreenDetector.js +607 -0
- package/lib/commonjs/features/network/NetworkFeature.js +216 -0
- package/lib/commonjs/features/network/index.js +23 -0
- package/lib/commonjs/features/network/thirdParty.js +151 -0
- package/lib/commonjs/features/ota/OtaEventEmitter.js +129 -0
- package/lib/commonjs/features/ota/OtaOrchestrator.js +1309 -0
- package/lib/commonjs/features/ota/OtaTypes.js +6 -0
- package/lib/commonjs/features/ota/deviceAttributes.js +48 -0
- package/lib/commonjs/features/ota/environment.js +172 -0
- package/lib/commonjs/features/ota/geoCountry.js +93 -0
- package/lib/commonjs/features/ota/retry.js +96 -0
- package/lib/commonjs/features/ota/signedDownload.js +187 -0
- package/lib/commonjs/features/ota/useOtaUpdate.js +106 -0
- package/lib/commonjs/features/performance/PerformanceFeature.js +649 -0
- package/lib/commonjs/features/performance/collectors/AppLaunchCollector.js +122 -0
- package/lib/commonjs/features/performance/collectors/AutoScreenLoadCollector.js +232 -0
- package/lib/commonjs/features/performance/collectors/CustomTraceCollector.js +99 -0
- package/lib/commonjs/features/performance/collectors/FrameMetricsCollector.js +184 -0
- package/lib/commonjs/features/performance/collectors/JsStallCollector.js +165 -0
- package/lib/commonjs/features/performance/collectors/NetworkPerfCollector.js +59 -0
- package/lib/commonjs/features/performance/collectors/ScreenLoadCollector.js +78 -0
- package/lib/commonjs/features/performance/collectors/UiHangCollector.js +78 -0
- package/lib/commonjs/features/performance/config.js +58 -0
- package/lib/commonjs/features/performance/getNativePerformanceModule.js +44 -0
- package/lib/commonjs/features/performance/index.js +58 -0
- package/lib/commonjs/features/performance/metrics/MetricsEngine.js +148 -0
- package/lib/commonjs/features/performance/models.js +48 -0
- package/lib/commonjs/features/performance/transport/PerformanceTransport.js +168 -0
- package/lib/commonjs/features/profiler/ProfilerFeature.js +600 -0
- package/lib/commonjs/features/profiler/config.js +151 -0
- package/lib/commonjs/features/profiler/contracts.js +62 -0
- package/lib/commonjs/features/profiler/index.js +40 -0
- package/lib/commonjs/features/profiler/models.js +112 -0
- package/lib/commonjs/features/profiler/transport/ProfilerTransport.js +94 -0
- package/lib/commonjs/features/replay/bridge/adapters/bridgeAdapter.js +203 -0
- package/lib/commonjs/features/replay/bridge/eventEmitter.js +128 -0
- package/lib/commonjs/features/replay/bridge/nativeModule.js +95 -0
- package/lib/commonjs/features/replay/bridge/nativeQuota.js +121 -0
- package/lib/commonjs/features/replay/core/clock/clock.js +47 -0
- package/lib/commonjs/features/replay/core/config/defaults.js +88 -0
- package/lib/commonjs/features/replay/core/config/validator.js +109 -0
- package/lib/commonjs/features/replay/core/env/environmentDetector.js +28 -0
- package/lib/commonjs/features/replay/core/errors/safeCall.js +42 -0
- package/lib/commonjs/features/replay/core/ids/sessionId.js +53 -0
- package/lib/commonjs/features/replay/core/logger/logger.js +36 -0
- package/lib/commonjs/features/replay/core/privacy/privacyTypes.js +34 -0
- package/lib/commonjs/features/replay/core/queue/boundedQueue.js +71 -0
- package/lib/commonjs/features/replay/integrations/alert/alertInstrumentation.js +259 -0
- package/lib/commonjs/features/replay/integrations/logs/consoleIntegration.js +139 -0
- package/lib/commonjs/features/replay/integrations/network/networkAdapter.js +77 -0
- package/lib/commonjs/features/replay/integrations/react-navigation/navigationIntegration.js +88 -0
- package/lib/commonjs/features/replay/integrations/touch/ReplayRoot.js +103 -0
- package/lib/commonjs/features/replay/pipeline/batching/batchManager.js +119 -0
- package/lib/commonjs/features/replay/pipeline/envelope/envelopeBuilder.js +52 -0
- package/lib/commonjs/features/replay/pipeline/retry/retryPolicy.js +53 -0
- package/lib/commonjs/features/replay/pipeline/transport/transportTypes.js +67 -0
- package/lib/commonjs/features/replay/public/api.js +336 -0
- package/lib/commonjs/features/replay/public/enums.js +85 -0
- package/lib/commonjs/features/replay/public/types.js +6 -0
- package/lib/commonjs/features/replay/replay/breadcrumbs/breadcrumbCollector.js +119 -0
- package/lib/commonjs/features/replay/replay/frames/frameModels.js +40 -0
- package/lib/commonjs/features/replay/replay/session/sessionOrchestrator.js +279 -0
- package/lib/commonjs/features/replay/replay/timeline/timelineModels.js +120 -0
- package/lib/commonjs/features/replay/transport/BackendReplayTransport.js +175 -0
- package/lib/commonjs/features/replay/transport/CompositeReplayTransport.js +75 -0
- package/lib/commonjs/features/replay/transport/DesktopReplayTransport.js +124 -0
- package/lib/commonjs/features/replay/transport/ReplayTransport.js +2 -0
- package/lib/commonjs/features/session/BackendSessionAdapter.js +1915 -0
- package/lib/commonjs/features/session/DesktopSessionTransport.js +124 -0
- package/lib/commonjs/features/session/JourneyEventPipeline.js +244 -0
- package/lib/commonjs/features/session/ReplayCaptureManager.js +1253 -0
- package/lib/commonjs/features/session/ScrollTracker.js +147 -0
- package/lib/commonjs/features/session/SessionManager.js +1448 -0
- package/lib/commonjs/features/session/SyncDecisionEngine.js +95 -0
- package/lib/commonjs/features/session/frameLink.js +36 -0
- package/lib/commonjs/features/session/frameScrollState.js +41 -0
- package/lib/commonjs/features/session/index.js +84 -0
- package/lib/commonjs/features/session/nativeCapture.js +53 -0
- package/lib/commonjs/features/session/outboxFrameCapture.js +83 -0
- package/lib/commonjs/features/session/sessionTypes.js +230 -0
- package/lib/commonjs/features/session/viewportPlausibility.js +143 -0
- package/lib/commonjs/features/skan/skanBridge.js +54 -0
- package/lib/commonjs/features/skan/skanConversionManager.js +134 -0
- package/lib/commonjs/index.js +267 -0
- package/lib/commonjs/integrations/fetch/fetchInterceptor.js +174 -0
- package/lib/commonjs/integrations/navigation/screenTracker.js +2 -0
- package/lib/commonjs/integrations/network/bodyCapture.js +336 -0
- package/lib/commonjs/integrations/xhr/xhrInterceptor.js +224 -0
- package/lib/commonjs/metro/composeSourceMap.js +105 -0
- package/lib/commonjs/metro/featureModules.js +131 -0
- package/lib/commonjs/metro/index.js +230 -0
- package/lib/commonjs/metro/optionalDependencyStub.js +6 -0
- package/lib/commonjs/metro/optionalModules.js +31 -0
- package/lib/commonjs/metro/serializerCompose.js +161 -0
- package/lib/commonjs/pipeline/dispatcher/dispatcher.js +28 -0
- package/lib/commonjs/pipeline/envelope/envelope.js +17 -0
- package/lib/commonjs/pipeline/envelope/serializer.js +14 -0
- package/lib/commonjs/pipeline/processors/dedupe.js +2 -0
- package/lib/commonjs/pipeline/processors/enrich.js +16 -0
- package/lib/commonjs/pipeline/processors/sampling.js +2 -0
- package/lib/commonjs/pipeline/processors/sanitize.js +28 -0
- package/lib/commonjs/pipeline/queue/flushQueue.js +107 -0
- package/lib/commonjs/pipeline/queue/memoryQueue.js +31 -0
- package/lib/commonjs/pipeline/queue/persistentQueue.js +342 -0
- package/lib/commonjs/pipeline/queue/queuePolicy.js +2 -0
- package/lib/commonjs/pipeline/scheduler/flushScheduler.js +45 -0
- package/lib/commonjs/pipeline/scheduler/retryPolicy.js +15 -0
- package/lib/commonjs/public/ScaleBunErrorBoundary.js +91 -0
- package/lib/commonjs/public/ScaleBunFacade.js +2044 -0
- package/lib/commonjs/public/ScaleBunProvider.js +62 -0
- package/lib/commonjs/public/typedTracker.js +79 -0
- package/lib/commonjs/public/types.js +6 -0
- package/lib/commonjs/push/PushManager.js +270 -0
- package/lib/commonjs/push/adapters/ManualAdapter.js +86 -0
- package/lib/commonjs/push/adapters/NativeBridgeAdapter.js +131 -0
- package/lib/commonjs/push/adapters/NoopAdapter.js +45 -0
- package/lib/commonjs/push/adapters/RNFirebaseMessagingAdapter.js +248 -0
- package/lib/commonjs/push/adapters/loadMessaging.js +29 -0
- package/lib/commonjs/push/adapters/loadNotifee.js +36 -0
- package/lib/commonjs/push/adapters/selectAdapter.js +153 -0
- package/lib/commonjs/push/detect/capabilities.js +136 -0
- package/lib/commonjs/push/index.js +33 -0
- package/lib/commonjs/push/native/nativeNotifications.js +168 -0
- package/lib/commonjs/push/types.js +2 -0
- package/lib/commonjs/specs/NativeReplaySdk.js +28 -0
- package/lib/commonjs/specs/NativeScaleBunCrash.js +30 -0
- package/lib/commonjs/specs/NativeScaleBunInstallReferrer.js +24 -0
- package/lib/commonjs/specs/NativeScaleBunOta.js +32 -0
- package/lib/commonjs/specs/NativeScaleBunPerformance.js +25 -0
- package/lib/commonjs/specs/NativeScaleBunProfiler.js +26 -0
- package/lib/commonjs/specs/NativeScaleBunStorage.js +40 -0
- package/lib/commonjs/storage/StorageBackend.js +240 -0
- package/lib/commonjs/storage/db/sqlite.js +2 -0
- package/lib/commonjs/storage/files/fileStore.js +2 -0
- package/lib/commonjs/transport/auth/sdkSession.js +28 -0
- package/lib/commonjs/transport/backoff/exponentialJitter.js +16 -0
- package/lib/commonjs/transport/http/endpoints.js +46 -0
- package/lib/commonjs/transport/http/httpClient.js +72 -0
- package/lib/commonjs/transport/rateLimit/retryAfter.js +2 -0
- package/lib/commonjs/transport/signing/requestSigner.js +2 -0
- package/lib/commonjs/vendor/protocol/index.js +327 -0
- package/lib/commonjs/vendor/protocol/internal/validation.js +429 -0
- package/lib/commonjs/vendor/sdk-contracts/bridge.js +2 -0
- package/lib/commonjs/vendor/sdk-contracts/config.js +2 -0
- package/lib/commonjs/vendor/sdk-contracts/events.js +2 -0
- package/lib/commonjs/vendor/sdk-contracts/features.js +2 -0
- package/lib/commonjs/vendor/sdk-contracts/index.js +2 -0
- package/lib/commonjs/vendor/sdk-contracts/platform.js +2 -0
- package/lib/commonjs/vendor/sdk-contracts/session-boundary.js +6 -0
- package/lib/commonjs/vendor/sdk-contracts/session.js +2 -0
- package/lib/commonjs/vendor/vendor.manifest +10 -0
- package/lib/module/analytics/EventTracker.js +592 -0
- package/lib/module/analytics/automaticEvents.js +63 -0
- package/lib/module/analytics/batching.js +55 -0
- package/lib/module/analytics/eventLane.js +47 -0
- package/lib/module/analytics/revenue.js +117 -0
- package/lib/module/analytics/subscription.js +86 -0
- package/lib/module/bootstrap/FeatureRegistry.js +79 -0
- package/lib/module/bootstrap/SDKBootstrapper.js +742 -0
- package/lib/module/bucketing/fnv1a32.js +37 -0
- package/lib/module/compat/codepush.js +147 -0
- package/lib/module/config/ConfigManager.js +230 -0
- package/lib/module/config/configTypes.js +10 -0
- package/lib/module/config/otaPolicyState.js +76 -0
- package/lib/module/config/quotaState.js +423 -0
- package/lib/module/core/architecture.js +38 -0
- package/lib/module/core/clock/now.js +7 -0
- package/lib/module/core/config/defaults.js +2 -0
- package/lib/module/core/config/schema.js +506 -0
- package/lib/module/core/constants/endpoints.js +13 -0
- package/lib/module/core/constants/protocol.js +25 -0
- package/lib/module/core/constants/timings.js +26 -0
- package/lib/module/core/constants/version.js +12 -0
- package/lib/module/core/context/app.js +2 -0
- package/lib/module/core/context/device.js +143 -0
- package/lib/module/core/context/session.js +2 -0
- package/lib/module/core/context/user.js +2 -0
- package/lib/module/core/contracts/IFeature.js +2 -0
- package/lib/module/core/di/container.js +22 -0
- package/lib/module/core/encoding/base64.js +44 -0
- package/lib/module/core/id/deviceId.js +45 -0
- package/lib/module/core/id/installationId.js +50 -0
- package/lib/module/core/id/sessionId.js +2 -0
- package/lib/module/core/lifecycle/appLifecycle.js +25 -0
- package/lib/module/core/lifecycle/crashSafe.js +26 -0
- package/lib/module/core/logger/errorClassification.js +96 -0
- package/lib/module/core/logger/internalLogger.js +59 -0
- package/lib/module/core/logger/levels.js +2 -0
- package/lib/module/crypto/hmacSha256.js +126 -0
- package/lib/module/debug/bootstrap.js +393 -0
- package/lib/module/debug/commands.js +726 -0
- package/lib/module/debug/configBuilder.js +63 -0
- package/lib/module/debug/exportBridge.js +148 -0
- package/lib/module/debug/hostResolver.js +37 -0
- package/lib/module/debug/index.js +13 -0
- package/lib/module/debug/metrics.js +33 -0
- package/lib/module/debug/perf.js +180 -0
- package/lib/module/debug/perfWiring.js +102 -0
- package/lib/module/debug/protocol.js +19 -0
- package/lib/module/debug/redaction.js +411 -0
- package/lib/module/debug/replayWiring.js +139 -0
- package/lib/module/debug/screenTracking.js +53 -0
- package/lib/module/debug/sessionWiring.js +43 -0
- package/lib/module/debug/stream.js +536 -0
- package/lib/module/debug/transport.js +362 -0
- package/lib/module/features/bugreport/BugReportFeature.js +105 -0
- package/lib/module/features/bugreport/buildPayload.js +91 -0
- package/lib/module/features/bugreport/index.js +2 -0
- package/lib/module/features/crash/CrashFeature.js +79 -0
- package/lib/module/features/crash/CrashReporter.js +151 -0
- package/lib/module/features/crash/NativeCrashFeature.js +36 -0
- package/lib/module/features/crash/capture.js +42 -0
- package/lib/module/features/crash/globalHandler.js +36 -0
- package/lib/module/features/crash/index.js +8 -0
- package/lib/module/features/crash/nativeCrashBridge.js +350 -0
- package/lib/module/features/crash/rejectionHandler.js +171 -0
- package/lib/module/features/crash/scrubCrash.js +149 -0
- package/lib/module/features/engage/EngageAnchor.js +121 -0
- package/lib/module/features/engage/EngageArchetypeRenderers.js +4264 -0
- package/lib/module/features/engage/EngageInAppView.js +2656 -0
- package/lib/module/features/engage/EngageInlinePlacement.js +123 -0
- package/lib/module/features/engage/EngagePromptProvider.js +1054 -0
- package/lib/module/features/engage/EngagePromptView.js +1243 -0
- package/lib/module/features/engage/EngageTransport.js +602 -0
- package/lib/module/features/engage/EngageVariantContent.js +1771 -0
- package/lib/module/features/engage/__test-support__/reactNativeStub.js +52 -0
- package/lib/module/features/engage/attachmentCapture.js +42 -0
- package/lib/module/features/engage/captureVoiceAttachment.js +80 -0
- package/lib/module/features/engage/engageCoachmarkTour.js +94 -0
- package/lib/module/features/engage/engageGameLogic.js +287 -0
- package/lib/module/features/engage/engageMediaSizing.js +51 -0
- package/lib/module/features/engage/engageMultiStepSheet.js +35 -0
- package/lib/module/features/engage/engageOutcome.js +108 -0
- package/lib/module/features/engage/engagePushTokenBridge.js +65 -0
- package/lib/module/features/engage/engageShakeBridge.js +56 -0
- package/lib/module/features/engage/engageSignals.js +34 -0
- package/lib/module/features/engage/engageStoreReviewBridge.js +43 -0
- package/lib/module/features/engage/engageTestSeenStore.js +92 -0
- package/lib/module/features/engage/engageThrottle.js +390 -0
- package/lib/module/features/engage/engageTriggerEngine.js +360 -0
- package/lib/module/features/engage/engageTypes.js +110 -0
- package/lib/module/features/engage/engageVariantResolver.js +135 -0
- package/lib/module/features/engage/engageWindowInsets.js +89 -0
- package/lib/module/features/engage/gestureTriggerDetector.js +80 -0
- package/lib/module/features/engage/transcription/TranscriptionProvider.js +46 -0
- package/lib/module/features/install-referrer/installReferrer.js +104 -0
- package/lib/module/features/journey/ScaleBunDebugRoot.js +1030 -0
- package/lib/module/features/journey/ScaleBunFlatList.js +32 -0
- package/lib/module/features/journey/ScaleBunImpression.js +105 -0
- package/lib/module/features/journey/ScaleBunScrollView.js +95 -0
- package/lib/module/features/journey/ScaleBunSectionList.js +32 -0
- package/lib/module/features/journey/autoInstrumentScroll.js +155 -0
- package/lib/module/features/journey/calibrationContext.js +35 -0
- package/lib/module/features/journey/gestureBuffer.js +56 -0
- package/lib/module/features/journey/gestureDetector.js +169 -0
- package/lib/module/features/journey/impression.js +84 -0
- package/lib/module/features/journey/interactionProtocol.js +158 -0
- package/lib/module/features/journey/journeyManager.js +459 -0
- package/lib/module/features/journey/journeyTypes.js +49 -0
- package/lib/module/features/journey/nativeScroll.js +77 -0
- package/lib/module/features/journey/navDetector.js +154 -0
- package/lib/module/features/journey/screenshotHelper.js +129 -0
- package/lib/module/features/journey/scrollContext.js +142 -0
- package/lib/module/features/journey/targetGeometry.js +175 -0
- package/lib/module/features/journey/targetRegistry.js +44 -0
- package/lib/module/features/journey/touchTarget.js +241 -0
- package/lib/module/features/journey/uiState.js +176 -0
- package/lib/module/features/navigation/AutoScreenDetector.js +601 -0
- package/lib/module/features/network/NetworkFeature.js +209 -0
- package/lib/module/features/network/index.js +17 -0
- package/lib/module/features/network/thirdParty.js +142 -0
- package/lib/module/features/ota/OtaEventEmitter.js +123 -0
- package/lib/module/features/ota/OtaOrchestrator.js +1302 -0
- package/lib/module/features/ota/OtaTypes.js +2 -0
- package/lib/module/features/ota/deviceAttributes.js +43 -0
- package/lib/module/features/ota/environment.js +165 -0
- package/lib/module/features/ota/geoCountry.js +86 -0
- package/lib/module/features/ota/retry.js +87 -0
- package/lib/module/features/ota/signedDownload.js +174 -0
- package/lib/module/features/ota/useOtaUpdate.js +100 -0
- package/lib/module/features/performance/PerformanceFeature.js +643 -0
- package/lib/module/features/performance/collectors/AppLaunchCollector.js +115 -0
- package/lib/module/features/performance/collectors/AutoScreenLoadCollector.js +225 -0
- package/lib/module/features/performance/collectors/CustomTraceCollector.js +92 -0
- package/lib/module/features/performance/collectors/FrameMetricsCollector.js +177 -0
- package/lib/module/features/performance/collectors/JsStallCollector.js +158 -0
- package/lib/module/features/performance/collectors/NetworkPerfCollector.js +52 -0
- package/lib/module/features/performance/collectors/ScreenLoadCollector.js +71 -0
- package/lib/module/features/performance/collectors/UiHangCollector.js +71 -0
- package/lib/module/features/performance/config.js +51 -0
- package/lib/module/features/performance/getNativePerformanceModule.js +39 -0
- package/lib/module/features/performance/index.js +9 -0
- package/lib/module/features/performance/metrics/MetricsEngine.js +139 -0
- package/lib/module/features/performance/models.js +42 -0
- package/lib/module/features/performance/transport/PerformanceTransport.js +162 -0
- package/lib/module/features/profiler/ProfilerFeature.js +594 -0
- package/lib/module/features/profiler/config.js +143 -0
- package/lib/module/features/profiler/contracts.js +56 -0
- package/lib/module/features/profiler/index.js +11 -0
- package/lib/module/features/profiler/models.js +106 -0
- package/lib/module/features/profiler/transport/ProfilerTransport.js +87 -0
- package/lib/module/features/replay/bridge/adapters/bridgeAdapter.js +198 -0
- package/lib/module/features/replay/bridge/eventEmitter.js +122 -0
- package/lib/module/features/replay/bridge/nativeModule.js +89 -0
- package/lib/module/features/replay/bridge/nativeQuota.js +109 -0
- package/lib/module/features/replay/core/clock/clock.js +37 -0
- package/lib/module/features/replay/core/config/defaults.js +82 -0
- package/lib/module/features/replay/core/config/validator.js +103 -0
- package/lib/module/features/replay/core/env/environmentDetector.js +22 -0
- package/lib/module/features/replay/core/errors/safeCall.js +35 -0
- package/lib/module/features/replay/core/ids/sessionId.js +44 -0
- package/lib/module/features/replay/core/logger/logger.js +29 -0
- package/lib/module/features/replay/core/privacy/privacyTypes.js +27 -0
- package/lib/module/features/replay/core/queue/boundedQueue.js +64 -0
- package/lib/module/features/replay/integrations/alert/alertInstrumentation.js +252 -0
- package/lib/module/features/replay/integrations/logs/consoleIntegration.js +131 -0
- package/lib/module/features/replay/integrations/network/networkAdapter.js +70 -0
- package/lib/module/features/replay/integrations/react-navigation/navigationIntegration.js +82 -0
- package/lib/module/features/replay/integrations/touch/ReplayRoot.js +96 -0
- package/lib/module/features/replay/pipeline/batching/batchManager.js +113 -0
- package/lib/module/features/replay/pipeline/envelope/envelopeBuilder.js +43 -0
- package/lib/module/features/replay/pipeline/retry/retryPolicy.js +45 -0
- package/lib/module/features/replay/pipeline/transport/transportTypes.js +60 -0
- package/lib/module/features/replay/public/api.js +332 -0
- package/lib/module/features/replay/public/enums.js +85 -0
- package/lib/module/features/replay/public/types.js +2 -0
- package/lib/module/features/replay/replay/breadcrumbs/breadcrumbCollector.js +113 -0
- package/lib/module/features/replay/replay/frames/frameModels.js +33 -0
- package/lib/module/features/replay/replay/session/sessionOrchestrator.js +272 -0
- package/lib/module/features/replay/replay/timeline/timelineModels.js +108 -0
- package/lib/module/features/replay/transport/BackendReplayTransport.js +169 -0
- package/lib/module/features/replay/transport/CompositeReplayTransport.js +68 -0
- package/lib/module/features/replay/transport/DesktopReplayTransport.js +119 -0
- package/lib/module/features/replay/transport/ReplayTransport.js +2 -0
- package/lib/module/features/session/BackendSessionAdapter.js +1908 -0
- package/lib/module/features/session/DesktopSessionTransport.js +118 -0
- package/lib/module/features/session/JourneyEventPipeline.js +239 -0
- package/lib/module/features/session/ReplayCaptureManager.js +1248 -0
- package/lib/module/features/session/ScrollTracker.js +141 -0
- package/lib/module/features/session/SessionManager.js +1443 -0
- package/lib/module/features/session/SyncDecisionEngine.js +88 -0
- package/lib/module/features/session/frameLink.js +29 -0
- package/lib/module/features/session/frameScrollState.js +34 -0
- package/lib/module/features/session/index.js +35 -0
- package/lib/module/features/session/nativeCapture.js +45 -0
- package/lib/module/features/session/outboxFrameCapture.js +77 -0
- package/lib/module/features/session/sessionTypes.js +226 -0
- package/lib/module/features/session/viewportPlausibility.js +137 -0
- package/lib/module/features/skan/skanBridge.js +48 -0
- package/lib/module/features/skan/skanConversionManager.js +128 -0
- package/lib/module/index.js +80 -0
- package/lib/module/integrations/fetch/fetchInterceptor.js +169 -0
- package/lib/module/integrations/navigation/screenTracker.js +2 -0
- package/lib/module/integrations/network/bodyCapture.js +320 -0
- package/lib/module/integrations/xhr/xhrInterceptor.js +219 -0
- package/lib/module/metro/composeSourceMap.js +97 -0
- package/lib/module/metro/featureModules.js +123 -0
- package/lib/module/metro/index.js +218 -0
- package/lib/module/metro/optionalDependencyStub.js +14 -0
- package/lib/module/metro/optionalModules.js +25 -0
- package/lib/module/metro/serializerCompose.js +152 -0
- package/lib/module/pipeline/dispatcher/dispatcher.js +21 -0
- package/lib/module/pipeline/envelope/envelope.js +11 -0
- package/lib/module/pipeline/envelope/serializer.js +8 -0
- package/lib/module/pipeline/processors/dedupe.js +2 -0
- package/lib/module/pipeline/processors/enrich.js +10 -0
- package/lib/module/pipeline/processors/sampling.js +2 -0
- package/lib/module/pipeline/processors/sanitize.js +22 -0
- package/lib/module/pipeline/queue/flushQueue.js +102 -0
- package/lib/module/pipeline/queue/memoryQueue.js +24 -0
- package/lib/module/pipeline/queue/persistentQueue.js +336 -0
- package/lib/module/pipeline/queue/queuePolicy.js +2 -0
- package/lib/module/pipeline/scheduler/flushScheduler.js +38 -0
- package/lib/module/pipeline/scheduler/retryPolicy.js +9 -0
- package/lib/module/public/ScaleBunErrorBoundary.js +82 -0
- package/lib/module/public/ScaleBunFacade.js +2038 -0
- package/lib/module/public/ScaleBunProvider.js +54 -0
- package/lib/module/public/typedTracker.js +72 -0
- package/lib/module/public/types.js +2 -0
- package/lib/module/push/PushManager.js +263 -0
- package/lib/module/push/adapters/ManualAdapter.js +79 -0
- package/lib/module/push/adapters/NativeBridgeAdapter.js +124 -0
- package/lib/module/push/adapters/NoopAdapter.js +38 -0
- package/lib/module/push/adapters/RNFirebaseMessagingAdapter.js +241 -0
- package/lib/module/push/adapters/loadMessaging.js +23 -0
- package/lib/module/push/adapters/loadNotifee.js +30 -0
- package/lib/module/push/adapters/selectAdapter.js +147 -0
- package/lib/module/push/detect/capabilities.js +130 -0
- package/lib/module/push/index.js +9 -0
- package/lib/module/push/native/nativeNotifications.js +155 -0
- package/lib/module/push/types.js +2 -0
- package/lib/module/specs/NativeReplaySdk.js +24 -0
- package/lib/module/specs/NativeScaleBunCrash.js +26 -0
- package/lib/module/specs/NativeScaleBunInstallReferrer.js +20 -0
- package/lib/module/specs/NativeScaleBunOta.js +28 -0
- package/lib/module/specs/NativeScaleBunPerformance.js +21 -0
- package/lib/module/specs/NativeScaleBunProfiler.js +22 -0
- package/lib/module/specs/NativeScaleBunStorage.js +36 -0
- package/lib/module/storage/StorageBackend.js +231 -0
- package/lib/module/storage/db/sqlite.js +2 -0
- package/lib/module/storage/files/fileStore.js +2 -0
- package/lib/module/transport/auth/sdkSession.js +21 -0
- package/lib/module/transport/backoff/exponentialJitter.js +10 -0
- package/lib/module/transport/http/endpoints.js +40 -0
- package/lib/module/transport/http/httpClient.js +64 -0
- package/lib/module/transport/rateLimit/retryAfter.js +2 -0
- package/lib/module/transport/signing/requestSigner.js +2 -0
- package/lib/module/vendor/protocol/index.js +312 -0
- package/lib/module/vendor/protocol/internal/validation.js +423 -0
- package/lib/module/vendor/sdk-contracts/bridge.js +2 -0
- package/lib/module/vendor/sdk-contracts/config.js +2 -0
- package/lib/module/vendor/sdk-contracts/events.js +2 -0
- package/lib/module/vendor/sdk-contracts/features.js +2 -0
- package/lib/module/vendor/sdk-contracts/index.js +2 -0
- package/lib/module/vendor/sdk-contracts/platform.js +2 -0
- package/lib/module/vendor/sdk-contracts/session-boundary.js +2 -0
- package/lib/module/vendor/sdk-contracts/session.js +2 -0
- package/lib/module/vendor/vendor.manifest +10 -0
- package/lib/typescript/analytics/EventTracker.d.ts +197 -0
- package/lib/typescript/analytics/automaticEvents.d.ts +30 -0
- package/lib/typescript/analytics/batching.d.ts +33 -0
- package/lib/typescript/analytics/eventLane.d.ts +22 -0
- package/lib/typescript/analytics/revenue.d.ts +94 -0
- package/lib/typescript/analytics/subscription.d.ts +35 -0
- package/lib/typescript/bootstrap/FeatureRegistry.d.ts +36 -0
- package/lib/typescript/bootstrap/SDKBootstrapper.d.ts +82 -0
- package/lib/typescript/bucketing/fnv1a32.d.ts +20 -0
- package/lib/typescript/compat/codepush.d.ts +76 -0
- package/lib/typescript/config/ConfigManager.d.ts +82 -0
- package/lib/typescript/config/configTypes.d.ts +73 -0
- package/lib/typescript/config/otaPolicyState.d.ts +55 -0
- package/lib/typescript/config/quotaState.d.ts +155 -0
- package/lib/typescript/core/architecture.d.ts +29 -0
- package/lib/typescript/core/clock/now.d.ts +5 -0
- package/lib/typescript/core/config/defaults.d.ts +1 -0
- package/lib/typescript/core/config/schema.d.ts +107 -0
- package/lib/typescript/core/constants/endpoints.d.ts +13 -0
- package/lib/typescript/core/constants/protocol.d.ts +23 -0
- package/lib/typescript/core/constants/timings.d.ts +22 -0
- package/lib/typescript/core/constants/version.d.ts +12 -0
- package/lib/typescript/core/context/app.d.ts +1 -0
- package/lib/typescript/core/context/device.d.ts +61 -0
- package/lib/typescript/core/context/session.d.ts +1 -0
- package/lib/typescript/core/context/user.d.ts +24 -0
- package/lib/typescript/core/contracts/IFeature.d.ts +44 -0
- package/lib/typescript/core/di/container.d.ts +9 -0
- package/lib/typescript/core/encoding/base64.d.ts +13 -0
- package/lib/typescript/core/id/deviceId.d.ts +9 -0
- package/lib/typescript/core/id/installationId.d.ts +20 -0
- package/lib/typescript/core/id/sessionId.d.ts +1 -0
- package/lib/typescript/core/lifecycle/appLifecycle.d.ts +14 -0
- package/lib/typescript/core/lifecycle/crashSafe.d.ts +7 -0
- package/lib/typescript/core/logger/errorClassification.d.ts +46 -0
- package/lib/typescript/core/logger/internalLogger.d.ts +24 -0
- package/lib/typescript/core/logger/levels.d.ts +1 -0
- package/lib/typescript/crypto/hmacSha256.d.ts +10 -0
- package/lib/typescript/debug/bootstrap.d.ts +148 -0
- package/lib/typescript/debug/commands.d.ts +77 -0
- package/lib/typescript/debug/configBuilder.d.ts +13 -0
- package/lib/typescript/debug/exportBridge.d.ts +27 -0
- package/lib/typescript/debug/hostResolver.d.ts +14 -0
- package/lib/typescript/debug/index.d.ts +12 -0
- package/lib/typescript/debug/metrics.d.ts +2 -0
- package/lib/typescript/debug/perf.d.ts +43 -0
- package/lib/typescript/debug/perfWiring.d.ts +33 -0
- package/lib/typescript/debug/protocol.d.ts +15 -0
- package/lib/typescript/debug/redaction.d.ts +69 -0
- package/lib/typescript/debug/replayWiring.d.ts +25 -0
- package/lib/typescript/debug/screenTracking.d.ts +16 -0
- package/lib/typescript/debug/sessionWiring.d.ts +16 -0
- package/lib/typescript/debug/stream.d.ts +77 -0
- package/lib/typescript/debug/transport.d.ts +110 -0
- package/lib/typescript/features/bugreport/BugReportFeature.d.ts +59 -0
- package/lib/typescript/features/bugreport/buildPayload.d.ts +51 -0
- package/lib/typescript/features/bugreport/index.d.ts +1 -0
- package/lib/typescript/features/crash/CrashFeature.d.ts +21 -0
- package/lib/typescript/features/crash/CrashReporter.d.ts +107 -0
- package/lib/typescript/features/crash/NativeCrashFeature.d.ts +17 -0
- package/lib/typescript/features/crash/capture.d.ts +22 -0
- package/lib/typescript/features/crash/globalHandler.d.ts +14 -0
- package/lib/typescript/features/crash/index.d.ts +2 -0
- package/lib/typescript/features/crash/nativeCrashBridge.d.ts +43 -0
- package/lib/typescript/features/crash/rejectionHandler.d.ts +65 -0
- package/lib/typescript/features/crash/scrubCrash.d.ts +35 -0
- package/lib/typescript/features/engage/EngageAnchor.d.ts +36 -0
- package/lib/typescript/features/engage/EngageArchetypeRenderers.d.ts +66 -0
- package/lib/typescript/features/engage/EngageInAppView.d.ts +164 -0
- package/lib/typescript/features/engage/EngageInlinePlacement.d.ts +42 -0
- package/lib/typescript/features/engage/EngagePromptProvider.d.ts +233 -0
- package/lib/typescript/features/engage/EngagePromptView.d.ts +97 -0
- package/lib/typescript/features/engage/EngageTransport.d.ts +158 -0
- package/lib/typescript/features/engage/EngageVariantContent.d.ts +12 -0
- package/lib/typescript/features/engage/attachmentCapture.d.ts +17 -0
- package/lib/typescript/features/engage/captureVoiceAttachment.d.ts +31 -0
- package/lib/typescript/features/engage/engageCoachmarkTour.d.ts +18 -0
- package/lib/typescript/features/engage/engageGameLogic.d.ts +34 -0
- package/lib/typescript/features/engage/engageMediaSizing.d.ts +23 -0
- package/lib/typescript/features/engage/engageMultiStepSheet.d.ts +25 -0
- package/lib/typescript/features/engage/engageOutcome.d.ts +38 -0
- package/lib/typescript/features/engage/engagePushTokenBridge.d.ts +30 -0
- package/lib/typescript/features/engage/engageShakeBridge.d.ts +20 -0
- package/lib/typescript/features/engage/engageSignals.d.ts +13 -0
- package/lib/typescript/features/engage/engageStoreReviewBridge.d.ts +23 -0
- package/lib/typescript/features/engage/engageTestSeenStore.d.ts +46 -0
- package/lib/typescript/features/engage/engageThrottle.d.ts +180 -0
- package/lib/typescript/features/engage/engageTriggerEngine.d.ts +16 -0
- package/lib/typescript/features/engage/engageTypes.d.ts +576 -0
- package/lib/typescript/features/engage/engageVariantResolver.d.ts +46 -0
- package/lib/typescript/features/engage/engageWindowInsets.d.ts +25 -0
- package/lib/typescript/features/engage/gestureTriggerDetector.d.ts +20 -0
- package/lib/typescript/features/engage/transcription/TranscriptionProvider.d.ts +51 -0
- package/lib/typescript/features/install-referrer/installReferrer.d.ts +39 -0
- package/lib/typescript/features/journey/ScaleBunDebugRoot.d.ts +49 -0
- package/lib/typescript/features/journey/ScaleBunFlatList.d.ts +20 -0
- package/lib/typescript/features/journey/ScaleBunImpression.d.ts +30 -0
- package/lib/typescript/features/journey/ScaleBunScrollView.d.ts +25 -0
- package/lib/typescript/features/journey/ScaleBunSectionList.d.ts +20 -0
- package/lib/typescript/features/journey/autoInstrumentScroll.d.ts +46 -0
- package/lib/typescript/features/journey/calibrationContext.d.ts +26 -0
- package/lib/typescript/features/journey/gestureBuffer.d.ts +27 -0
- package/lib/typescript/features/journey/gestureDetector.d.ts +40 -0
- package/lib/typescript/features/journey/impression.d.ts +48 -0
- package/lib/typescript/features/journey/interactionProtocol.d.ts +159 -0
- package/lib/typescript/features/journey/journeyManager.d.ts +62 -0
- package/lib/typescript/features/journey/journeyTypes.d.ts +161 -0
- package/lib/typescript/features/journey/nativeScroll.d.ts +47 -0
- package/lib/typescript/features/journey/navDetector.d.ts +42 -0
- package/lib/typescript/features/journey/screenshotHelper.d.ts +33 -0
- package/lib/typescript/features/journey/scrollContext.d.ts +49 -0
- package/lib/typescript/features/journey/targetGeometry.d.ts +126 -0
- package/lib/typescript/features/journey/targetRegistry.d.ts +28 -0
- package/lib/typescript/features/journey/touchTarget.d.ts +174 -0
- package/lib/typescript/features/journey/uiState.d.ts +93 -0
- package/lib/typescript/features/navigation/AutoScreenDetector.d.ts +196 -0
- package/lib/typescript/features/network/NetworkFeature.d.ts +43 -0
- package/lib/typescript/features/network/index.d.ts +46 -0
- package/lib/typescript/features/network/thirdParty.d.ts +95 -0
- package/lib/typescript/features/ota/OtaEventEmitter.d.ts +93 -0
- package/lib/typescript/features/ota/OtaOrchestrator.d.ts +287 -0
- package/lib/typescript/features/ota/OtaTypes.d.ts +193 -0
- package/lib/typescript/features/ota/deviceAttributes.d.ts +18 -0
- package/lib/typescript/features/ota/environment.d.ts +99 -0
- package/lib/typescript/features/ota/geoCountry.d.ts +14 -0
- package/lib/typescript/features/ota/retry.d.ts +53 -0
- package/lib/typescript/features/ota/signedDownload.d.ts +81 -0
- package/lib/typescript/features/ota/useOtaUpdate.d.ts +72 -0
- package/lib/typescript/features/performance/PerformanceFeature.d.ts +132 -0
- package/lib/typescript/features/performance/collectors/AppLaunchCollector.d.ts +27 -0
- package/lib/typescript/features/performance/collectors/AutoScreenLoadCollector.d.ts +70 -0
- package/lib/typescript/features/performance/collectors/CustomTraceCollector.d.ts +35 -0
- package/lib/typescript/features/performance/collectors/FrameMetricsCollector.d.ts +74 -0
- package/lib/typescript/features/performance/collectors/JsStallCollector.d.ts +45 -0
- package/lib/typescript/features/performance/collectors/NetworkPerfCollector.d.ts +23 -0
- package/lib/typescript/features/performance/collectors/ScreenLoadCollector.d.ts +30 -0
- package/lib/typescript/features/performance/collectors/UiHangCollector.d.ts +21 -0
- package/lib/typescript/features/performance/config.d.ts +73 -0
- package/lib/typescript/features/performance/getNativePerformanceModule.d.ts +2 -0
- package/lib/typescript/features/performance/index.d.ts +10 -0
- package/lib/typescript/features/performance/metrics/MetricsEngine.d.ts +69 -0
- package/lib/typescript/features/performance/models.d.ts +169 -0
- package/lib/typescript/features/performance/transport/PerformanceTransport.d.ts +40 -0
- package/lib/typescript/features/profiler/ProfilerFeature.d.ts +92 -0
- package/lib/typescript/features/profiler/config.d.ts +85 -0
- package/lib/typescript/features/profiler/contracts.d.ts +142 -0
- package/lib/typescript/features/profiler/index.d.ts +13 -0
- package/lib/typescript/features/profiler/models.d.ts +332 -0
- package/lib/typescript/features/profiler/transport/ProfilerTransport.d.ts +30 -0
- package/lib/typescript/features/replay/bridge/adapters/bridgeAdapter.d.ts +52 -0
- package/lib/typescript/features/replay/bridge/eventEmitter.d.ts +100 -0
- package/lib/typescript/features/replay/bridge/nativeModule.d.ts +166 -0
- package/lib/typescript/features/replay/bridge/nativeQuota.d.ts +26 -0
- package/lib/typescript/features/replay/core/clock/clock.d.ts +16 -0
- package/lib/typescript/features/replay/core/config/defaults.d.ts +28 -0
- package/lib/typescript/features/replay/core/config/validator.d.ts +13 -0
- package/lib/typescript/features/replay/core/env/environmentDetector.d.ts +14 -0
- package/lib/typescript/features/replay/core/errors/safeCall.d.ts +12 -0
- package/lib/typescript/features/replay/core/ids/sessionId.d.ts +15 -0
- package/lib/typescript/features/replay/core/logger/logger.d.ts +15 -0
- package/lib/typescript/features/replay/core/privacy/privacyTypes.d.ts +24 -0
- package/lib/typescript/features/replay/core/queue/boundedQueue.d.ts +29 -0
- package/lib/typescript/features/replay/integrations/alert/alertInstrumentation.d.ts +48 -0
- package/lib/typescript/features/replay/integrations/logs/consoleIntegration.d.ts +18 -0
- package/lib/typescript/features/replay/integrations/network/networkAdapter.d.ts +31 -0
- package/lib/typescript/features/replay/integrations/react-navigation/navigationIntegration.d.ts +25 -0
- package/lib/typescript/features/replay/integrations/touch/ReplayRoot.d.ts +26 -0
- package/lib/typescript/features/replay/pipeline/batching/batchManager.d.ts +47 -0
- package/lib/typescript/features/replay/pipeline/envelope/envelopeBuilder.d.ts +12 -0
- package/lib/typescript/features/replay/pipeline/retry/retryPolicy.d.ts +17 -0
- package/lib/typescript/features/replay/pipeline/transport/transportTypes.d.ts +40 -0
- package/lib/typescript/features/replay/public/api.d.ts +83 -0
- package/lib/typescript/features/replay/public/enums.d.ts +73 -0
- package/lib/typescript/features/replay/public/types.d.ts +249 -0
- package/lib/typescript/features/replay/replay/breadcrumbs/breadcrumbCollector.d.ts +26 -0
- package/lib/typescript/features/replay/replay/frames/frameModels.d.ts +23 -0
- package/lib/typescript/features/replay/replay/session/sessionOrchestrator.d.ts +53 -0
- package/lib/typescript/features/replay/replay/timeline/timelineModels.d.ts +29 -0
- package/lib/typescript/features/replay/transport/BackendReplayTransport.d.ts +45 -0
- package/lib/typescript/features/replay/transport/CompositeReplayTransport.d.ts +22 -0
- package/lib/typescript/features/replay/transport/DesktopReplayTransport.d.ts +35 -0
- package/lib/typescript/features/replay/transport/ReplayTransport.d.ts +72 -0
- package/lib/typescript/features/session/BackendSessionAdapter.d.ts +528 -0
- package/lib/typescript/features/session/DesktopSessionTransport.d.ts +28 -0
- package/lib/typescript/features/session/JourneyEventPipeline.d.ts +74 -0
- package/lib/typescript/features/session/ReplayCaptureManager.d.ts +391 -0
- package/lib/typescript/features/session/ScrollTracker.d.ts +48 -0
- package/lib/typescript/features/session/SessionManager.d.ts +414 -0
- package/lib/typescript/features/session/SyncDecisionEngine.d.ts +33 -0
- package/lib/typescript/features/session/frameLink.d.ts +27 -0
- package/lib/typescript/features/session/frameScrollState.d.ts +27 -0
- package/lib/typescript/features/session/index.d.ts +23 -0
- package/lib/typescript/features/session/nativeCapture.d.ts +18 -0
- package/lib/typescript/features/session/outboxFrameCapture.d.ts +20 -0
- package/lib/typescript/features/session/sessionTypes.d.ts +362 -0
- package/lib/typescript/features/session/viewportPlausibility.d.ts +72 -0
- package/lib/typescript/features/skan/skanBridge.d.ts +18 -0
- package/lib/typescript/features/skan/skanConversionManager.d.ts +69 -0
- package/lib/typescript/index.d.ts +59 -0
- package/lib/typescript/integrations/fetch/fetchInterceptor.d.ts +41 -0
- package/lib/typescript/integrations/navigation/screenTracker.d.ts +1 -0
- package/lib/typescript/integrations/network/bodyCapture.d.ts +101 -0
- package/lib/typescript/integrations/xhr/xhrInterceptor.d.ts +46 -0
- package/lib/typescript/metro/composeSourceMap.d.ts +26 -0
- package/lib/typescript/metro/featureModules.d.ts +49 -0
- package/lib/typescript/metro/index.d.ts +99 -0
- package/lib/typescript/metro/optionalDependencyStub.d.ts +14 -0
- package/lib/typescript/metro/optionalModules.d.ts +20 -0
- package/lib/typescript/metro/serializerCompose.d.ts +46 -0
- package/lib/typescript/pipeline/dispatcher/dispatcher.d.ts +7 -0
- package/lib/typescript/pipeline/envelope/envelope.d.ts +16 -0
- package/lib/typescript/pipeline/envelope/serializer.d.ts +7 -0
- package/lib/typescript/pipeline/processors/dedupe.d.ts +1 -0
- package/lib/typescript/pipeline/processors/enrich.d.ts +3 -0
- package/lib/typescript/pipeline/processors/sampling.d.ts +1 -0
- package/lib/typescript/pipeline/processors/sanitize.d.ts +3 -0
- package/lib/typescript/pipeline/queue/flushQueue.d.ts +12 -0
- package/lib/typescript/pipeline/queue/memoryQueue.d.ts +12 -0
- package/lib/typescript/pipeline/queue/persistentQueue.d.ts +120 -0
- package/lib/typescript/pipeline/queue/queuePolicy.d.ts +1 -0
- package/lib/typescript/pipeline/scheduler/flushScheduler.d.ts +9 -0
- package/lib/typescript/pipeline/scheduler/retryPolicy.d.ts +5 -0
- package/lib/typescript/public/ScaleBunErrorBoundary.d.ts +44 -0
- package/lib/typescript/public/ScaleBunFacade.d.ts +800 -0
- package/lib/typescript/public/ScaleBunProvider.d.ts +23 -0
- package/lib/typescript/public/typedTracker.d.ts +88 -0
- package/lib/typescript/public/types.d.ts +316 -0
- package/lib/typescript/push/PushManager.d.ts +69 -0
- package/lib/typescript/push/adapters/ManualAdapter.d.ts +40 -0
- package/lib/typescript/push/adapters/NativeBridgeAdapter.d.ts +37 -0
- package/lib/typescript/push/adapters/NoopAdapter.d.ts +21 -0
- package/lib/typescript/push/adapters/RNFirebaseMessagingAdapter.d.ts +39 -0
- package/lib/typescript/push/adapters/loadMessaging.d.ts +17 -0
- package/lib/typescript/push/adapters/loadNotifee.d.ts +15 -0
- package/lib/typescript/push/adapters/selectAdapter.d.ts +20 -0
- package/lib/typescript/push/detect/capabilities.d.ts +15 -0
- package/lib/typescript/push/index.d.ts +10 -0
- package/lib/typescript/push/native/nativeNotifications.d.ts +65 -0
- package/lib/typescript/push/types.d.ts +143 -0
- package/lib/typescript/specs/NativeReplaySdk.d.ts +69 -0
- package/lib/typescript/specs/NativeScaleBunCrash.d.ts +58 -0
- package/lib/typescript/specs/NativeScaleBunInstallReferrer.d.ts +28 -0
- package/lib/typescript/specs/NativeScaleBunOta.d.ts +141 -0
- package/lib/typescript/specs/NativeScaleBunPerformance.d.ts +31 -0
- package/lib/typescript/specs/NativeScaleBunProfiler.d.ts +38 -0
- package/lib/typescript/specs/NativeScaleBunStorage.d.ts +55 -0
- package/lib/typescript/storage/StorageBackend.d.ts +131 -0
- package/lib/typescript/storage/db/sqlite.d.ts +1 -0
- package/lib/typescript/storage/files/fileStore.d.ts +1 -0
- package/lib/typescript/transport/auth/sdkSession.d.ts +10 -0
- package/lib/typescript/transport/backoff/exponentialJitter.d.ts +5 -0
- package/lib/typescript/transport/http/endpoints.d.ts +26 -0
- package/lib/typescript/transport/http/httpClient.d.ts +23 -0
- package/lib/typescript/transport/rateLimit/retryAfter.d.ts +1 -0
- package/lib/typescript/transport/signing/requestSigner.d.ts +1 -0
- package/lib/typescript/vendor/protocol/index.d.ts +345 -0
- package/lib/typescript/vendor/protocol/internal/validation.d.ts +114 -0
- package/lib/typescript/vendor/sdk-contracts/bridge.d.ts +104 -0
- package/lib/typescript/vendor/sdk-contracts/config.d.ts +156 -0
- package/lib/typescript/vendor/sdk-contracts/events.d.ts +42 -0
- package/lib/typescript/vendor/sdk-contracts/features.d.ts +38 -0
- package/lib/typescript/vendor/sdk-contracts/index.d.ts +15 -0
- package/lib/typescript/vendor/sdk-contracts/platform.d.ts +35 -0
- package/lib/typescript/vendor/sdk-contracts/session-boundary.d.ts +42 -0
- package/lib/typescript/vendor/sdk-contracts/session.d.ts +157 -0
- package/package.json +153 -0
- package/react-native.config.js +24 -0
- package/scalebun-react-native.podspec +44 -0
- package/src/analytics/EventTracker.ts +654 -0
- package/src/analytics/automaticEvents.ts +109 -0
- package/src/analytics/batching.ts +54 -0
- package/src/analytics/eventLane.ts +48 -0
- package/src/analytics/revenue.ts +143 -0
- package/src/analytics/subscription.ts +145 -0
- package/src/bootstrap/FeatureRegistry.ts +81 -0
- package/src/bootstrap/SDKBootstrapper.ts +769 -0
- package/src/bucketing/fnv1a32.ts +40 -0
- package/src/compat/codepush.ts +189 -0
- package/src/config/ConfigManager.ts +233 -0
- package/src/config/configTypes.ts +62 -0
- package/src/config/otaPolicyState.ts +79 -0
- package/src/config/quotaState.ts +484 -0
- package/src/core/architecture.ts +39 -0
- package/src/core/clock/now.ts +6 -0
- package/src/core/config/defaults.ts +0 -0
- package/src/core/config/schema.ts +455 -0
- package/src/core/constants/endpoints.ts +12 -0
- package/src/core/constants/protocol.ts +24 -0
- package/src/core/constants/timings.ts +25 -0
- package/src/core/constants/version.ts +11 -0
- package/src/core/context/app.ts +0 -0
- package/src/core/context/device.ts +169 -0
- package/src/core/context/session.ts +0 -0
- package/src/core/context/user.ts +26 -0
- package/src/core/contracts/IFeature.ts +53 -0
- package/src/core/di/container.ts +26 -0
- package/src/core/encoding/base64.ts +46 -0
- package/src/core/id/deviceId.ts +51 -0
- package/src/core/id/installationId.ts +52 -0
- package/src/core/id/sessionId.ts +0 -0
- package/src/core/lifecycle/appLifecycle.ts +33 -0
- package/src/core/lifecycle/crashSafe.ts +29 -0
- package/src/core/logger/errorClassification.ts +108 -0
- package/src/core/logger/internalLogger.ts +65 -0
- package/src/core/logger/levels.ts +0 -0
- package/src/crypto/hmacSha256.ts +106 -0
- package/src/debug/bootstrap.ts +436 -0
- package/src/debug/commands.ts +597 -0
- package/src/debug/configBuilder.ts +56 -0
- package/src/debug/exportBridge.ts +155 -0
- package/src/debug/hostResolver.ts +34 -0
- package/src/debug/index.ts +25 -0
- package/src/debug/metrics.ts +29 -0
- package/src/debug/perf.ts +212 -0
- package/src/debug/perfWiring.ts +119 -0
- package/src/debug/protocol.ts +58 -0
- package/src/debug/redaction.ts +483 -0
- package/src/debug/replayWiring.ts +148 -0
- package/src/debug/screenTracking.ts +55 -0
- package/src/debug/sessionWiring.ts +59 -0
- package/src/debug/stream.ts +561 -0
- package/src/debug/transport.ts +440 -0
- package/src/features/bugreport/BugReportFeature.ts +128 -0
- package/src/features/bugreport/buildPayload.ts +116 -0
- package/src/features/bugreport/index.ts +0 -0
- package/src/features/crash/CrashFeature.ts +87 -0
- package/src/features/crash/CrashReporter.ts +189 -0
- package/src/features/crash/NativeCrashFeature.ts +42 -0
- package/src/features/crash/capture.ts +48 -0
- package/src/features/crash/globalHandler.ts +39 -0
- package/src/features/crash/index.ts +8 -0
- package/src/features/crash/nativeCrashBridge.ts +352 -0
- package/src/features/crash/rejectionHandler.ts +196 -0
- package/src/features/crash/scrubCrash.ts +175 -0
- package/src/features/engage/EngageAnchor.tsx +159 -0
- package/src/features/engage/EngageArchetypeRenderers.tsx +3705 -0
- package/src/features/engage/EngageInAppView.tsx +2678 -0
- package/src/features/engage/EngageInlinePlacement.tsx +169 -0
- package/src/features/engage/EngagePromptProvider.tsx +1318 -0
- package/src/features/engage/EngagePromptView.tsx +1400 -0
- package/src/features/engage/EngageTransport.ts +668 -0
- package/src/features/engage/EngageVariantContent.tsx +1483 -0
- package/src/features/engage/__test-support__/reactNativeStub.js +40 -0
- package/src/features/engage/attachmentCapture.ts +45 -0
- package/src/features/engage/captureVoiceAttachment.ts +81 -0
- package/src/features/engage/engageCoachmarkTour.ts +120 -0
- package/src/features/engage/engageGameLogic.ts +347 -0
- package/src/features/engage/engageMediaSizing.ts +76 -0
- package/src/features/engage/engageMultiStepSheet.ts +53 -0
- package/src/features/engage/engageOutcome.ts +157 -0
- package/src/features/engage/engagePushTokenBridge.ts +84 -0
- package/src/features/engage/engageShakeBridge.ts +67 -0
- package/src/features/engage/engageSignals.ts +40 -0
- package/src/features/engage/engageStoreReviewBridge.ts +48 -0
- package/src/features/engage/engageTestSeenStore.ts +95 -0
- package/src/features/engage/engageThrottle.ts +478 -0
- package/src/features/engage/engageTriggerEngine.ts +350 -0
- package/src/features/engage/engageTypes.ts +712 -0
- package/src/features/engage/engageVariantResolver.ts +364 -0
- package/src/features/engage/engageWindowInsets.ts +108 -0
- package/src/features/engage/gestureTriggerDetector.ts +83 -0
- package/src/features/engage/transcription/TranscriptionProvider.ts +68 -0
- package/src/features/install-referrer/installReferrer.ts +112 -0
- package/src/features/journey/ScaleBunDebugRoot.tsx +1045 -0
- package/src/features/journey/ScaleBunFlatList.tsx +39 -0
- package/src/features/journey/ScaleBunImpression.tsx +109 -0
- package/src/features/journey/ScaleBunScrollView.tsx +101 -0
- package/src/features/journey/ScaleBunSectionList.tsx +39 -0
- package/src/features/journey/autoInstrumentScroll.ts +155 -0
- package/src/features/journey/calibrationContext.ts +44 -0
- package/src/features/journey/gestureBuffer.ts +59 -0
- package/src/features/journey/gestureDetector.ts +162 -0
- package/src/features/journey/impression.ts +92 -0
- package/src/features/journey/interactionProtocol.ts +243 -0
- package/src/features/journey/journeyManager.ts +469 -0
- package/src/features/journey/journeyTypes.ts +215 -0
- package/src/features/journey/nativeScroll.ts +94 -0
- package/src/features/journey/navDetector.ts +149 -0
- package/src/features/journey/screenshotHelper.ts +137 -0
- package/src/features/journey/scrollContext.ts +146 -0
- package/src/features/journey/targetGeometry.ts +197 -0
- package/src/features/journey/targetRegistry.ts +43 -0
- package/src/features/journey/touchTarget.ts +339 -0
- package/src/features/journey/uiState.ts +182 -0
- package/src/features/navigation/AutoScreenDetector.ts +617 -0
- package/src/features/network/NetworkFeature.ts +232 -0
- package/src/features/network/index.ts +59 -0
- package/src/features/network/thirdParty.ts +160 -0
- package/src/features/ota/OtaEventEmitter.ts +187 -0
- package/src/features/ota/OtaOrchestrator.ts +1513 -0
- package/src/features/ota/OtaTypes.ts +230 -0
- package/src/features/ota/deviceAttributes.ts +46 -0
- package/src/features/ota/environment.ts +199 -0
- package/src/features/ota/geoCountry.ts +85 -0
- package/src/features/ota/retry.ts +123 -0
- package/src/features/ota/signedDownload.ts +202 -0
- package/src/features/ota/useOtaUpdate.ts +161 -0
- package/src/features/performance/PerformanceFeature.ts +729 -0
- package/src/features/performance/collectors/AppLaunchCollector.ts +131 -0
- package/src/features/performance/collectors/AutoScreenLoadCollector.ts +258 -0
- package/src/features/performance/collectors/CustomTraceCollector.ts +116 -0
- package/src/features/performance/collectors/FrameMetricsCollector.ts +210 -0
- package/src/features/performance/collectors/JsStallCollector.ts +184 -0
- package/src/features/performance/collectors/NetworkPerfCollector.ts +69 -0
- package/src/features/performance/collectors/ScreenLoadCollector.ts +95 -0
- package/src/features/performance/collectors/UiHangCollector.ts +98 -0
- package/src/features/performance/config.ts +136 -0
- package/src/features/performance/getNativePerformanceModule.ts +38 -0
- package/src/features/performance/index.ts +28 -0
- package/src/features/performance/metrics/MetricsEngine.ts +152 -0
- package/src/features/performance/models.ts +235 -0
- package/src/features/performance/transport/PerformanceTransport.ts +161 -0
- package/src/features/profiler/ProfilerFeature.ts +661 -0
- package/src/features/profiler/config.ts +230 -0
- package/src/features/profiler/contracts.ts +176 -0
- package/src/features/profiler/index.ts +45 -0
- package/src/features/profiler/models.ts +430 -0
- package/src/features/profiler/transport/ProfilerTransport.ts +93 -0
- package/src/features/replay/bridge/adapters/bridgeAdapter.ts +235 -0
- package/src/features/replay/bridge/eventEmitter.ts +176 -0
- package/src/features/replay/bridge/nativeModule.ts +252 -0
- package/src/features/replay/bridge/nativeQuota.ts +111 -0
- package/src/features/replay/core/clock/clock.ts +38 -0
- package/src/features/replay/core/config/defaults.ts +66 -0
- package/src/features/replay/core/config/validator.ts +113 -0
- package/src/features/replay/core/env/environmentDetector.ts +21 -0
- package/src/features/replay/core/errors/safeCall.ts +34 -0
- package/src/features/replay/core/ids/sessionId.ts +44 -0
- package/src/features/replay/core/logger/logger.ts +36 -0
- package/src/features/replay/core/privacy/privacyTypes.ts +41 -0
- package/src/features/replay/core/queue/boundedQueue.ts +71 -0
- package/src/features/replay/integrations/alert/alertInstrumentation.ts +277 -0
- package/src/features/replay/integrations/logs/consoleIntegration.ts +136 -0
- package/src/features/replay/integrations/network/networkAdapter.ts +73 -0
- package/src/features/replay/integrations/react-navigation/navigationIntegration.ts +89 -0
- package/src/features/replay/integrations/touch/ReplayRoot.tsx +114 -0
- package/src/features/replay/pipeline/batching/batchManager.ts +133 -0
- package/src/features/replay/pipeline/envelope/envelopeBuilder.ts +66 -0
- package/src/features/replay/pipeline/retry/retryPolicy.ts +62 -0
- package/src/features/replay/pipeline/transport/transportTypes.ts +85 -0
- package/src/features/replay/public/api.ts +364 -0
- package/src/features/replay/public/enums.ts +78 -0
- package/src/features/replay/public/types.ts +297 -0
- package/src/features/replay/replay/breadcrumbs/breadcrumbCollector.ts +115 -0
- package/src/features/replay/replay/frames/frameModels.ts +45 -0
- package/src/features/replay/replay/session/sessionOrchestrator.ts +286 -0
- package/src/features/replay/replay/timeline/timelineModels.ts +129 -0
- package/src/features/replay/transport/BackendReplayTransport.ts +215 -0
- package/src/features/replay/transport/CompositeReplayTransport.ts +82 -0
- package/src/features/replay/transport/DesktopReplayTransport.ts +140 -0
- package/src/features/replay/transport/ReplayTransport.ts +84 -0
- package/src/features/session/BackendSessionAdapter.ts +1977 -0
- package/src/features/session/DesktopSessionTransport.ts +130 -0
- package/src/features/session/JourneyEventPipeline.ts +278 -0
- package/src/features/session/ReplayCaptureManager.ts +1401 -0
- package/src/features/session/ScrollTracker.ts +166 -0
- package/src/features/session/SessionManager.ts +1687 -0
- package/src/features/session/SyncDecisionEngine.ts +117 -0
- package/src/features/session/frameLink.ts +41 -0
- package/src/features/session/frameScrollState.ts +36 -0
- package/src/features/session/index.ts +88 -0
- package/src/features/session/nativeCapture.ts +43 -0
- package/src/features/session/outboxFrameCapture.ts +79 -0
- package/src/features/session/sessionTypes.ts +528 -0
- package/src/features/session/viewportPlausibility.ts +134 -0
- package/src/features/skan/skanBridge.ts +53 -0
- package/src/features/skan/skanConversionManager.ts +173 -0
- package/src/index.ts +206 -0
- package/src/integrations/fetch/fetchInterceptor.ts +201 -0
- package/src/integrations/navigation/screenTracker.ts +0 -0
- package/src/integrations/network/bodyCapture.ts +328 -0
- package/src/integrations/xhr/xhrInterceptor.ts +259 -0
- package/src/metro/composeSourceMap.ts +104 -0
- package/src/metro/featureModules.ts +143 -0
- package/src/metro/index.ts +336 -0
- package/src/metro/optionalDependencyStub.ts +13 -0
- package/src/metro/optionalModules.ts +27 -0
- package/src/metro/serializerCompose.ts +193 -0
- package/src/pipeline/dispatcher/dispatcher.ts +22 -0
- package/src/pipeline/envelope/envelope.ts +31 -0
- package/src/pipeline/envelope/serializer.ts +14 -0
- package/src/pipeline/processors/dedupe.ts +0 -0
- package/src/pipeline/processors/enrich.ts +11 -0
- package/src/pipeline/processors/sampling.ts +0 -0
- package/src/pipeline/processors/sanitize.ts +23 -0
- package/src/pipeline/queue/flushQueue.ts +144 -0
- package/src/pipeline/queue/memoryQueue.ts +31 -0
- package/src/pipeline/queue/persistentQueue.ts +385 -0
- package/src/pipeline/queue/queuePolicy.ts +0 -0
- package/src/pipeline/scheduler/flushScheduler.ts +47 -0
- package/src/pipeline/scheduler/retryPolicy.ts +8 -0
- package/src/public/ScaleBunErrorBoundary.tsx +91 -0
- package/src/public/ScaleBunFacade.ts +2129 -0
- package/src/public/ScaleBunProvider.tsx +91 -0
- package/src/public/typedTracker.ts +123 -0
- package/src/public/types.ts +362 -0
- package/src/push/PushManager.ts +318 -0
- package/src/push/adapters/ManualAdapter.ts +100 -0
- package/src/push/adapters/NativeBridgeAdapter.ts +142 -0
- package/src/push/adapters/NoopAdapter.ts +46 -0
- package/src/push/adapters/RNFirebaseMessagingAdapter.ts +271 -0
- package/src/push/adapters/loadMessaging.ts +24 -0
- package/src/push/adapters/loadNotifee.ts +29 -0
- package/src/push/adapters/selectAdapter.ts +176 -0
- package/src/push/detect/capabilities.ts +124 -0
- package/src/push/index.ts +22 -0
- package/src/push/native/nativeNotifications.ts +207 -0
- package/src/push/types.ts +159 -0
- package/src/specs/NativeReplaySdk.ts +101 -0
- package/src/specs/NativeScaleBunCrash.ts +64 -0
- package/src/specs/NativeScaleBunInstallReferrer.ts +29 -0
- package/src/specs/NativeScaleBunOta.ts +154 -0
- package/src/specs/NativeScaleBunPerformance.ts +34 -0
- package/src/specs/NativeScaleBunProfiler.ts +41 -0
- package/src/specs/NativeScaleBunStorage.ts +59 -0
- package/src/storage/StorageBackend.ts +272 -0
- package/src/storage/db/sqlite.ts +0 -0
- package/src/storage/files/fileStore.ts +0 -0
- package/src/transport/auth/sdkSession.ts +27 -0
- package/src/transport/backoff/exponentialJitter.ts +9 -0
- package/src/transport/http/endpoints.ts +33 -0
- package/src/transport/http/httpClient.ts +73 -0
- package/src/transport/rateLimit/retryAfter.ts +0 -0
- package/src/transport/signing/requestSigner.ts +0 -0
- package/src/vendor/protocol/index.ts +391 -0
- package/src/vendor/protocol/internal/validation.ts +497 -0
- package/src/vendor/sdk-contracts/bridge.ts +162 -0
- package/src/vendor/sdk-contracts/config.ts +192 -0
- package/src/vendor/sdk-contracts/events.ts +50 -0
- package/src/vendor/sdk-contracts/features.ts +42 -0
- package/src/vendor/sdk-contracts/index.ts +98 -0
- package/src/vendor/sdk-contracts/platform.ts +42 -0
- package/src/vendor/sdk-contracts/session-boundary.ts +55 -0
- package/src/vendor/sdk-contracts/session.ts +225 -0
- package/src/vendor/vendor.manifest +10 -0
|
@@ -0,0 +1,1045 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ScaleBun SDK — ScaleBunDebugRoot
|
|
3
|
+
*
|
|
4
|
+
* Root wrapper component that provides:
|
|
5
|
+
* 1. Native screenshot capture wiring (via bridgeAdapter)
|
|
6
|
+
* 2. Navigation detection integration
|
|
7
|
+
* 3. Lightweight gesture capture layer
|
|
8
|
+
* 4. Emits EVENT_DEBUG_READY on mount
|
|
9
|
+
*
|
|
10
|
+
* Usage in demo app:
|
|
11
|
+
* <ScaleBunDebugRoot>
|
|
12
|
+
* <App />
|
|
13
|
+
* </ScaleBunDebugRoot>
|
|
14
|
+
*
|
|
15
|
+
* Also provides:
|
|
16
|
+
* <ScaleBunScreen name="..." /> — Screen beacon component
|
|
17
|
+
* useScaleBunScreen("name") — Screen beacon hook
|
|
18
|
+
*
|
|
19
|
+
* IMPORTANT: All heavy imports (JourneyManager, etc.) are LAZY
|
|
20
|
+
* to avoid pulling in native module dependencies at load time.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { scrollFields } from './nativeScroll';
|
|
24
|
+
import React, {
|
|
25
|
+
useEffect,
|
|
26
|
+
useRef,
|
|
27
|
+
createContext,
|
|
28
|
+
useContext,
|
|
29
|
+
type ReactNode,
|
|
30
|
+
} from 'react';
|
|
31
|
+
import { View, NativeEventEmitter, NativeModules } from 'react-native';
|
|
32
|
+
import { resolveTouchTarget, describeTouchTarget, targetIdentity } from './touchTarget';
|
|
33
|
+
import { localPoint, normalizeRect, readRectSync, type NormalizedRect } from './targetGeometry';
|
|
34
|
+
import { nativeTagOf, nearestRecordedOffset } from './scrollContext';
|
|
35
|
+
import { resolvePlatformOS } from '../../core/context/device';
|
|
36
|
+
import {
|
|
37
|
+
INTERACTION_PROTOCOL_VERSION,
|
|
38
|
+
generateInteractionId,
|
|
39
|
+
correlateInteraction,
|
|
40
|
+
pruneInteractionStarts,
|
|
41
|
+
type InteractionStartContext,
|
|
42
|
+
} from './interactionProtocol';
|
|
43
|
+
|
|
44
|
+
// ─── Lazy imports to avoid native module cascade at load time ────────────────
|
|
45
|
+
// We only import TYPE references at the top level; actual modules are require()'d
|
|
46
|
+
// inside effects or callbacks, which run AFTER the native runtime is initialized.
|
|
47
|
+
|
|
48
|
+
let _bootstrap: typeof import('../../debug/bootstrap') | null = null;
|
|
49
|
+
function getBootstrap() {
|
|
50
|
+
if (!_bootstrap) {
|
|
51
|
+
_bootstrap = require('../../debug/bootstrap');
|
|
52
|
+
}
|
|
53
|
+
return _bootstrap;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ─── Context for Journey Manager ────────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
const JourneyContext = createContext<any>(null);
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Floor on how often a UI-state change may request a screenshot.
|
|
62
|
+
*
|
|
63
|
+
* One frame per second is far finer than any state a person perceives changing, and far coarser
|
|
64
|
+
* than a render loop — which is the case that matters, because a host may legitimately declare
|
|
65
|
+
* state from inside render and an oscillating dimension would otherwise capture continuously.
|
|
66
|
+
*/
|
|
67
|
+
const UI_STATE_CAPTURE_MIN_INTERVAL_MS = 1000;
|
|
68
|
+
|
|
69
|
+
// ─── ScaleBunDebugRoot ───────────────────────────────────────────────────────────
|
|
70
|
+
|
|
71
|
+
interface ScaleBunDebugRootProps {
|
|
72
|
+
children: ReactNode;
|
|
73
|
+
/** Optional: pass a React Navigation ref for auto-detection */
|
|
74
|
+
navigationRef?: any;
|
|
75
|
+
/** Internal bridge used by ScaleBunProvider's zero-instrumentation event lane. */
|
|
76
|
+
captureAutomaticInteractions?: boolean;
|
|
77
|
+
/** Avoid the legacy-wrapper warning when composed by ScaleBunProvider. */
|
|
78
|
+
suppressDeprecationWarning?: boolean;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
interface TouchStartContext extends InteractionStartContext {
|
|
82
|
+
locationX?: number;
|
|
83
|
+
locationY?: number;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function ScaleBunDebugRoot({
|
|
87
|
+
children,
|
|
88
|
+
navigationRef,
|
|
89
|
+
captureAutomaticInteractions = false,
|
|
90
|
+
suppressDeprecationWarning = false,
|
|
91
|
+
}: ScaleBunDebugRootProps) {
|
|
92
|
+
const rootRef = useRef<View>(null);
|
|
93
|
+
const managerRef = useRef<any>(null);
|
|
94
|
+
const initializedRef = useRef(false);
|
|
95
|
+
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
// Guard: only initialize once
|
|
98
|
+
if (initializedRef.current) return;
|
|
99
|
+
|
|
100
|
+
// Deprecation notice (once per mount)
|
|
101
|
+
if (!suppressDeprecationWarning) {
|
|
102
|
+
console.warn(
|
|
103
|
+
'[ScaleBun] <ScaleBunDebugRoot> is no longer required for standard SDK usage. ' +
|
|
104
|
+
'Use <ScaleBunProvider> for initialization, Engage, automatic events, ' +
|
|
105
|
+
'touch tracking, and journey features in one wrapper. ' +
|
|
106
|
+
'See: https://docs.scalebun.com/migration/v2',
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// LAZY: load bootstrap module only inside effect (after native runtime ready)
|
|
111
|
+
let bs: ReturnType<typeof getBootstrap>;
|
|
112
|
+
try {
|
|
113
|
+
bs = getBootstrap();
|
|
114
|
+
} catch (e: any) {
|
|
115
|
+
console.warn('[ScaleBunDebugRoot] Failed to load bootstrap:', e?.message);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (!bs) return;
|
|
120
|
+
|
|
121
|
+
const isDebugEnabled = bs.isDebugEnabled();
|
|
122
|
+
let transport: any = null;
|
|
123
|
+
let journeyConfig: any = { enabled: false };
|
|
124
|
+
|
|
125
|
+
if (!isDebugEnabled) {
|
|
126
|
+
// This is expected when ScaleBunDebugRoot is composed internally by
|
|
127
|
+
// ScaleBunProvider. Keep the diagnostic for direct legacy usage, but
|
|
128
|
+
// do not surface a LogBox warning in normal application mode.
|
|
129
|
+
if (!suppressDeprecationWarning) {
|
|
130
|
+
console.warn('[ScaleBunDebugRoot] Debug not enabled — running in production mode');
|
|
131
|
+
}
|
|
132
|
+
try { bs._setDebugReady(true); } catch { /* no-throw */ }
|
|
133
|
+
} else {
|
|
134
|
+
transport = bs._getTransport();
|
|
135
|
+
if (!transport) {
|
|
136
|
+
console.warn('[ScaleBunDebugRoot] No transport — skipping journey init');
|
|
137
|
+
} else {
|
|
138
|
+
try {
|
|
139
|
+
journeyConfig = bs._getJourneyConfig();
|
|
140
|
+
} catch {
|
|
141
|
+
journeyConfig = { enabled: false };
|
|
142
|
+
}
|
|
143
|
+
if (!journeyConfig.enabled) {
|
|
144
|
+
console.warn('[ScaleBunDebugRoot] Journey not enabled — passthrough mode');
|
|
145
|
+
try { bs._setDebugReady(true); } catch { /* no-throw */ }
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Wire unified SessionManager (independent of journey)
|
|
151
|
+
// NOTE: We do NOT auto-start the session here. The session stays idle
|
|
152
|
+
// until the desktop user explicitly presses Record (sends startSession command).
|
|
153
|
+
// We only wire the native capture bridge so that when a session IS started,
|
|
154
|
+
// the capture infrastructure is ready.
|
|
155
|
+
try {
|
|
156
|
+
const { SessionManager } = require('../session/SessionManager');
|
|
157
|
+
const sessionManager = SessionManager.getExistingInstance();
|
|
158
|
+
if (sessionManager) {
|
|
159
|
+
|
|
160
|
+
// Wire native bridge capture — uses PixelCopy (Android) / UIGraphicsImageRenderer (iOS)
|
|
161
|
+
// via the shared native module. This replaces the previous ViewShot dependency.
|
|
162
|
+
setTimeout(() => {
|
|
163
|
+
try {
|
|
164
|
+
const { bridgeAdapter } = require('../replay/bridge/adapters/bridgeAdapter');
|
|
165
|
+
const { Dimensions, Platform } = require('react-native');
|
|
166
|
+
|
|
167
|
+
if (bridgeAdapter.isAvailable()) {
|
|
168
|
+
// Create a capture function compatible with NativeCaptureFn
|
|
169
|
+
const nativeBridgeCapture = async (
|
|
170
|
+
_sessionId: string,
|
|
171
|
+
_reason: string,
|
|
172
|
+
_quality: any,
|
|
173
|
+
) => {
|
|
174
|
+
try {
|
|
175
|
+
const result = await bridgeAdapter.captureScreenshot(_reason || 'session');
|
|
176
|
+
if (!result?.base64) return null;
|
|
177
|
+
|
|
178
|
+
const { width, height } = Dimensions.get('window');
|
|
179
|
+
return {
|
|
180
|
+
base64: result.base64,
|
|
181
|
+
width: result.width || Math.round(width),
|
|
182
|
+
height: result.height || Math.round(height),
|
|
183
|
+
byteSize: result.sizeBytes || Math.round(result.base64.length * 0.75),
|
|
184
|
+
format: (result.format ?? 'jpeg') as string,
|
|
185
|
+
frameHash: (result as any).frameHash as string | undefined,
|
|
186
|
+
platform: resolvePlatformOS() as 'android' | 'ios',
|
|
187
|
+
};
|
|
188
|
+
} catch {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
// Inject into SessionManager (hot-swaps if session is active)
|
|
194
|
+
if (typeof (sessionManager as any).setNativeCapture === 'function') {
|
|
195
|
+
(sessionManager as any).setNativeCapture(nativeBridgeCapture);
|
|
196
|
+
console.warn('[ScaleBunDebugRoot] ✅ Native bridge capture wired');
|
|
197
|
+
}
|
|
198
|
+
} else {
|
|
199
|
+
console.warn('[ScaleBunDebugRoot] ⚠️ Native capture module not available');
|
|
200
|
+
}
|
|
201
|
+
} catch (capErr: any) {
|
|
202
|
+
console.warn('[ScaleBunDebugRoot] ⚠️ Native capture wiring failed:', capErr?.message);
|
|
203
|
+
}
|
|
204
|
+
}, 500);
|
|
205
|
+
|
|
206
|
+
console.warn('[ScaleBunDebugRoot] ✅ Session wired');
|
|
207
|
+
}
|
|
208
|
+
} catch { /* SessionManager may not be available — non-fatal */ }
|
|
209
|
+
|
|
210
|
+
// Always wire AutoScreenDetector to React Navigation if a ref is provided.
|
|
211
|
+
// Register even when ref.current is still null: at mount the
|
|
212
|
+
// <NavigationContainer> child hasn't attached the ref yet. AutoScreenDetector's
|
|
213
|
+
// poller retries wiring the 'state' listener once the container populates,
|
|
214
|
+
// so gating on `ref.current` here would permanently miss the (common) case
|
|
215
|
+
// where the container mounts after this effect runs.
|
|
216
|
+
if (navigationRef) {
|
|
217
|
+
try {
|
|
218
|
+
const { AutoScreenDetector } = require('../navigation/AutoScreenDetector');
|
|
219
|
+
AutoScreenDetector.getInstance().setNavigationRef(navigationRef);
|
|
220
|
+
} catch { /* no-throw */ }
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
if (!journeyConfig.enabled || !transport) {
|
|
224
|
+
return; // Journey disabled — session is wired above independently
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// LAZY: only now require JourneyManager (which pulls in screenshot/gesture deps)
|
|
228
|
+
let JourneyManager: any;
|
|
229
|
+
try {
|
|
230
|
+
JourneyManager = require('./journeyManager').JourneyManager;
|
|
231
|
+
} catch (e: any) {
|
|
232
|
+
console.warn('[ScaleBunDebugRoot] Failed to load JourneyManager:', e?.message);
|
|
233
|
+
try { bs._setDebugReady(true); } catch { /* no-throw */ }
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Create journey manager (idempotent singleton)
|
|
238
|
+
const manager = JourneyManager.getInstance(transport, journeyConfig);
|
|
239
|
+
managerRef.current = manager;
|
|
240
|
+
|
|
241
|
+
// Wire into command registry
|
|
242
|
+
try {
|
|
243
|
+
const commands = bs._getCommands();
|
|
244
|
+
if (commands) {
|
|
245
|
+
commands.setJourneyManager(manager);
|
|
246
|
+
commands.setJourneyEnabled(true);
|
|
247
|
+
commands.setDebugReady(true);
|
|
248
|
+
}
|
|
249
|
+
} catch { /* no-throw */ }
|
|
250
|
+
|
|
251
|
+
// Initialize with root ref (slight delay to ensure View is mounted)
|
|
252
|
+
const timer = setTimeout(() => {
|
|
253
|
+
try {
|
|
254
|
+
manager.initialize(rootRef.current);
|
|
255
|
+
|
|
256
|
+
// If React Navigation ref is available, subscribe
|
|
257
|
+
if (navigationRef?.current) {
|
|
258
|
+
try {
|
|
259
|
+
const navContainer = navigationRef.current;
|
|
260
|
+
if (navContainer.addListener) {
|
|
261
|
+
navContainer.addListener('state', () => {
|
|
262
|
+
try {
|
|
263
|
+
const state = navContainer.getRootState();
|
|
264
|
+
manager.nav.handleNavigationStateChange(state);
|
|
265
|
+
} catch { /* no-throw */ }
|
|
266
|
+
});
|
|
267
|
+
// Get initial state
|
|
268
|
+
try {
|
|
269
|
+
const state = navContainer.getRootState();
|
|
270
|
+
if (state) {
|
|
271
|
+
manager.nav.handleNavigationStateChange(state);
|
|
272
|
+
}
|
|
273
|
+
} catch { /* no-throw */ }
|
|
274
|
+
}
|
|
275
|
+
} catch { /* no-throw */ }
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
bs._setDebugReady(true);
|
|
279
|
+
initializedRef.current = true;
|
|
280
|
+
console.warn('[ScaleBunDebugRoot] ✅ Journey system initialized');
|
|
281
|
+
} catch (e: any) {
|
|
282
|
+
console.warn('[ScaleBunDebugRoot] ❌ Initialization error:', e?.message);
|
|
283
|
+
}
|
|
284
|
+
}, 200);
|
|
285
|
+
|
|
286
|
+
return () => {
|
|
287
|
+
clearTimeout(timer);
|
|
288
|
+
};
|
|
289
|
+
}, [navigationRef]);
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* RN-11 — CAPTURE A FRAME WHEN THE UI CHANGES SHAPE.
|
|
293
|
+
*
|
|
294
|
+
* A declared state used to have no picture of its own. Nothing captured on `setUiState`, so a
|
|
295
|
+
* state's visual existed only if a screenshot happened to be taken for another reason — a
|
|
296
|
+
* navigation, a timer, or the interaction capture that fires AFTER the touch and therefore
|
|
297
|
+
* photographs the outcome. A drawer could be recorded as open with no frame showing it open,
|
|
298
|
+
* or with the frame of the screen that replaced it.
|
|
299
|
+
*
|
|
300
|
+
* The native capture reasons are NAVIGATION, MANUAL, INTERACTION and TIMER; none of them means
|
|
301
|
+
* "the UI changed shape". This routes through the MANUAL path, which is the only one reachable
|
|
302
|
+
* from JS. A dedicated native reason would let the backend tell a state capture from a
|
|
303
|
+
* developer-requested one, and that is a native change on both platforms — worth doing, not
|
|
304
|
+
* doable from here.
|
|
305
|
+
*
|
|
306
|
+
* RATE LIMITED, and the limit is not politeness. A screenshot is expensive, and while
|
|
307
|
+
* `uiState` already collapses redundant declarations, a genuinely oscillating dimension (a
|
|
308
|
+
* spinner toggling, a live-updating badge) would otherwise capture continuously. One frame per
|
|
309
|
+
* second is far finer than any state a person can perceive changing and far coarser than a
|
|
310
|
+
* render loop.
|
|
311
|
+
*
|
|
312
|
+
* Requests only; never awaits and never throws. If the session is not recording,
|
|
313
|
+
* `captureManualFrame` declines and the state simply has no frame — which is the honest
|
|
314
|
+
* outcome and is exactly what the analytics-only lane already reports elsewhere.
|
|
315
|
+
*/
|
|
316
|
+
useEffect(() => {
|
|
317
|
+
let lastCaptureTs = 0;
|
|
318
|
+
const { onUiStateChange } = require('./uiState');
|
|
319
|
+
const unsubscribe = onUiStateChange(() => {
|
|
320
|
+
const now = Date.now();
|
|
321
|
+
if (now - lastCaptureTs < UI_STATE_CAPTURE_MIN_INTERVAL_MS) return;
|
|
322
|
+
lastCaptureTs = now;
|
|
323
|
+
try {
|
|
324
|
+
const { SessionManager } = require('../session/SessionManager');
|
|
325
|
+
const sm = SessionManager.getExistingInstance();
|
|
326
|
+
if (sm && typeof (sm as any).captureManualFrame === 'function') {
|
|
327
|
+
/* Fire and forget: the tap that follows must not wait on a screenshot. */
|
|
328
|
+
void (sm as any).captureManualFrame();
|
|
329
|
+
}
|
|
330
|
+
} catch { /* no-throw */ }
|
|
331
|
+
});
|
|
332
|
+
return unsubscribe;
|
|
333
|
+
}, []);
|
|
334
|
+
|
|
335
|
+
// ─── Native Interaction Listener ────────────────────────────────────
|
|
336
|
+
// Receives high-confidence ScaleBunNativeInteraction events from the native tracker
|
|
337
|
+
// and forwards them to SessionManager as USER_ACTION events.
|
|
338
|
+
const lastNativeTouchTsRef = useRef<number>(0);
|
|
339
|
+
const nativeTrackingConfirmedRef = useRef<boolean>(false);
|
|
340
|
+
const touchStartRef = useRef<TouchStartContext | null>(null);
|
|
341
|
+
const interactionStartsRef = useRef<TouchStartContext[]>([]);
|
|
342
|
+
const pendingJsEmitsRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());
|
|
343
|
+
|
|
344
|
+
useEffect(() => {
|
|
345
|
+
let subscription: any = null;
|
|
346
|
+
try {
|
|
347
|
+
const nativeModule = NativeModules.ReplaySdk;
|
|
348
|
+
if (!nativeModule) return;
|
|
349
|
+
const emitter = new NativeEventEmitter(nativeModule);
|
|
350
|
+
subscription = emitter.addListener('ScaleBunNativeInteraction', (event: any) => {
|
|
351
|
+
try {
|
|
352
|
+
// Record timestamp to suppress duplicate JS touch events
|
|
353
|
+
lastNativeTouchTsRef.current = Date.now();
|
|
354
|
+
nativeTrackingConfirmedRef.current = true;
|
|
355
|
+
|
|
356
|
+
const nativeOccurredAt =
|
|
357
|
+
typeof event.occurredAt === 'number'
|
|
358
|
+
? event.occurredAt
|
|
359
|
+
: (typeof event.timestamp === 'number' ? event.timestamp : Date.now()) -
|
|
360
|
+
(typeof event.durationMs === 'number' ? event.durationMs : 0);
|
|
361
|
+
/**
|
|
362
|
+
* RN-6 — correlate, then CONSUME. See interactionProtocol.ts for why
|
|
363
|
+
* the join is on time at all, and why a refusal is the important part.
|
|
364
|
+
*
|
|
365
|
+
* Pruning first is part of the correctness, not tidying: a start older
|
|
366
|
+
* than the tolerance can never be paired, but while it sits in the list
|
|
367
|
+
* it is still counted by the ambiguity test, so a stale entry can turn a
|
|
368
|
+
* clear pairing into a refusal — and the list only grows.
|
|
369
|
+
*/
|
|
370
|
+
pruneInteractionStarts(interactionStartsRef.current, nativeOccurredAt);
|
|
371
|
+
const correlation = correlateInteraction(
|
|
372
|
+
interactionStartsRef.current,
|
|
373
|
+
nativeOccurredAt,
|
|
374
|
+
);
|
|
375
|
+
const start = correlation.start;
|
|
376
|
+
/**
|
|
377
|
+
* ONE-TO-ONE. Without removing the matched start, a second native event
|
|
378
|
+
* arriving within the window claims the SAME js evidence, so one tap's
|
|
379
|
+
* target is stamped onto another tap that never had one — a duplicate
|
|
380
|
+
* identity that reads as two genuine interactions on the same control.
|
|
381
|
+
*/
|
|
382
|
+
if (correlation.index >= 0) {
|
|
383
|
+
interactionStartsRef.current.splice(correlation.index, 1);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// Cancel only this physical touch's fallback. A single timer used to cancel a
|
|
387
|
+
// previous rapid tap and silently lose it on devices without native tracking.
|
|
388
|
+
if (start) {
|
|
389
|
+
const pending = pendingJsEmitsRef.current.get(start.interactionId);
|
|
390
|
+
if (pending !== undefined) clearTimeout(pending);
|
|
391
|
+
pendingJsEmitsRef.current.delete(start.interactionId);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
const { SessionManager } = require('../session/SessionManager');
|
|
395
|
+
const sm = SessionManager.getExistingInstance();
|
|
396
|
+
if (!sm || typeof (sm as any).onGestureDetected !== 'function') return;
|
|
397
|
+
|
|
398
|
+
// Diagnostic: capture window dims at event time. Pure
|
|
399
|
+
// observability — NOT used for normalization (native path
|
|
400
|
+
// already produced normalizedX/Y against the screenshot view).
|
|
401
|
+
let _diagWinW: number | undefined;
|
|
402
|
+
let _diagWinH: number | undefined;
|
|
403
|
+
try {
|
|
404
|
+
const { Dimensions } = require('react-native');
|
|
405
|
+
const _d = Dimensions.get('window');
|
|
406
|
+
_diagWinW = _d.width; _diagWinH = _d.height;
|
|
407
|
+
} catch { /* no-throw */ }
|
|
408
|
+
|
|
409
|
+
(sm as any).onGestureDetected(event.gestureType || 'tap', {
|
|
410
|
+
interactionId: event.interactionId || start?.interactionId || generateInteractionId(),
|
|
411
|
+
interactionProtocol: event.interactionProtocol || INTERACTION_PROTOCOL_VERSION,
|
|
412
|
+
occurredAt: nativeOccurredAt,
|
|
413
|
+
/**
|
|
414
|
+
* RN-6 — THESE FIVE FIELDS ARE THE ONLY ONES THE JOIN CARRIES, AND
|
|
415
|
+
* THEREFORE THE ONLY ONES A BAD JOIN CAN FALSIFY.
|
|
416
|
+
*
|
|
417
|
+
* Coordinates below come from native and are right regardless. So a
|
|
418
|
+
* mispairing does not produce visibly broken data: it produces heat
|
|
419
|
+
* in the correct position attributed to the wrong control, in the
|
|
420
|
+
* wrong UI state, on the wrong screen. Every field is individually
|
|
421
|
+
* well-formed and nothing downstream can tell.
|
|
422
|
+
*
|
|
423
|
+
* When the correlation is not 'exact' they are left UNDEFINED rather
|
|
424
|
+
* than filled from a best guess. An interaction with no target is
|
|
425
|
+
* honest and visibly incomplete — the accounting lane can count it as
|
|
426
|
+
* unplaceable and say why. An interaction with the WRONG target is
|
|
427
|
+
* indistinguishable from a correct one and silently corrupts every
|
|
428
|
+
* aggregate it enters. `null` is not `0`, and a guess is not a
|
|
429
|
+
* measurement.
|
|
430
|
+
*/
|
|
431
|
+
ui: start?.ui,
|
|
432
|
+
stateStatus: start?.stateStatus ?? 'not_captured',
|
|
433
|
+
target: start?.target,
|
|
434
|
+
targetId: start?.targetId,
|
|
435
|
+
targetSource: start?.targetSource,
|
|
436
|
+
screenName: start?.screenName,
|
|
437
|
+
screenSource: start?.screenSource ?? 'none',
|
|
438
|
+
targetRect: start?.targetRect,
|
|
439
|
+
/**
|
|
440
|
+
* RN-15 — WHERE IN THE CONTROL, computed where both halves exist: the
|
|
441
|
+
* point comes from the native event and the rect was measured at
|
|
442
|
+
* finger-down, in the same capture base. Pairing them here rather than
|
|
443
|
+
* downstream stops anything later reaching for a different rect.
|
|
444
|
+
*/
|
|
445
|
+
...(() => {
|
|
446
|
+
const lp = localPoint(
|
|
447
|
+
start?.targetRect ?? null,
|
|
448
|
+
event.normalizedX,
|
|
449
|
+
event.normalizedY,
|
|
450
|
+
);
|
|
451
|
+
return lp ? { localU: lp.u, localV: lp.v } : {};
|
|
452
|
+
})(),
|
|
453
|
+
/**
|
|
454
|
+
* SCROLL — the JS wrapper's offset when the app uses it, else the NATIVE
|
|
455
|
+
* probe's innermost scroll container (read at ACTION_DOWN, no wrapper
|
|
456
|
+
* needed). The native half comes from this native event, not from the
|
|
457
|
+
* JS join, so it is valid whatever the correlation verdict: it is a
|
|
458
|
+
* measurement of where the finger landed, not an attribution.
|
|
459
|
+
*/
|
|
460
|
+
...scrollFields(start, event),
|
|
461
|
+
itemKey: start?.itemKey,
|
|
462
|
+
itemIndex: start?.itemIndex,
|
|
463
|
+
/**
|
|
464
|
+
* The join's own verdict, shipped with the row so it is auditable
|
|
465
|
+
* rather than a claim made in a comment. 'ambiguous' and 'none' are
|
|
466
|
+
* deliberately distinguished: 'none' means the JS handler never fired
|
|
467
|
+
* (a real capture gap on this platform), 'ambiguous' means it fired
|
|
468
|
+
* more than once too close together to attribute. Those have
|
|
469
|
+
* different fixes, and collapsing them would hide which one is
|
|
470
|
+
* actually happening in production.
|
|
471
|
+
*/
|
|
472
|
+
correlation: correlation.outcome,
|
|
473
|
+
correlationDeltaMs: correlation.deltaMs,
|
|
474
|
+
correlationRunnerUpDeltaMs: correlation.runnerUpDeltaMs,
|
|
475
|
+
emitAutomaticAnalytics: start?.emitAutomaticAnalytics ?? captureAutomaticInteractions,
|
|
476
|
+
x: event.rawX,
|
|
477
|
+
y: event.rawY,
|
|
478
|
+
// Use the actual native end coords when present, not the down
|
|
479
|
+
// coords. The previous endX/endY fell back to rawX/rawY which
|
|
480
|
+
// collapsed swipes to a zero-length segment in the dashboard.
|
|
481
|
+
endX: event.rawEndX ?? event.rawX,
|
|
482
|
+
endY: event.rawEndY ?? event.rawY,
|
|
483
|
+
normalizedX: event.normalizedX,
|
|
484
|
+
normalizedY: event.normalizedY,
|
|
485
|
+
normalizedEndX: event.normalizedEndX,
|
|
486
|
+
normalizedEndY: event.normalizedEndY,
|
|
487
|
+
viewportWidth: event.screenshotWidthPx,
|
|
488
|
+
viewportHeight: event.screenshotHeightPx,
|
|
489
|
+
durationMs: event.durationMs,
|
|
490
|
+
confidence: 'high',
|
|
491
|
+
coordinateSpace: event.coordinateSpace,
|
|
492
|
+
safeAreaTop: event.safeAreaTop,
|
|
493
|
+
platform: event.platform,
|
|
494
|
+
source: 'native-interaction-tracker',
|
|
495
|
+
windowWidth: _diagWinW,
|
|
496
|
+
windowHeight: _diagWinH,
|
|
497
|
+
});
|
|
498
|
+
} catch { /* no-throw */ }
|
|
499
|
+
});
|
|
500
|
+
} catch { /* no-throw */ }
|
|
501
|
+
|
|
502
|
+
return () => {
|
|
503
|
+
try { subscription?.remove(); } catch { /* no-throw */ }
|
|
504
|
+
for (const timer of pendingJsEmitsRef.current.values()) clearTimeout(timer);
|
|
505
|
+
pendingJsEmitsRef.current.clear();
|
|
506
|
+
};
|
|
507
|
+
}, [captureAutomaticInteractions]);
|
|
508
|
+
|
|
509
|
+
// ─── Touch Tracking State ───────────────────────────────────────────
|
|
510
|
+
|
|
511
|
+
// On-screen rect of the root view — the EXACT view the native screenshot
|
|
512
|
+
// captures. Normalizing pageX/pageY against this rect makes JS-fallback taps
|
|
513
|
+
// share the screenshot's coordinate origin (fixes vertical status-bar offset).
|
|
514
|
+
const rootRectRef = useRef<{ x: number; y: number; w: number; h: number } | null>(null);
|
|
515
|
+
const measureRoot = () => {
|
|
516
|
+
try {
|
|
517
|
+
const node: any = rootRef.current;
|
|
518
|
+
if (node && typeof node.measureInWindow === 'function') {
|
|
519
|
+
node.measureInWindow((x: number, y: number, w: number, h: number) => {
|
|
520
|
+
if (w > 0 && h > 0) rootRectRef.current = { x, y, w, h };
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
} catch { /* no-throw */ }
|
|
524
|
+
};
|
|
525
|
+
|
|
526
|
+
// Eagerly measure the root view on mount AND periodically until we have a
|
|
527
|
+
// non-null reading. measureInWindow is async, so the first tap can otherwise
|
|
528
|
+
// fall back to Dimensions.get('window') — which excludes system insets and
|
|
529
|
+
// is ~status-bar fraction smaller than the screenshot region on Android,
|
|
530
|
+
// pushing the marker upward. Polling stops as soon as the first measurement
|
|
531
|
+
// succeeds; subsequent taps re-measure inline.
|
|
532
|
+
useEffect(() => {
|
|
533
|
+
let attempts = 0;
|
|
534
|
+
const tryMeasure = () => {
|
|
535
|
+
measureRoot();
|
|
536
|
+
attempts += 1;
|
|
537
|
+
if (rootRectRef.current || attempts >= 10) return;
|
|
538
|
+
setTimeout(tryMeasure, 100);
|
|
539
|
+
};
|
|
540
|
+
const t = setTimeout(tryMeasure, 50);
|
|
541
|
+
return () => clearTimeout(t);
|
|
542
|
+
}, []);
|
|
543
|
+
|
|
544
|
+
// Gesture capture handlers — feed into SessionManager (unified capture)
|
|
545
|
+
const handleTouchStart = (e: any) => {
|
|
546
|
+
try {
|
|
547
|
+
const touch = e.nativeEvent;
|
|
548
|
+
const target = resolveTouchTarget(e);
|
|
549
|
+
let ui: string | undefined;
|
|
550
|
+
let screenName: string | undefined;
|
|
551
|
+
/**
|
|
552
|
+
* RN-8 — WHERE the screen name came from, carried with the interaction.
|
|
553
|
+
*
|
|
554
|
+
* Production shows 13.8% of Android interactions with a screen and 0.5% on iOS, and
|
|
555
|
+
* those figures cannot distinguish three unrelated causes: nothing was instrumented,
|
|
556
|
+
* a manual beacon was instrumented but never reached interactions, or auto-detection
|
|
557
|
+
* ran and failed. Each has a different owner. Recording the source turns one
|
|
558
|
+
* unactionable percentage into three answerable ones.
|
|
559
|
+
*/
|
|
560
|
+
let screenSource: 'manual' | 'navigation' | 'none' = 'none';
|
|
561
|
+
let stateInstrumented = false;
|
|
562
|
+
try {
|
|
563
|
+
const { uiStateSignature, uiStateInstrumented } = require('./uiState');
|
|
564
|
+
ui = uiStateSignature();
|
|
565
|
+
stateInstrumented = uiStateInstrumented();
|
|
566
|
+
} catch { /* no-throw */ }
|
|
567
|
+
try {
|
|
568
|
+
const { AutoScreenDetector } = require('../navigation/AutoScreenDetector');
|
|
569
|
+
const detector = AutoScreenDetector.getInstance();
|
|
570
|
+
screenName = detector.getCurrentScreen() || undefined;
|
|
571
|
+
/* Read from the SAME call site as the name, so the two can never describe
|
|
572
|
+
different moments — the detector is polled and its answer can change between
|
|
573
|
+
two reads a few milliseconds apart. */
|
|
574
|
+
screenSource = screenName ? detector.getCurrentScreenSource() : 'none';
|
|
575
|
+
} catch { /* no-throw */ }
|
|
576
|
+
const start: TouchStartContext = {
|
|
577
|
+
interactionId: generateInteractionId(),
|
|
578
|
+
occurredAt: Date.now(),
|
|
579
|
+
x: touch.pageX,
|
|
580
|
+
y: touch.pageY,
|
|
581
|
+
locationX: touch.locationX,
|
|
582
|
+
locationY: touch.locationY,
|
|
583
|
+
/**
|
|
584
|
+
* RN-1 + RN-2 — the identity that is persisted, and it is now code-derived.
|
|
585
|
+
*
|
|
586
|
+
* `describeTouchTarget` returns `testID` -> structural path -> component name,
|
|
587
|
+
* and never a caption or an accessibilityLabel. Before RN-2 it preferred free
|
|
588
|
+
* text, so this line was writing user data ("Pay EGP 1,442", an order row
|
|
589
|
+
* labelled with an email address, a contact's name) into the analytics store —
|
|
590
|
+
* and, because `target` is an aggregation key, splitting one button into one
|
|
591
|
+
* bucket per person at the same time.
|
|
592
|
+
*
|
|
593
|
+
* `targetId` used to be `target?.testID` alone, which is `undefined` in the
|
|
594
|
+
* overwhelming majority of apps — no testIDs authored — so the field the
|
|
595
|
+
* backend keys on was empty almost always. It now falls back to the structural
|
|
596
|
+
* path, with `targetSource` recording WHICH it got.
|
|
597
|
+
*/
|
|
598
|
+
target: describeTouchTarget(target),
|
|
599
|
+
targetId: targetIdentity(target).id,
|
|
600
|
+
/**
|
|
601
|
+
* WHICH KIND of identity this is, because they are not equally trustworthy: a
|
|
602
|
+
* `testID` is a promise from the app's authors that this control is this
|
|
603
|
+
* control; a `path` is an inference that breaks when the tree is refactored.
|
|
604
|
+
* Without this the accounting lane cannot distinguish "the control had no
|
|
605
|
+
* identity" from "the identity is a structural guess", and both would render
|
|
606
|
+
* as an equally confident target.
|
|
607
|
+
*/
|
|
608
|
+
targetSource: targetIdentity(target).source,
|
|
609
|
+
/* RN-4 — row identity from the app's own keyExtractor; see touchTarget.ts. */
|
|
610
|
+
itemKey: target?.itemKey,
|
|
611
|
+
itemIndex: target?.itemIndex,
|
|
612
|
+
/**
|
|
613
|
+
* RN-13 — the control's rectangle, so `heat ∈ target` is decidable.
|
|
614
|
+
*
|
|
615
|
+
* Read SYNCHRONOUSLY here, in the same tick as the touch, and normalized against
|
|
616
|
+
* the SAME measured root the tap's own coordinates use. Both halves matter:
|
|
617
|
+
*
|
|
618
|
+
* - A callback measurement (`measureInWindow`) would resolve after this handler
|
|
619
|
+
* returns, so the rect attached to a tap could be the previous tap's, with
|
|
620
|
+
* nothing afterwards able to tell. `targetGeometry` refuses to guess: it reads
|
|
621
|
+
* now or reports null.
|
|
622
|
+
* - Normalizing against a window size instead of the root view is off by the
|
|
623
|
+
* status bar on most devices, which would read as "the heat is just outside
|
|
624
|
+
* the button" everywhere rather than as a measurement bug.
|
|
625
|
+
*
|
|
626
|
+
* `measureRoot()` is called first because the cached root rect is populated
|
|
627
|
+
* asynchronously at mount; without it the first taps of a session normalize
|
|
628
|
+
* against nothing and get a null rect for a reason that has nothing to do with
|
|
629
|
+
* the control.
|
|
630
|
+
*/
|
|
631
|
+
/**
|
|
632
|
+
* RN-3 — WHERE IN THE CONTENT, not just where on the glass.
|
|
633
|
+
*
|
|
634
|
+
* Two taps at the same screen coordinate one viewport apart are two different
|
|
635
|
+
* controls. Without an offset they merge into one hotspot, and the heatmap shows
|
|
636
|
+
* heavy engagement at a position where, in content terms, nothing in particular
|
|
637
|
+
* is. The offset is also a CACHE dimension — two scroll states of one route must
|
|
638
|
+
* not share a backdrop — so its absence corrupts the picture as well as the count.
|
|
639
|
+
*
|
|
640
|
+
* `ancestors` is innermost-first, so this takes the NEAREST scroller that has a
|
|
641
|
+
* recorded position: a tap inside a horizontal carousel belongs to the carousel's
|
|
642
|
+
* content, not to how far the page behind it had scrolled.
|
|
643
|
+
*
|
|
644
|
+
* Null when no ancestor has one — never zero. Zero is a real scroll position (the
|
|
645
|
+
* top of a list), and reporting it for "unknown" would place every unmeasured tap
|
|
646
|
+
* at the top of its content, indistinguishable from a genuine tap there.
|
|
647
|
+
*/
|
|
648
|
+
...(() => {
|
|
649
|
+
const hit = nearestRecordedOffset(
|
|
650
|
+
(target?.ancestors ?? []).map((n) => nativeTagOf(n)),
|
|
651
|
+
);
|
|
652
|
+
return hit
|
|
653
|
+
? { scrollX: hit.x, scrollY: hit.y, scrollSource: 'wrapper' as const }
|
|
654
|
+
: { scrollSource: 'none' as const };
|
|
655
|
+
})(),
|
|
656
|
+
targetRect: (() => {
|
|
657
|
+
measureRoot();
|
|
658
|
+
const root = rootRectRef.current;
|
|
659
|
+
/* null -> undefined: the context field is optional, and an explicit null would
|
|
660
|
+
serialise as a JSON null claiming "measured, and it was nothing". */
|
|
661
|
+
return normalizeRect(readRectSync(target?.node), root ? { w: root.w, h: root.h } : null) ?? undefined;
|
|
662
|
+
})(),
|
|
663
|
+
screenName,
|
|
664
|
+
screenSource,
|
|
665
|
+
ui,
|
|
666
|
+
stateStatus: ui ? 'captured_nonempty' : stateInstrumented ? 'captured_empty' : 'not_instrumented',
|
|
667
|
+
emitAutomaticAnalytics: captureAutomaticInteractions,
|
|
668
|
+
};
|
|
669
|
+
touchStartRef.current = start;
|
|
670
|
+
interactionStartsRef.current = interactionStartsRef.current
|
|
671
|
+
.filter((candidate) => start.occurredAt - candidate.occurredAt < 5000)
|
|
672
|
+
.concat(start)
|
|
673
|
+
.slice(-8);
|
|
674
|
+
} catch { /* no-throw */ }
|
|
675
|
+
};
|
|
676
|
+
|
|
677
|
+
const handleTouchEnd = (e: any) => {
|
|
678
|
+
try {
|
|
679
|
+
const touch = e.nativeEvent;
|
|
680
|
+
|
|
681
|
+
// Classify gesture based on touch movement and duration
|
|
682
|
+
const start = touchStartRef.current;
|
|
683
|
+
let gestureType = 'tap';
|
|
684
|
+
|
|
685
|
+
// Capture window dimensions at touch time for accurate normalization
|
|
686
|
+
let vpW = 0;
|
|
687
|
+
let vpH = 0;
|
|
688
|
+
let screenW = 0;
|
|
689
|
+
let screenH = 0;
|
|
690
|
+
let statusBarHeight = 0;
|
|
691
|
+
try {
|
|
692
|
+
const { Dimensions, StatusBar, Platform } = require('react-native');
|
|
693
|
+
const dims = Dimensions.get('window');
|
|
694
|
+
vpW = dims.width;
|
|
695
|
+
vpH = dims.height;
|
|
696
|
+
const scr = Dimensions.get('screen');
|
|
697
|
+
screenW = scr.width;
|
|
698
|
+
screenH = scr.height;
|
|
699
|
+
statusBarHeight = Platform.OS === 'android' ? (StatusBar.currentHeight || 0) : 0;
|
|
700
|
+
} catch { /* no-throw */ }
|
|
701
|
+
|
|
702
|
+
// Re-measure the root view so its on-screen rect is fresh for this tap.
|
|
703
|
+
measureRoot();
|
|
704
|
+
const rootRect = rootRectRef.current;
|
|
705
|
+
|
|
706
|
+
// WHAT was tapped, resolved from the React fiber on the touch event. Without this the tap
|
|
707
|
+
// carries only coordinates, so every tap in the app groups into one row per gesture type.
|
|
708
|
+
// Defensive by construction — returns undefined rather than throwing (see touchTarget.ts).
|
|
709
|
+
/**
|
|
710
|
+
* Resolved ONCE, so `target` and `targetId` cannot disagree about the same tap.
|
|
711
|
+
*
|
|
712
|
+
* The previous shape called `resolveTouchTarget(e)` inline for `target` while
|
|
713
|
+
* `targetId` came only from `start` — so on the fallback path (no JS start, or a
|
|
714
|
+
* refused correlation) the tap carried a description with NO id, and the two fields
|
|
715
|
+
* were computed from different sources. Anything joining on `targetId` therefore
|
|
716
|
+
* saw nothing for a tap that visibly had a target.
|
|
717
|
+
*/
|
|
718
|
+
const freshTarget = start ? null : resolveTouchTarget(e);
|
|
719
|
+
const tapped = start?.target ?? describeTouchTarget(freshTarget);
|
|
720
|
+
const identity = start
|
|
721
|
+
? { id: start.targetId, source: start.targetSource }
|
|
722
|
+
: targetIdentity(freshTarget);
|
|
723
|
+
|
|
724
|
+
const gestureDetails: any = {
|
|
725
|
+
target: tapped,
|
|
726
|
+
interactionId: start?.interactionId ?? generateInteractionId(),
|
|
727
|
+
interactionProtocol: INTERACTION_PROTOCOL_VERSION,
|
|
728
|
+
occurredAt: start?.occurredAt ?? Date.now(),
|
|
729
|
+
ui: start?.ui,
|
|
730
|
+
stateStatus: start?.stateStatus ?? 'not_captured',
|
|
731
|
+
targetId: identity.id,
|
|
732
|
+
targetSource: identity.source,
|
|
733
|
+
screenName: start?.screenName,
|
|
734
|
+
screenSource: start?.screenSource ?? 'none',
|
|
735
|
+
targetRect: start?.targetRect,
|
|
736
|
+
scrollX: start?.scrollX,
|
|
737
|
+
scrollY: start?.scrollY,
|
|
738
|
+
scrollSource: start?.scrollSource ?? 'none',
|
|
739
|
+
itemKey: start?.itemKey,
|
|
740
|
+
itemIndex: start?.itemIndex,
|
|
741
|
+
emitAutomaticAnalytics: start?.emitAutomaticAnalytics ?? captureAutomaticInteractions,
|
|
742
|
+
x: start?.x ?? touch.pageX,
|
|
743
|
+
y: start?.y ?? touch.pageY,
|
|
744
|
+
pageX: start?.x ?? touch.pageX,
|
|
745
|
+
pageY: start?.y ?? touch.pageY,
|
|
746
|
+
locationX: start?.locationX ?? touch.locationX,
|
|
747
|
+
locationY: start?.locationY ?? touch.locationY,
|
|
748
|
+
viewportWidth: vpW > 0 ? vpW : undefined,
|
|
749
|
+
viewportHeight: vpH > 0 ? vpH : undefined,
|
|
750
|
+
};
|
|
751
|
+
|
|
752
|
+
// Normalize against the measured root-view SIZE — the exact view the
|
|
753
|
+
// screenshot captures (Android: R.id.content, iOS: window root).
|
|
754
|
+
// pageX/pageY are ALREADY relative to the RN root view, which shares the
|
|
755
|
+
// screenshot's origin. Do NOT subtract rootRect.x/y: on Android
|
|
756
|
+
// measureInWindow returns rootRect.y = statusBarHeight, so subtracting it
|
|
757
|
+
// double-counts the status bar and pushes every marker upward.
|
|
758
|
+
if (rootRect && rootRect.w > 0 && rootRect.h > 0) {
|
|
759
|
+
const nx = Math.max(0, Math.min(1, (start?.x ?? touch.pageX) / rootRect.w));
|
|
760
|
+
const ny = Math.max(0, Math.min(1, (start?.y ?? touch.pageY) / rootRect.h));
|
|
761
|
+
gestureDetails.normalizedX = nx;
|
|
762
|
+
gestureDetails.normalizedY = ny;
|
|
763
|
+
/**
|
|
764
|
+
* RN-15 on the JS-fallback lane.
|
|
765
|
+
*
|
|
766
|
+
* Computed here rather than in the literal above because that is where nx/ny first
|
|
767
|
+
* exist. The rect is the SAME one the native lane uses, so one physical tap yields
|
|
768
|
+
* the same local position whichever lane captured it — two lanes disagreeing about
|
|
769
|
+
* where in a control a tap landed would be worse than neither reporting it.
|
|
770
|
+
*/
|
|
771
|
+
const lp = localPoint(start?.targetRect ?? null, nx, ny);
|
|
772
|
+
if (lp) {
|
|
773
|
+
gestureDetails.localU = lp.u;
|
|
774
|
+
gestureDetails.localV = lp.v;
|
|
775
|
+
}
|
|
776
|
+
gestureDetails.normalizedPrecomputed = true;
|
|
777
|
+
gestureDetails.viewportWidth = rootRect.w;
|
|
778
|
+
gestureDetails.viewportHeight = rootRect.h;
|
|
779
|
+
gestureDetails.coordinateSpace = 'js-root-measured';
|
|
780
|
+
gestureDetails.rootViewTop = rootRect.y;
|
|
781
|
+
gestureDetails.rootViewLeft = rootRect.x;
|
|
782
|
+
}
|
|
783
|
+
gestureDetails.statusBarHeight = statusBarHeight;
|
|
784
|
+
gestureDetails.screenWidth = screenW;
|
|
785
|
+
gestureDetails.screenHeight = screenH;
|
|
786
|
+
// Diagnostic-only: carry root-view & window dims through to the unified
|
|
787
|
+
// [TapDiag] log. NOT used for normalization decisions in SessionManager.
|
|
788
|
+
gestureDetails.windowWidth = vpW > 0 ? vpW : undefined;
|
|
789
|
+
gestureDetails.windowHeight = vpH > 0 ? vpH : undefined;
|
|
790
|
+
if (rootRect && rootRect.w > 0 && rootRect.h > 0) {
|
|
791
|
+
gestureDetails.rootViewWidth = rootRect.w;
|
|
792
|
+
gestureDetails.rootViewHeight = rootRect.h;
|
|
793
|
+
}
|
|
794
|
+
gestureDetails.platform = gestureDetails.platform ?? require('react-native').Platform.OS;
|
|
795
|
+
|
|
796
|
+
try {
|
|
797
|
+
const { logger } = require('../../core/logger/internalLogger');
|
|
798
|
+
logger?.debug?.(
|
|
799
|
+
`[TapAccuracy] platform=js-path raw=(${Math.round(touch.pageX)},${Math.round(touch.pageY)}) ` +
|
|
800
|
+
`normalized=(${gestureDetails.normalizedX?.toFixed?.(4)},${gestureDetails.normalizedY?.toFixed?.(4)}) ` +
|
|
801
|
+
`rootRect=(${rootRect ? `${Math.round(rootRect.x)},${Math.round(rootRect.y)},${Math.round(rootRect.w)}x${Math.round(rootRect.h)}` : 'none'}) ` +
|
|
802
|
+
`statusBar=${statusBarHeight} window=(${vpW}x${vpH}) screen=(${screenW}x${screenH}) space=js-root-measured`
|
|
803
|
+
);
|
|
804
|
+
} catch { /* no-throw */ }
|
|
805
|
+
|
|
806
|
+
if (start) {
|
|
807
|
+
const dx = touch.pageX - start.x;
|
|
808
|
+
const dy = touch.pageY - start.y;
|
|
809
|
+
const dist = Math.sqrt(dx * dx + dy * dy);
|
|
810
|
+
const duration = Date.now() - start.occurredAt;
|
|
811
|
+
gestureDetails.duration = duration;
|
|
812
|
+
|
|
813
|
+
if (dist >= 15) {
|
|
814
|
+
// Movement gesture: swipe or scroll
|
|
815
|
+
gestureDetails.endX = touch.pageX;
|
|
816
|
+
gestureDetails.endY = touch.pageY;
|
|
817
|
+
|
|
818
|
+
if (Math.abs(dy) > Math.abs(dx)) {
|
|
819
|
+
gestureType = 'scroll';
|
|
820
|
+
gestureDetails.direction = dy > 0 ? 'down' : 'up';
|
|
821
|
+
gestureDetails.distance = Math.abs(dy);
|
|
822
|
+
} else {
|
|
823
|
+
gestureType = 'swipe';
|
|
824
|
+
gestureDetails.direction = dx > 0 ? 'right' : 'left';
|
|
825
|
+
gestureDetails.distance = Math.abs(dx);
|
|
826
|
+
}
|
|
827
|
+
} else if (duration > 500) {
|
|
828
|
+
gestureType = 'long_press';
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
// Feed the Engage gesture detector (rage_tap / dead_tap) — only committed
|
|
833
|
+
// taps, not swipes/scrolls/long-presses. Pure JS, cross-platform; emits the
|
|
834
|
+
// unified `$gesture` signal the engage trigger engine listens for.
|
|
835
|
+
if (gestureType === 'tap') {
|
|
836
|
+
try {
|
|
837
|
+
const { gestureTriggerDetector } = require('../engage/gestureTriggerDetector');
|
|
838
|
+
gestureTriggerDetector.recordTap({
|
|
839
|
+
x: start?.x ?? touch.pageX,
|
|
840
|
+
y: start?.y ?? touch.pageY,
|
|
841
|
+
hasTarget: !!(start?.targetId || start?.target),
|
|
842
|
+
screen: start?.screenName,
|
|
843
|
+
});
|
|
844
|
+
} catch { /* no-throw */ }
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
// Emit gesture event to SessionManager for desktop-controlled recording.
|
|
848
|
+
// Native tracker produces high-confidence coords; JS is a fallback only.
|
|
849
|
+
//
|
|
850
|
+
// Race condition fix: the JS onTouchEnd fires BEFORE the native event
|
|
851
|
+
// crosses the bridge. Without guarding, the pipeline's 100ms dedup window
|
|
852
|
+
// drops the native event and keeps the JS-estimated coords (which can be
|
|
853
|
+
// wrong when measureInWindow hasn't resolved or the base differs from the
|
|
854
|
+
// screenshot capture view). Three-tier suppression:
|
|
855
|
+
// 1. Native confirmed active → skip JS entirely (native handles all touches)
|
|
856
|
+
// 2. Native event within 300ms → skip (existing dedup)
|
|
857
|
+
// 3. First touch (native not yet confirmed) → defer 600ms to let native arrive
|
|
858
|
+
const sinceNative = Date.now() - lastNativeTouchTsRef.current;
|
|
859
|
+
if (nativeTrackingConfirmedRef.current) {
|
|
860
|
+
// Native tracker is active — skip JS path entirely
|
|
861
|
+
} else if (sinceNative <= 300) {
|
|
862
|
+
// Native event arrived recently — skip (dedup)
|
|
863
|
+
} else {
|
|
864
|
+
// Native not yet confirmed — defer emission to give native time to arrive.
|
|
865
|
+
// If native fires during the delay, it cancels this pending emit.
|
|
866
|
+
const capturedType = gestureType;
|
|
867
|
+
const capturedDetails = { ...gestureDetails };
|
|
868
|
+
const interactionId = capturedDetails.interactionId as string;
|
|
869
|
+
const timer = setTimeout(() => {
|
|
870
|
+
pendingJsEmitsRef.current.delete(interactionId);
|
|
871
|
+
if (nativeTrackingConfirmedRef.current) return;
|
|
872
|
+
try {
|
|
873
|
+
const { SessionManager } = require('../session/SessionManager');
|
|
874
|
+
const sm = SessionManager.getExistingInstance();
|
|
875
|
+
if (sm && (sm as any).onGestureDetected) {
|
|
876
|
+
(sm as any).onGestureDetected(capturedType, {
|
|
877
|
+
...capturedDetails,
|
|
878
|
+
confidence: 'medium',
|
|
879
|
+
source: 'js-touch-handler',
|
|
880
|
+
});
|
|
881
|
+
}
|
|
882
|
+
} catch { /* no-throw */ }
|
|
883
|
+
// 600ms, was 200ms. The race this defer exists for happens on the FIRST tap of a
|
|
884
|
+
// mount: native isn't confirmed yet, JS emitted at 200ms, then the first native
|
|
885
|
+
// event crossed the bridge at ~300-400ms — recording the same tap TWICE, with the
|
|
886
|
+
// JS copy missing normalizedX/Y whenever the async root-view measure hadn't
|
|
887
|
+
// resolved (an interaction the heatmap cannot place). QA hit exactly this pair.
|
|
888
|
+
// The wider defer lets the first native event cancel the JS emission instead; on
|
|
889
|
+
// devices with no native tracker at all it merely delays a background emission,
|
|
890
|
+
// which nothing user-visible waits on.
|
|
891
|
+
}, 600);
|
|
892
|
+
pendingJsEmitsRef.current.set(interactionId, timer);
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
touchStartRef.current = null;
|
|
896
|
+
} catch { /* no-throw */ }
|
|
897
|
+
};
|
|
898
|
+
|
|
899
|
+
return (
|
|
900
|
+
<View
|
|
901
|
+
ref={rootRef}
|
|
902
|
+
style={styles.root}
|
|
903
|
+
collapsable={false}
|
|
904
|
+
onStartShouldSetResponderCapture={() => {
|
|
905
|
+
return false; // Don't consume — just observe
|
|
906
|
+
}}
|
|
907
|
+
onMoveShouldSetResponderCapture={() => false}
|
|
908
|
+
onTouchStart={handleTouchStart}
|
|
909
|
+
onTouchEnd={handleTouchEnd}
|
|
910
|
+
>
|
|
911
|
+
<JourneyContext.Provider value={managerRef.current}>
|
|
912
|
+
{children}
|
|
913
|
+
</JourneyContext.Provider>
|
|
914
|
+
</View>
|
|
915
|
+
);
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
// ─── ScaleBunScreen Beacon ───────────────────────────────────────────────────────
|
|
919
|
+
|
|
920
|
+
interface ScaleBunScreenProps {
|
|
921
|
+
name: string;
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
/**
|
|
925
|
+
* Screen beacon component — registers the current screen name.
|
|
926
|
+
* Place it at the top of each screen component:
|
|
927
|
+
* <ScaleBunScreen name="HomeScreen" />
|
|
928
|
+
*/
|
|
929
|
+
export function ScaleBunScreen({ name }: ScaleBunScreenProps) {
|
|
930
|
+
useScaleBunScreen(name);
|
|
931
|
+
return null; // Invisible beacon
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
/**
|
|
935
|
+
* Screen beacon hook — registers the current screen name.
|
|
936
|
+
* Use in screen components:
|
|
937
|
+
* useScaleBunScreen("HomeScreen");
|
|
938
|
+
*/
|
|
939
|
+
export function useScaleBunScreen(name: string): void {
|
|
940
|
+
const manager = useContext(JourneyContext);
|
|
941
|
+
|
|
942
|
+
useEffect(() => {
|
|
943
|
+
// === CANONICAL SCREEN_VIEW SOURCE ===
|
|
944
|
+
// This hook is the SOLE source of SCREEN_VIEW session events.
|
|
945
|
+
// SessionManager.onScreenChange() emits the canonical SCREEN_VIEW
|
|
946
|
+
// event into the unified pipeline. No other code path emits SCREEN_VIEW.
|
|
947
|
+
//
|
|
948
|
+
// JourneyManager.nav.setScreen() is NOT a session event — it only
|
|
949
|
+
// records the current screen name for gesture step labeling context.
|
|
950
|
+
|
|
951
|
+
// Feed SessionManager first (canonical SCREEN_VIEW)
|
|
952
|
+
try {
|
|
953
|
+
const { SessionManager } = require('../session/SessionManager');
|
|
954
|
+
const sm = SessionManager.getExistingInstance();
|
|
955
|
+
// Always call onScreenChange — SessionManager.onScreenChange() has
|
|
956
|
+
// its own `if (!this.active) return` guard that correctly evaluates
|
|
957
|
+
// at call time. We must NOT gate here because useEffect only runs at
|
|
958
|
+
// mount/name-change, not when isActive changes. Gating here causes
|
|
959
|
+
// Record-after-mount to permanently miss screen registrations.
|
|
960
|
+
if (sm && (sm as any).onScreenChange) {
|
|
961
|
+
(sm as any).onScreenChange(name);
|
|
962
|
+
}
|
|
963
|
+
} catch { /* no-throw */ }
|
|
964
|
+
|
|
965
|
+
/**
|
|
966
|
+
* RN-8 — TELL THE DETECTOR TOO, because interactions read their screen from IT.
|
|
967
|
+
*
|
|
968
|
+
* This hook fed SessionManager, PerformanceFeature, ProfilerFeature and JourneyManager
|
|
969
|
+
* — four consumers — and never `AutoScreenDetector`. But `handleTouchStart` resolves an
|
|
970
|
+
* interaction's `screenName` from `AutoScreenDetector.getCurrentScreen()`, so a
|
|
971
|
+
* manually-instrumented app produced perfectly-named SCREEN_VIEW events while every TAP
|
|
972
|
+
* carried no screen at all. `setManualScreen` existed and was called only by tests.
|
|
973
|
+
*
|
|
974
|
+
* That is the whole story for apps the auto-hook cannot help: expo-router, a custom
|
|
975
|
+
* navigator, anything not `@react-navigation/native`. The documented manual escape hatch
|
|
976
|
+
* did not reach the one field that partitions every heatmap.
|
|
977
|
+
*
|
|
978
|
+
* Requires the last-writer-wins fix in `_currentScreen()` to be useful: under the
|
|
979
|
+
* previous rule a manual screen was readable for only 2000 ms, so wiring this alone
|
|
980
|
+
* would have handed interactions a name that expired before most taps happened.
|
|
981
|
+
*/
|
|
982
|
+
try {
|
|
983
|
+
const { AutoScreenDetector } = require('../navigation/AutoScreenDetector');
|
|
984
|
+
AutoScreenDetector.getInstance().setManualScreen(name);
|
|
985
|
+
} catch { /* no-throw */ }
|
|
986
|
+
|
|
987
|
+
// Feed PerformanceFeature (screen context for perf metrics)
|
|
988
|
+
// NOTE: Only sets screen identity. Does NOT call markScreenLoadStart/End.
|
|
989
|
+
// AutoScreenLoadCollector handles timing independently via rAF + InteractionManager.
|
|
990
|
+
try {
|
|
991
|
+
const bs = getBootstrap();
|
|
992
|
+
const perfFeature = bs?.getPerformanceFeature?.();
|
|
993
|
+
if (perfFeature) {
|
|
994
|
+
perfFeature.setCurrentScreen(name);
|
|
995
|
+
}
|
|
996
|
+
} catch { /* no-throw */ }
|
|
997
|
+
|
|
998
|
+
// Feed ProfilerFeature (screen context for profiler samples)
|
|
999
|
+
// This sets screenKey on all subsequent profiler samples,
|
|
1000
|
+
// enabling screen visit extraction and per-screen correlation on desktop.
|
|
1001
|
+
try {
|
|
1002
|
+
const bs = getBootstrap();
|
|
1003
|
+
const profilerFeature = bs?.getProfilerFeature?.();
|
|
1004
|
+
if (profilerFeature) {
|
|
1005
|
+
profilerFeature.setCurrentScreen(name);
|
|
1006
|
+
}
|
|
1007
|
+
} catch { /* no-throw */ }
|
|
1008
|
+
|
|
1009
|
+
// NOTE: Auto-capture for performance preview is triggered from
|
|
1010
|
+
// PerformanceFeature.autoScreenLoadCollector callback, NOT here.
|
|
1011
|
+
// useScaleBunScreen uses developer-specified names (e.g. 'HomeScreen')
|
|
1012
|
+
// while perf metrics use React Navigation route names (e.g. 'HomeMain').
|
|
1013
|
+
// Triggering capture here would save screenshots under the wrong key.
|
|
1014
|
+
|
|
1015
|
+
// Feed JourneyManager (gesture context only, NOT a session event)
|
|
1016
|
+
if (!manager) {
|
|
1017
|
+
try {
|
|
1018
|
+
const bs = getBootstrap();
|
|
1019
|
+
const transport = bs?._getTransport();
|
|
1020
|
+
if (transport && bs?._isJourneyEnabled()) {
|
|
1021
|
+
const JM = require('./journeyManager').JourneyManager;
|
|
1022
|
+
const fallback = JM.getInstance(transport);
|
|
1023
|
+
fallback.nav.setScreen(name);
|
|
1024
|
+
}
|
|
1025
|
+
} catch { /* no-throw */ }
|
|
1026
|
+
return;
|
|
1027
|
+
}
|
|
1028
|
+
try {
|
|
1029
|
+
manager.nav.setScreen(name);
|
|
1030
|
+
} catch { /* no-throw */ }
|
|
1031
|
+
}, [name, manager]);
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
// ─── Styles ─────────────────────────────────────────────────────────────────
|
|
1035
|
+
// IMPORTANT: Do NOT use StyleSheet.create() here.
|
|
1036
|
+
// In RN 0.84 bridgeless mode, StyleSheet.create() calls
|
|
1037
|
+
// PixelRatio.roundToNearestPixel() which accesses DeviceInfo TurboModule.
|
|
1038
|
+
// At module-load time, the TurboModule runtime isn't ready yet → crash.
|
|
1039
|
+
// Plain objects work identically for simple styles.
|
|
1040
|
+
|
|
1041
|
+
const styles = {
|
|
1042
|
+
root: {
|
|
1043
|
+
flex: 1,
|
|
1044
|
+
} as const,
|
|
1045
|
+
};
|