@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,769 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ScaleBun SDK — SDK Bootstrapper
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates the core SDK initialization sequence.
|
|
5
|
+
* Called by ScaleBunFacade.init() — this is the single real init path.
|
|
6
|
+
*
|
|
7
|
+
* Responsibilities:
|
|
8
|
+
* - Config validation and merge with defaults
|
|
9
|
+
* - Core service setup (HttpClient, Dispatcher, FlushScheduler)
|
|
10
|
+
* - Backend handshake
|
|
11
|
+
* - Feature registration and initialization via FeatureRegistry
|
|
12
|
+
* - App lifecycle wiring
|
|
13
|
+
*
|
|
14
|
+
* Returns null on failure (handshake fail, invalid config) to allow
|
|
15
|
+
* the Facade to handle gracefully without crashing.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { Linking, Platform } from 'react-native';
|
|
19
|
+
import { ConfigSchema, type ScaleBunConfig } from '../core/config/schema';
|
|
20
|
+
import { DEFAULT_API_BASE_URL } from '../core/constants/endpoints';
|
|
21
|
+
import { logger, LogLevel } from '../core/logger/internalLogger';
|
|
22
|
+
import { coreContainer } from '../core/di/container';
|
|
23
|
+
import { HttpClient } from '../transport/http/httpClient';
|
|
24
|
+
import { ENDPOINTS } from '../transport/http/endpoints';
|
|
25
|
+
import { sdkSession } from '../transport/auth/sdkSession';
|
|
26
|
+
import { getDeviceId } from '../core/id/deviceId';
|
|
27
|
+
import { FlushScheduler } from '../pipeline/scheduler/flushScheduler';
|
|
28
|
+
import { Dispatcher } from '../pipeline/dispatcher/dispatcher';
|
|
29
|
+
import { appLifecycle } from '../core/lifecycle/appLifecycle';
|
|
30
|
+
import { FeatureRegistry } from './FeatureRegistry';
|
|
31
|
+
import { NetworkFeature } from '../features/network/NetworkFeature';
|
|
32
|
+
import { CrashFeature } from '../features/crash/CrashFeature';
|
|
33
|
+
import { NativeCrashFeature } from '../features/crash/NativeCrashFeature';
|
|
34
|
+
import { getCrashReporter, DesktopEventSink, BackendErrorsSink } from '../features/crash/CrashReporter';
|
|
35
|
+
import { PerformanceFeature } from '../features/performance/PerformanceFeature';
|
|
36
|
+
import { PersistentQueue } from '../pipeline/queue/persistentQueue';
|
|
37
|
+
import { createStorageBackend, MemoryBackend } from '../storage/StorageBackend';
|
|
38
|
+
import { SessionManager } from '../features/session/SessionManager';
|
|
39
|
+
import type { SessionReplayConfig } from '../features/session/sessionTypes';
|
|
40
|
+
import { nativeCapture } from '../features/session/nativeCapture';
|
|
41
|
+
import { installAlertInstrumentation, uninstallAlertInstrumentation } from '../features/replay/integrations/alert/alertInstrumentation';
|
|
42
|
+
import { installConsoleIntegration, uninstallConsoleIntegration } from '../features/replay/integrations/logs/consoleIntegration';
|
|
43
|
+
import { BackendSessionAdapter } from '../features/session/BackendSessionAdapter';
|
|
44
|
+
import { generateSessionId } from '../features/replay/core/ids/sessionId';
|
|
45
|
+
import type { FeatureContext } from '../core/contracts/IFeature';
|
|
46
|
+
import type { ScaleBunFeatures } from '../public/types';
|
|
47
|
+
import { emitAutomaticEvent } from '../analytics/automaticEvents';
|
|
48
|
+
import { quotaState } from '../config/quotaState';
|
|
49
|
+
|
|
50
|
+
export interface BootstrapResult {
|
|
51
|
+
config: ScaleBunConfig;
|
|
52
|
+
featureRegistry: FeatureRegistry;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export class SDKBootstrapper {
|
|
56
|
+
private featureRegistry = new FeatureRegistry();
|
|
57
|
+
private config: ScaleBunConfig | null = null;
|
|
58
|
+
// Wall-clock (ms) the app last went to background, or null while foregrounded.
|
|
59
|
+
// Read on the next foreground to decide whether the backgrounded span exceeded
|
|
60
|
+
// sessionBackgroundCapMs (→ finalize + new session) or stays within one session.
|
|
61
|
+
private _backgroundedAt: number | null = null;
|
|
62
|
+
private _orientationSub: { remove?: () => void } | null = null;
|
|
63
|
+
/** quotaState subscription that re-opens a session when a `sessions` block lifts. */
|
|
64
|
+
private _sessionsQuotaUnsub: (() => void) | null = null;
|
|
65
|
+
/**
|
|
66
|
+
* Set when a `sessions` block lifted while the app was NOT in the foreground (or before the
|
|
67
|
+
* adapter could open a session). Honored on the next foreground: the analytics session opens there
|
|
68
|
+
* anyway, but recording would otherwise only restart with finalizeOnBackground.
|
|
69
|
+
*/
|
|
70
|
+
private _recordAfterSessionsUnblock = false;
|
|
71
|
+
/** Whether cold-launch auto-record applies (replay.record !== false); set when the adapter is built. */
|
|
72
|
+
private _autoRecord = false;
|
|
73
|
+
private _lastOrientation: 'portrait' | 'landscape' | null = null;
|
|
74
|
+
private _memorySub: { remove?: () => void } | null = null;
|
|
75
|
+
private _deepLinkUnsubscribe: (() => void) | null = null;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Run the full SDK initialization sequence.
|
|
79
|
+
*
|
|
80
|
+
* Returns BootstrapResult on success, null on failure.
|
|
81
|
+
* Never throws — all errors are caught and logged.
|
|
82
|
+
*
|
|
83
|
+
* @param rawConfig - Raw user-provided config (validated via the internal protocol validator)
|
|
84
|
+
* @param trackFn - Function to track events (from Facade)
|
|
85
|
+
* @param flushFn - Function to flush events (from Facade)
|
|
86
|
+
* @param features - Feature flags (all default true — opt-out model)
|
|
87
|
+
*/
|
|
88
|
+
async bootstrap(
|
|
89
|
+
rawConfig: unknown,
|
|
90
|
+
trackFn: (name: string, payload?: Record<string, unknown>) => void,
|
|
91
|
+
flushFn: () => Promise<void>,
|
|
92
|
+
features: ScaleBunFeatures = {},
|
|
93
|
+
): Promise<BootstrapResult | null> {
|
|
94
|
+
// ── Validate config ────────────────────────────────────
|
|
95
|
+
// `captureMode: 'frequency'` is no longer a developer-settable option — timer-based capture
|
|
96
|
+
// is reserved for ScaleBun-controlled (server/admin) activation. Coerce a legacy developer
|
|
97
|
+
// value to the default rather than hard-failing: an invalid config aborts the ENTIRE SDK
|
|
98
|
+
// boot (return null below), so silently downgrading is the safe, backward-compatible path.
|
|
99
|
+
let cfg = rawConfig;
|
|
100
|
+
const rc = rawConfig as { replay?: { captureMode?: string } } | null | undefined;
|
|
101
|
+
if (rc?.replay?.captureMode === 'frequency') {
|
|
102
|
+
logger.warn(
|
|
103
|
+
"replay.captureMode 'frequency' is no longer developer-settable; falling back to 'interactions'. Frequency capture is controlled by ScaleBun.",
|
|
104
|
+
);
|
|
105
|
+
cfg = { ...(rc as object), replay: { ...rc.replay, captureMode: 'interactions' } };
|
|
106
|
+
}
|
|
107
|
+
const result = ConfigSchema.safeParse(cfg);
|
|
108
|
+
if (!result.success) {
|
|
109
|
+
logger.error('Invalid configuration:', result.error.format());
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
this.config = result.data;
|
|
114
|
+
// apiBaseUrl is LOCKED: whatever an integrator passed (or the schema default) is
|
|
115
|
+
// discarded here so the SDK can never be repointed away from the ScaleBun cloud.
|
|
116
|
+
// Change DEFAULT_API_BASE_URL at build time to target a different backend.
|
|
117
|
+
// Say so when we discard it. The value was accepted by the schema, silently
|
|
118
|
+
// overwritten here, and the SDK then talked to a different server than the
|
|
119
|
+
// integrator configured — with no log, no warning, and no error. Someone
|
|
120
|
+
// pointing the SDK at a staging or local backend would watch requests arrive
|
|
121
|
+
// at production and have nothing to go on.
|
|
122
|
+
const requestedApiBaseUrl = (rawConfig as any)?.apiBaseUrl;
|
|
123
|
+
if (
|
|
124
|
+
typeof requestedApiBaseUrl === 'string' &&
|
|
125
|
+
requestedApiBaseUrl &&
|
|
126
|
+
requestedApiBaseUrl !== DEFAULT_API_BASE_URL
|
|
127
|
+
) {
|
|
128
|
+
logger.warn(
|
|
129
|
+
`[ScaleBun] Ignoring apiBaseUrl '${requestedApiBaseUrl}' — the endpoint is ` +
|
|
130
|
+
`locked at build time and this build targets ${DEFAULT_API_BASE_URL}. To ` +
|
|
131
|
+
`target another backend, change DEFAULT_API_BASE_URL in the SDK source and ` +
|
|
132
|
+
`rebuild.`,
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
this.config.apiBaseUrl = DEFAULT_API_BASE_URL;
|
|
136
|
+
// Explicit logLevel wins; otherwise debug:true implies verbose 'debug'.
|
|
137
|
+
if (this.config.logLevel) {
|
|
138
|
+
logger.setLevelByName(this.config.logLevel);
|
|
139
|
+
} else if (this.config.debug) {
|
|
140
|
+
logger.setLevel(LogLevel.DEBUG);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// ── Core services ──────────────────────────────────────
|
|
144
|
+
|
|
145
|
+
// ── Persistent Queue ───────────────────────────────────
|
|
146
|
+
const persistenceConfig = this.config.persistence;
|
|
147
|
+
const storageBackend = persistenceConfig.enabled
|
|
148
|
+
? createStorageBackend()
|
|
149
|
+
: new MemoryBackend();
|
|
150
|
+
|
|
151
|
+
const persistentQueue = coreContainer.register(
|
|
152
|
+
'PersistentQueue',
|
|
153
|
+
new PersistentQueue(storageBackend, persistenceConfig),
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
// Drain leftover envelopes from previous run BEFORE accepting new ones.
|
|
157
|
+
// These are flushed immediately so crash-time events are not lost.
|
|
158
|
+
const leftovers = persistentQueue.drainLeftovers();
|
|
159
|
+
if (leftovers.length > 0) {
|
|
160
|
+
__DEV__ && logger.info(`[Bootstrap] ${leftovers.length} leftover envelopes from previous run — will flush`);
|
|
161
|
+
// Re-add to queue so the normal flush cycle picks them up
|
|
162
|
+
for (const envelope of leftovers) {
|
|
163
|
+
persistentQueue.add(envelope);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const httpClient = coreContainer.register(
|
|
168
|
+
'HttpClient',
|
|
169
|
+
new HttpClient(this.config.apiBaseUrl),
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
// D1: a `Dispatcher` used to be registered here, draining `memoryQueue`
|
|
173
|
+
// to ENDPOINTS.EVENTS ('/sdk/events'). Removed on two grounds, both
|
|
174
|
+
// verified: nothing anywhere resolved 'Dispatcher' from the container
|
|
175
|
+
// (so its flush never ran and the queue was a black hole), and no
|
|
176
|
+
// backend controller has ever served '/sdk/events' — even a wired
|
|
177
|
+
// dispatcher would have 404'd forever. Every producer that wrote into
|
|
178
|
+
// that pipeline now rides a live lane instead (captureException →
|
|
179
|
+
// CrashReporter, native-crash detail → report metadata, metrics →
|
|
180
|
+
// queuePerformanceMetric). A decoy pipeline is worse than none: it
|
|
181
|
+
// makes the real path look redundant.
|
|
182
|
+
|
|
183
|
+
const scheduler = coreContainer.register(
|
|
184
|
+
'FlushScheduler',
|
|
185
|
+
new FlushScheduler(flushFn),
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
// ── Backend handshake ──────────────────────────────────
|
|
189
|
+
if (this.config.clientKey) {
|
|
190
|
+
// SaaS mode: clientKey is resolved by SdkKeyGuard on each request — no token handshake needed
|
|
191
|
+
__DEV__ && logger.info('[Bootstrap] SaaS mode: clientKey auth active, skipping legacy handshake');
|
|
192
|
+
} else {
|
|
193
|
+
__DEV__ && logger.debug('Starting handshake...');
|
|
194
|
+
const response = await httpClient.post(ENDPOINTS.SESSIONS, {
|
|
195
|
+
projectId: this.config.projectId,
|
|
196
|
+
publishableKey: this.config.publishableKey,
|
|
197
|
+
deviceId: getDeviceId(),
|
|
198
|
+
platform: Platform.OS,
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
if (response.status !== 201 || !response.data?.token) {
|
|
202
|
+
logger.error('Failed to establish SDK session:', response.data);
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
sdkSession.setSession(response.data.token, 900);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// ── App lifecycle ──────────────────────────────────────
|
|
210
|
+
appLifecycle.addListener((state) => {
|
|
211
|
+
if (state === 'background') {
|
|
212
|
+
flushFn();
|
|
213
|
+
}
|
|
214
|
+
trackFn('$app_state_change', { state });
|
|
215
|
+
if (state === 'active') {
|
|
216
|
+
emitAutomaticEvent('app_foregrounded');
|
|
217
|
+
} else if (state === 'background') {
|
|
218
|
+
emitAutomaticEvent('app_backgrounded');
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Analytics ingestion session is foreground-scoped (SaaS mode):
|
|
222
|
+
// open on foreground if not already open, finalize on background.
|
|
223
|
+
// Resolved lazily — the adapter is created later in this bootstrap.
|
|
224
|
+
if (this.config?.clientKey) {
|
|
225
|
+
const sessionManager = SessionManager.getExistingInstance();
|
|
226
|
+
const adapter = sessionManager?.getBackendTransport();
|
|
227
|
+
if (adapter) {
|
|
228
|
+
if (state === 'active') {
|
|
229
|
+
// Reconcile-close any session left pending by a prior cap-driven
|
|
230
|
+
// finalize whose POST was suspended by iOS. No-op in the common
|
|
231
|
+
// path (below-cap background does NOT finalize), so this only
|
|
232
|
+
// fires after a real cap finalize or a legacy pending id.
|
|
233
|
+
adapter.reconcilePendingFinalize().catch(() => { });
|
|
234
|
+
|
|
235
|
+
const bgAt = this._backgroundedAt;
|
|
236
|
+
this._backgroundedAt = null;
|
|
237
|
+
const capMs = this.config?.sessionBackgroundCapMs ?? 30 * 60 * 1000;
|
|
238
|
+
const bgMs = bgAt ? Date.now() - bgAt : 0;
|
|
239
|
+
|
|
240
|
+
if (!adapter.analyticsSessionId) {
|
|
241
|
+
// Cold start, or the session was finalized (cap/kill) →
|
|
242
|
+
// open a fresh one.
|
|
243
|
+
const opened = adapter.startAnalyticsSession(this._buildAnalyticsSession());
|
|
244
|
+
opened.catch(() => { });
|
|
245
|
+
// Quota: a sessions block lifted while backgrounded — start the recording
|
|
246
|
+
// the cold launch could not (only when auto-record is on).
|
|
247
|
+
if (this._recordAfterSessionsUnblock && !quotaState.isBlocked('sessions')) {
|
|
248
|
+
this._recordAfterSessionsUnblock = false;
|
|
249
|
+
if (this._autoRecord && sessionManager) {
|
|
250
|
+
opened
|
|
251
|
+
.then(() => { if (!sessionManager.isActive) sessionManager.startSession(); })
|
|
252
|
+
.catch(() => { });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
} else if (bgAt && bgMs > capMs) {
|
|
256
|
+
// Backgrounded past the cap → finalize the old session and
|
|
257
|
+
// open a new one (cap-then-reaper). The finalize POST runs
|
|
258
|
+
// live on foreground so it resolves; the new session opens
|
|
259
|
+
// immediately (disjoint fields).
|
|
260
|
+
adapter.finalizeAnalyticsSession().catch(() => { });
|
|
261
|
+
adapter.startAnalyticsSession(this._buildAnalyticsSession()).catch(() => { });
|
|
262
|
+
} else {
|
|
263
|
+
// Below the cap → KEEP one session across the app-switch.
|
|
264
|
+
// Mark the foreground boundary so the dashboard can shade the
|
|
265
|
+
// backgrounded span and exclude it from active duration.
|
|
266
|
+
adapter.emitLifecycleMarker('APP_FOREGROUND', {
|
|
267
|
+
at: Date.now(),
|
|
268
|
+
...(bgAt ? { backgroundedAt: bgAt, backgroundMs: bgMs } : {}),
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
// Per-foreground recording sessions: reopen on foreground.
|
|
272
|
+
if (this.config?.finalizeOnBackground && sessionManager && !sessionManager.isActive) {
|
|
273
|
+
sessionManager.startSession();
|
|
274
|
+
}
|
|
275
|
+
} else if (state === 'background') {
|
|
276
|
+
this._backgroundedAt = Date.now();
|
|
277
|
+
// Mark the background boundary on the analytics lane BEFORE the
|
|
278
|
+
// flush so its accurate timestamp is captured even if the OS
|
|
279
|
+
// suspends the flush timer immediately after backgrounding.
|
|
280
|
+
adapter.emitLifecycleMarker('APP_BACKGROUND', { at: this._backgroundedAt });
|
|
281
|
+
// Snapshot unflushed frames to durable storage FIRST (sync) so a
|
|
282
|
+
// process kill during/after backgrounding can't lose the last
|
|
283
|
+
// frames — they replay to this session on the next launch. Runs
|
|
284
|
+
// before flushAll so it captures the buffer the network flush
|
|
285
|
+
// (which the OS may suspend) is about to try to send.
|
|
286
|
+
adapter.persistPendingFrames();
|
|
287
|
+
// Flush recording-lane queues so the server reaper computes
|
|
288
|
+
// endedAt from the freshest frames/events even if the OS
|
|
289
|
+
// suspends the flush timer right after backgrounding.
|
|
290
|
+
adapter.flushAll().catch(() => { });
|
|
291
|
+
// Push the marker + any buffered analytics events now (best-effort
|
|
292
|
+
// on iOS). Do NOT finalize — the session spans the background.
|
|
293
|
+
adapter.flushAnalytics().catch(() => { });
|
|
294
|
+
// Opt-in: hard-finalize the recording session on background.
|
|
295
|
+
if (this.config?.finalizeOnBackground && sessionManager?.isActive) {
|
|
296
|
+
sessionManager.endSession();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
// ── Device-context collectors ──────────────────────────
|
|
304
|
+
// Installed ONCE, beside the lifecycle listener rather than inside it (a listener body runs on
|
|
305
|
+
// every foreground/background transition, which would stack a fresh subscription each time).
|
|
306
|
+
this.installOrientationTracking();
|
|
307
|
+
this.installMemoryWarningTracking();
|
|
308
|
+
|
|
309
|
+
// ── Deep-link collection ───────────────────────────────
|
|
310
|
+
// Capture routing structure only. Query values and fragments may contain
|
|
311
|
+
// credentials or PII, so they never enter the automatic event envelope.
|
|
312
|
+
const captureDeepLink = (url: string, initial = false): void => {
|
|
313
|
+
if (!url) return;
|
|
314
|
+
try {
|
|
315
|
+
const parsed = new URL(url);
|
|
316
|
+
emitAutomaticEvent('deep_link_opened', {
|
|
317
|
+
initial,
|
|
318
|
+
scheme: parsed.protocol.replace(/:$/, ''),
|
|
319
|
+
host: parsed.host || undefined,
|
|
320
|
+
path: parsed.pathname || '/',
|
|
321
|
+
query_keys: Array.from(parsed.searchParams.keys()).sort(),
|
|
322
|
+
});
|
|
323
|
+
} catch {
|
|
324
|
+
const safePath = url.split(/[?#]/, 1)[0];
|
|
325
|
+
emitAutomaticEvent('deep_link_opened', {
|
|
326
|
+
initial,
|
|
327
|
+
path: safePath,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
try {
|
|
332
|
+
const subscription = Linking.addEventListener('url', ({ url }) => {
|
|
333
|
+
captureDeepLink(url);
|
|
334
|
+
});
|
|
335
|
+
this._deepLinkUnsubscribe = () => subscription.remove();
|
|
336
|
+
Linking.getInitialURL()
|
|
337
|
+
.then((url) => {
|
|
338
|
+
if (url) captureDeepLink(url, true);
|
|
339
|
+
})
|
|
340
|
+
.catch(() => { });
|
|
341
|
+
} catch (err: any) {
|
|
342
|
+
logger.warn('[Bootstrap] Failed to start deep-link collection:', err?.message);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// ── Start auto-flush ───────────────────────────────────
|
|
346
|
+
scheduler.start(this.config.flushIntervalMs);
|
|
347
|
+
|
|
348
|
+
// ── Register features ──────────────────────────────────
|
|
349
|
+
const featureContext: FeatureContext = {
|
|
350
|
+
trackEvent: trackFn,
|
|
351
|
+
getDebugStream: () => null, // Wired later if debug enabled
|
|
352
|
+
getAppState: () => 'active',
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
// Network monitoring (default: on)
|
|
356
|
+
if (features.network !== false && this.config.enableNetworkMonitoring !== false) {
|
|
357
|
+
this.featureRegistry.register(new NetworkFeature(trackFn, {
|
|
358
|
+
captureNetworkBodies: this.config.captureNetworkBodies ?? false, // Opt-in only — must be explicitly enabled by caller
|
|
359
|
+
redactNetwork: true,
|
|
360
|
+
sdkBaseUrl: this.config.apiBaseUrl,
|
|
361
|
+
}));
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Crash reporting (default: on)
|
|
365
|
+
if (features.crashes !== false) {
|
|
366
|
+
// Central reporter fans every crash origin (JS uncaught, handled,
|
|
367
|
+
// native drain) out to all sinks. Register delivery targets once;
|
|
368
|
+
// new targets can be added later without touching callers.
|
|
369
|
+
const crashReporter = getCrashReporter();
|
|
370
|
+
crashReporter.registerSink(new DesktopEventSink(trackFn));
|
|
371
|
+
crashReporter.registerSink(new BackendErrorsSink());
|
|
372
|
+
|
|
373
|
+
this.featureRegistry.register(new CrashFeature(flushFn));
|
|
374
|
+
this.featureRegistry.register(new NativeCrashFeature());
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Performance monitoring (default: on). Map the tiered, default-safe
|
|
378
|
+
// activation flags from validated config onto the collector config.
|
|
379
|
+
if (features.performance !== false) {
|
|
380
|
+
const perf = this.config.performance;
|
|
381
|
+
this.featureRegistry.register(new PerformanceFeature({
|
|
382
|
+
enabled: perf.enabled,
|
|
383
|
+
appLaunch: perf.tier1.appLaunch,
|
|
384
|
+
screenLoad: perf.tier1.screenLoad,
|
|
385
|
+
networkPerf: perf.tier1.network,
|
|
386
|
+
uiHangs: perf.tier1.uiHang,
|
|
387
|
+
tier2Enabled: perf.tier2.enabled,
|
|
388
|
+
tier2SampleRate: perf.tier2.sampleRate,
|
|
389
|
+
}));
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
await this.featureRegistry.initializeAll(featureContext);
|
|
393
|
+
|
|
394
|
+
// ── Session Replay Initialization (Core) ───────────────
|
|
395
|
+
/**
|
|
396
|
+
* RN-3 zero-config scroll instrumentation, opt-in.
|
|
397
|
+
*
|
|
398
|
+
* Placed before replay init because it patches a module export and must be in place before the
|
|
399
|
+
* host renders its first scroll view. Reports rather than assumes: the equivalent React
|
|
400
|
+
* Navigation hook once claimed success it had not verified and left a whole pipeline silently
|
|
401
|
+
* empty, so a failure here is said out loud with a reason an integrator can act on.
|
|
402
|
+
*/
|
|
403
|
+
if (this.config.autoInstrumentScrollViews === true) {
|
|
404
|
+
try {
|
|
405
|
+
const { autoInstrumentScrollViews } = require('../features/journey/autoInstrumentScroll');
|
|
406
|
+
const outcome = autoInstrumentScrollViews();
|
|
407
|
+
if (!outcome.installed) {
|
|
408
|
+
logger.warn(
|
|
409
|
+
'[Bootstrap] autoInstrumentScrollViews was requested but could not be ' +
|
|
410
|
+
'installed: ' + outcome.reason + ' — taps will carry no content depth.',
|
|
411
|
+
);
|
|
412
|
+
} else {
|
|
413
|
+
__DEV__ && logger.debug('[Bootstrap] ScrollView auto-instrumentation installed');
|
|
414
|
+
}
|
|
415
|
+
} catch { /* no-throw */ }
|
|
416
|
+
}
|
|
417
|
+
if (features.replay !== false) {
|
|
418
|
+
try {
|
|
419
|
+
__DEV__ && logger.debug('[Bootstrap] Initializing unified SessionManager');
|
|
420
|
+
// SB-10: map the public top-level privacy config onto the replay
|
|
421
|
+
// privacy policy — the field the native capture path actually reads.
|
|
422
|
+
// Unspecified fields fall back to the SDK's safe defaults
|
|
423
|
+
// (redactTextInputs: true), so this only ever tightens masking.
|
|
424
|
+
const pub = this.config.privacy ?? {};
|
|
425
|
+
const sessionReplay: Record<string, unknown> = { ...(this.config.replay ?? {}) };
|
|
426
|
+
if (typeof pub.maskTextInputs === 'boolean' || typeof pub.maskImages === 'boolean') {
|
|
427
|
+
sessionReplay.privacyPolicy = {
|
|
428
|
+
redactTextInputs: pub.maskTextInputs ?? true,
|
|
429
|
+
redactImages: pub.maskImages ?? false,
|
|
430
|
+
blockTestIds: [],
|
|
431
|
+
captureExclusions: [],
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
const sessionManager = SessionManager.getInstance(
|
|
436
|
+
null, // No desktop transport initially
|
|
437
|
+
nativeCapture,
|
|
438
|
+
// Flow init `replay` capture config into the unified manager so
|
|
439
|
+
// captureMode/intervalMs are honored (without this it always uses
|
|
440
|
+
// the 'navigation' default → no frames on a static screen).
|
|
441
|
+
// Also flow the Feature #4 heatmap flag so tap/gesture coords
|
|
442
|
+
// route to the analytics lane even when no recording is active.
|
|
443
|
+
{
|
|
444
|
+
sessionReplay: sessionReplay as Partial<SessionReplayConfig>,
|
|
445
|
+
captureInteractionHeatmap: this.config.captureInteractionHeatmap === true,
|
|
446
|
+
}
|
|
447
|
+
);
|
|
448
|
+
|
|
449
|
+
// Attach backend upload transport since this is the primary telemetry sink for prod
|
|
450
|
+
if (this.config.apiBaseUrl) {
|
|
451
|
+
const backendAdapter = new BackendSessionAdapter({
|
|
452
|
+
endpoint: this.config.apiBaseUrl,
|
|
453
|
+
clientKey: this.config.clientKey,
|
|
454
|
+
idleThresholdMs: this.config.idleThresholdMs,
|
|
455
|
+
// Durable store for cross-kill frame recovery (respects the
|
|
456
|
+
// persistence gate). createStorageBackend() is a singleton, so
|
|
457
|
+
// this is the same instance the telemetry queue uses.
|
|
458
|
+
storage: this.config.persistence.enabled ? createStorageBackend() : undefined,
|
|
459
|
+
useObjectStorage: this.config.useObjectStorage,
|
|
460
|
+
enableNativeFileOutbox: this.config.enableNativeFileOutbox,
|
|
461
|
+
nativeOutboxUploadEnabled: this.config.nativeOutboxUploadEnabled,
|
|
462
|
+
nativeOutboxTuning: {
|
|
463
|
+
nativeOutboxRetryIntervalMs: this.config.nativeOutboxRetryIntervalMs,
|
|
464
|
+
nativeOutboxMaxUploadAttempts: this.config.nativeOutboxMaxUploadAttempts,
|
|
465
|
+
nativeOutboxPoisonMaxAttempts: this.config.nativeOutboxPoisonMaxAttempts,
|
|
466
|
+
nativeOutboxRespectRetryAfter: this.config.nativeOutboxRespectRetryAfter,
|
|
467
|
+
nativeOutboxStrictThreeSecondRetry: this.config.nativeOutboxStrictThreeSecondRetry,
|
|
468
|
+
nativeOutboxNetworkFailuresCountTowardDead: this.config.nativeOutboxNetworkFailuresCountTowardDead,
|
|
469
|
+
nativeOutboxMaxBytes: this.config.nativeOutboxMaxBytes,
|
|
470
|
+
nativeOutboxMaxAgeMs: this.config.nativeOutboxMaxAgeMs,
|
|
471
|
+
},
|
|
472
|
+
});
|
|
473
|
+
sessionManager.setBackendTransport(backendAdapter);
|
|
474
|
+
|
|
475
|
+
// Re-drain recovered crashes now that a backend transport exists.
|
|
476
|
+
//
|
|
477
|
+
// drainNativeCrash already ran inside initializeAll — BEFORE this line — so a
|
|
478
|
+
// crash recovered from the previous run was reported into a NULL transport, the
|
|
479
|
+
// backend sink no-op'd, and the record was KEPT on disk. Next launch loses the
|
|
480
|
+
// identical race, so without this a recovered crash (JS or native) never reaches
|
|
481
|
+
// the dashboard. The record is durable (the persist fix), so re-draining here
|
|
482
|
+
// delivers it THIS launch; the adapter buffers the error until the session row
|
|
483
|
+
// exists, so it lands even though startSession may not have completed yet. A
|
|
484
|
+
// no-op when nothing is pending. Fire-and-forget — crash delivery must never
|
|
485
|
+
// block or fail session setup.
|
|
486
|
+
//
|
|
487
|
+
// In SaaS mode it waits for the analytics session ROW (below). Draining before
|
|
488
|
+
// that meant flushErrors had no session to send to, so delivery was never
|
|
489
|
+
// confirmed: each record was reported, kept on disk, and the loop stopped after
|
|
490
|
+
// the first — one crash per launch, re-sent forever. Legacy mode (no clientKey)
|
|
491
|
+
// has no such row and drains now, as before.
|
|
492
|
+
const drainRecoveredCrashes = (): void => {
|
|
493
|
+
import('../features/crash/nativeCrashBridge')
|
|
494
|
+
.then((m) => m.drainNativeCrash())
|
|
495
|
+
.catch(() => {});
|
|
496
|
+
};
|
|
497
|
+
if (!this.config.clientKey) drainRecoveredCrashes();
|
|
498
|
+
|
|
499
|
+
// Opt-in console → Logs lane. Armed here (not only in the desktop-debug
|
|
500
|
+
// replay orchestrator) so a stock SaaS app can capture console.* without
|
|
501
|
+
// pulling in the devTools bundle. Gated by clientKey (the backend transport
|
|
502
|
+
// forwardToLogsLane needs is now set above) AND the explicit
|
|
503
|
+
// captureConsoleLogs opt-in — console output can carry PII, so it stays off
|
|
504
|
+
// unless the host asks for it. queueLog itself no-ops without a clientKey.
|
|
505
|
+
if (this.config.clientKey && this.config.captureConsoleLogs) {
|
|
506
|
+
installConsoleIntegration();
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// Cross-kill frame recovery: if a prior run was killed with
|
|
510
|
+
// unflushed frames, re-upload them linked to that PRIOR session
|
|
511
|
+
// before the new session takes over. Best-effort, independent of
|
|
512
|
+
// the new session id.
|
|
513
|
+
backendAdapter.recoverPersistedFrames().catch(() => { });
|
|
514
|
+
|
|
515
|
+
// Open the always-on analytics ingestion session (SaaS mode).
|
|
516
|
+
// Decoupled from recording: do NOT call SessionManager.startSession
|
|
517
|
+
// unconditionally, which would start frame capture + the recording
|
|
518
|
+
// timeout for every app even when frame recording is not wanted.
|
|
519
|
+
if (this.config.clientKey) {
|
|
520
|
+
const analyticsStarted = backendAdapter
|
|
521
|
+
.startAnalyticsSession(this._buildAnalyticsSession());
|
|
522
|
+
// Resolves once INGESTION_START has answered (or failed — then the drain
|
|
523
|
+
// keeps the records for the next launch, exactly as before).
|
|
524
|
+
analyticsStarted.then(drainRecoveredCrashes, drainRecoveredCrashes);
|
|
525
|
+
|
|
526
|
+
// Cold-launch frame recording. The AppState listener only starts a
|
|
527
|
+
// recording session on a foreground TRANSITION, which never fires on the
|
|
528
|
+
// initial launch — so without this the first session uploads events but zero
|
|
529
|
+
// frames ("No screen recordings"). Auto-start recording by DEFAULT in SaaS mode
|
|
530
|
+
// so replays appear out of the box; hosts opt out with `replay: { record: false }`
|
|
531
|
+
// for events-only sessions (they can still record on demand via startSession()).
|
|
532
|
+
// Deliberately NOT gated by finalizeOnBackground (that flag only governs
|
|
533
|
+
// per-foreground session boundaries, not whether replay records at all).
|
|
534
|
+
// Started once the analytics session id exists so startSession adopts it
|
|
535
|
+
// (one-row merge) instead of minting an orphan row.
|
|
536
|
+
const shouldAutoRecord = this.config.replay?.record !== false;
|
|
537
|
+
this._autoRecord = shouldAutoRecord;
|
|
538
|
+
if (shouldAutoRecord) {
|
|
539
|
+
analyticsStarted
|
|
540
|
+
.then(() => {
|
|
541
|
+
if (!sessionManager.isActive) {
|
|
542
|
+
sessionManager.startSession();
|
|
543
|
+
}
|
|
544
|
+
})
|
|
545
|
+
.catch(() => { });
|
|
546
|
+
} else {
|
|
547
|
+
analyticsStarted.catch(() => { });
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// Quota (contract v1): while `sessions` is blocked no session opens — not at
|
|
551
|
+
// launch, not on foreground. When the block LIFTS mid-foreground (a /config
|
|
552
|
+
// refresh), open one now rather than waiting for the next app-switch, and
|
|
553
|
+
// start recording the same way the cold launch above does.
|
|
554
|
+
this._sessionsQuotaUnsub?.();
|
|
555
|
+
this._sessionsQuotaUnsub = quotaState.subscribe((feature, blocked) => {
|
|
556
|
+
if (feature !== 'sessions' || blocked) return;
|
|
557
|
+
try {
|
|
558
|
+
if (appLifecycle.getCurrentState() !== 'active') {
|
|
559
|
+
// Backgrounded: the next foreground opens the session; remember to
|
|
560
|
+
// start recording there too.
|
|
561
|
+
if (shouldAutoRecord && !sessionManager.isActive) this._recordAfterSessionsUnblock = true;
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
if (backendAdapter.analyticsSessionId) return;
|
|
565
|
+
const reopened = backendAdapter.startAnalyticsSession(this._buildAnalyticsSession());
|
|
566
|
+
reopened
|
|
567
|
+
.then(() => {
|
|
568
|
+
if (shouldAutoRecord && !sessionManager.isActive) sessionManager.startSession();
|
|
569
|
+
})
|
|
570
|
+
.catch(() => { });
|
|
571
|
+
} catch { /* no-throw */ }
|
|
572
|
+
});
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
// Transport mode: backend always active when apiBaseUrl set.
|
|
577
|
+
// Desktop transport is attached lazily by sessionWiring.ts when
|
|
578
|
+
// enableDebug() is called (development only — production skips this).
|
|
579
|
+
const isSaaS = !!this.config.clientKey;
|
|
580
|
+
__DEV__ && logger.info(
|
|
581
|
+
`[ScaleBun Session Wiring] mode=${isSaaS ? 'saas' : 'legacy'} ` +
|
|
582
|
+
`backend=${!!this.config.apiBaseUrl} desktop=pending-debug-connect`
|
|
583
|
+
);
|
|
584
|
+
|
|
585
|
+
// Patch RN Alert so native dialog lifecycle + button presses are
|
|
586
|
+
// recorded into this SessionManager. Installed here (not in the
|
|
587
|
+
// desktop-only replay orchestrator) so it runs for production /
|
|
588
|
+
// SaaS sessions too. Inert until a session is actively recording.
|
|
589
|
+
installAlertInstrumentation({ debug: !!this.config.debug });
|
|
590
|
+
} catch (err) {
|
|
591
|
+
logger.warn('[Bootstrap] Failed to initialize SessionManager:', err);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
// ── Auto Screen Detection for Core Telemetry ───────────
|
|
596
|
+
try {
|
|
597
|
+
const { AutoScreenDetector } = require('../features/navigation/AutoScreenDetector');
|
|
598
|
+
const detector = AutoScreenDetector.getInstance();
|
|
599
|
+
detector.onScreenChange((screenName: string, source: string) => {
|
|
600
|
+
emitAutomaticEvent('screen_viewed', {
|
|
601
|
+
screen_name: screenName,
|
|
602
|
+
detection_source: source,
|
|
603
|
+
});
|
|
604
|
+
|
|
605
|
+
// Update cross-cutting screen tracker (used for breadcrumbs/logs)
|
|
606
|
+
try {
|
|
607
|
+
const { setTrackedScreen } = require('../debug/screenTracking');
|
|
608
|
+
setTrackedScreen(screenName);
|
|
609
|
+
} catch { /* no-throw */ }
|
|
610
|
+
|
|
611
|
+
// Feed SessionManager (canonical SCREEN_VIEW)
|
|
612
|
+
try {
|
|
613
|
+
const { SessionManager } = require('../features/session/SessionManager');
|
|
614
|
+
const sm = SessionManager.getExistingInstance();
|
|
615
|
+
if (sm && (sm as any).onScreenChange) {
|
|
616
|
+
(sm as any).onScreenChange(screenName);
|
|
617
|
+
}
|
|
618
|
+
} catch { /* no-throw */ }
|
|
619
|
+
|
|
620
|
+
// Feed PerformanceFeature: update current screen AND time the
|
|
621
|
+
// screen load. Reuses the detector's resolved name instead of
|
|
622
|
+
// attaching a second navigation listener on the app's nav ref.
|
|
623
|
+
try {
|
|
624
|
+
const pf = this.featureRegistry.get('performance');
|
|
625
|
+
if (pf) {
|
|
626
|
+
(pf as any).setCurrentScreen(screenName);
|
|
627
|
+
(pf as any).onScreenChange?.(screenName);
|
|
628
|
+
}
|
|
629
|
+
} catch { /* no-throw */ }
|
|
630
|
+
|
|
631
|
+
// Feed ProfilerFeature
|
|
632
|
+
try {
|
|
633
|
+
const { getProfilerFeature } = require('../debug/bootstrap');
|
|
634
|
+
const prof = getProfilerFeature?.();
|
|
635
|
+
if (prof) {
|
|
636
|
+
prof.setCurrentScreen(screenName);
|
|
637
|
+
}
|
|
638
|
+
} catch { /* no-throw */ }
|
|
639
|
+
|
|
640
|
+
__DEV__ && logger.debug(`[AutoScreen] Screen → '${screenName}' (source: ${source})`);
|
|
641
|
+
});
|
|
642
|
+
detector.start();
|
|
643
|
+
__DEV__ && logger.info('[Bootstrap] Auto screen detection started');
|
|
644
|
+
|
|
645
|
+
/**
|
|
646
|
+
* Screen detection that never resolves anything must SAY so.
|
|
647
|
+
*
|
|
648
|
+
* Wrapping React Navigation only helps a container that mounts afterwards, so an app that
|
|
649
|
+
* initialises the SDK late still ends up with no screen names — and until now that was
|
|
650
|
+
* indistinguishable from working. Everything downstream inherits the silence: no
|
|
651
|
+
* SCREEN_VIEW events, so every session's screens read "Unknown"; and no `screenName` on
|
|
652
|
+
* taps, which is the column heatmaps group by, so every route collapses into one bucket.
|
|
653
|
+
*
|
|
654
|
+
* One warning, once, naming the fix.
|
|
655
|
+
*/
|
|
656
|
+
let sawScreen = false;
|
|
657
|
+
detector.onScreenChange(() => { sawScreen = true; });
|
|
658
|
+
const warnTimer = setTimeout(() => {
|
|
659
|
+
if (sawScreen) return;
|
|
660
|
+
logger.warn(
|
|
661
|
+
'[ScaleBun] No screen has been detected. Screens will show as "Unknown" and heatmaps ' +
|
|
662
|
+
'cannot be split by route. If you use React Navigation, pass your container ref to ' +
|
|
663
|
+
'ScaleBun.setNavigationRef(ref); otherwise mark screens with <ScaleBunScreen name="…">.',
|
|
664
|
+
);
|
|
665
|
+
}, 15_000);
|
|
666
|
+
// Never hold the JS timer queue open on a background/exiting app.
|
|
667
|
+
(warnTimer as unknown as { unref?: () => void }).unref?.();
|
|
668
|
+
} catch (err: any) {
|
|
669
|
+
logger.warn('[Bootstrap] Failed to start AutoScreenDetector:', err?.message);
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
// ── Session start event ────────────────────────────────
|
|
673
|
+
trackFn('$session_start', {
|
|
674
|
+
platform: Platform.OS,
|
|
675
|
+
version: Platform.Version,
|
|
676
|
+
deviceId: getDeviceId(),
|
|
677
|
+
});
|
|
678
|
+
|
|
679
|
+
__DEV__ && logger.info('SDK initialized and session established');
|
|
680
|
+
|
|
681
|
+
return {
|
|
682
|
+
config: this.config,
|
|
683
|
+
featureRegistry: this.featureRegistry,
|
|
684
|
+
};
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
/**
|
|
688
|
+
* Build the minimal Session the analytics lane needs. sendSessionStart only
|
|
689
|
+
* reads sessionId/deviceId/startedAt/metadata; device detail is enriched from
|
|
690
|
+
* the native bridge at upload time, so this stays minimal.
|
|
691
|
+
*/
|
|
692
|
+
/**
|
|
693
|
+
* Emit `orientation_changed` when the device actually rotates.
|
|
694
|
+
*
|
|
695
|
+
* There was no orientation signal at all, so a drop-off caused by a broken landscape layout was
|
|
696
|
+
* invisible — the funnel showed users leaving and nothing explained why. Dimensions fires on any
|
|
697
|
+
* metric change (keyboard, split-view, font scale), so the event is emitted only when the
|
|
698
|
+
* portrait/landscape VERDICT flips; otherwise a keyboard open would look like a rotation.
|
|
699
|
+
*/
|
|
700
|
+
private installOrientationTracking(): void {
|
|
701
|
+
if (this._orientationSub) return; // idempotent — bootstrap can run more than once
|
|
702
|
+
try {
|
|
703
|
+
const { Dimensions } = require('react-native');
|
|
704
|
+
const verdict = (w: number, h: number): 'portrait' | 'landscape' => (w > h ? 'landscape' : 'portrait');
|
|
705
|
+
const win = Dimensions.get('window');
|
|
706
|
+
this._lastOrientation = verdict(win.width, win.height);
|
|
707
|
+
this._orientationSub = Dimensions.addEventListener('change', ({ window }: { window: { width: number; height: number } }) => {
|
|
708
|
+
try {
|
|
709
|
+
const next = verdict(window.width, window.height);
|
|
710
|
+
if (next === this._lastOrientation) return;
|
|
711
|
+
const from = this._lastOrientation;
|
|
712
|
+
this._lastOrientation = next;
|
|
713
|
+
emitAutomaticEvent('orientation_changed', {
|
|
714
|
+
orientation: next,
|
|
715
|
+
from,
|
|
716
|
+
width: Math.round(window.width),
|
|
717
|
+
height: Math.round(window.height),
|
|
718
|
+
});
|
|
719
|
+
} catch { /* no-throw: a collector must never break the host app */ }
|
|
720
|
+
});
|
|
721
|
+
} catch { /* Dimensions unavailable (non-RN test env) — silently skip */ }
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
/**
|
|
725
|
+
* Emit `memory_warning` when the OS signals memory pressure.
|
|
726
|
+
*
|
|
727
|
+
* This is the leading indicator before an OOM kill, and the crash side was already built — so the
|
|
728
|
+
* warning that precedes the crash was the missing half. Android-only via RN's `appState`-adjacent
|
|
729
|
+
* `memoryWarning` event; iOS surfaces it through the same emitter when the native module forwards it.
|
|
730
|
+
*/
|
|
731
|
+
private installMemoryWarningTracking(): void {
|
|
732
|
+
if (this._memorySub) return;
|
|
733
|
+
try {
|
|
734
|
+
const { AppState } = require('react-native');
|
|
735
|
+
if (typeof AppState.addEventListener !== 'function') return;
|
|
736
|
+
this._memorySub = AppState.addEventListener('memoryWarning', () => {
|
|
737
|
+
try {
|
|
738
|
+
emitAutomaticEvent('memory_warning', { screen: SessionManager.getExistingInstance()?.getLastKnownScreen?.() });
|
|
739
|
+
} catch { /* no-throw */ }
|
|
740
|
+
});
|
|
741
|
+
} catch { /* AppState unavailable — skip */ }
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
private _buildAnalyticsSession() {
|
|
745
|
+
return {
|
|
746
|
+
sessionId: generateSessionId(),
|
|
747
|
+
deviceId: getDeviceId(),
|
|
748
|
+
startedAt: Date.now(),
|
|
749
|
+
idleThresholdMs: this.config?.idleThresholdMs,
|
|
750
|
+
metadata: { buildType: (__DEV__ ? 'debug' : 'release') as 'debug' | 'release' },
|
|
751
|
+
};
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
/** Get the validated config */
|
|
755
|
+
getConfig(): ScaleBunConfig | null {
|
|
756
|
+
return this.config;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
/** Tear down all features */
|
|
760
|
+
teardown(): void {
|
|
761
|
+
this._sessionsQuotaUnsub?.();
|
|
762
|
+
this._sessionsQuotaUnsub = null;
|
|
763
|
+
this._deepLinkUnsubscribe?.();
|
|
764
|
+
this._deepLinkUnsubscribe = null;
|
|
765
|
+
uninstallAlertInstrumentation();
|
|
766
|
+
uninstallConsoleIntegration();
|
|
767
|
+
this.featureRegistry.teardownAll();
|
|
768
|
+
}
|
|
769
|
+
}
|