@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,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OTA contract types — SDK-side mirror of the backend's ota.contracts.ts.
|
|
3
|
+
*
|
|
4
|
+
* These types are hand-maintained here AND mirrored in the backend.
|
|
5
|
+
* Golden JSON fixtures in packages/protocol/fixtures/ota/ are the SINGLE source
|
|
6
|
+
* of truth; conformance tests in both repos assert against them to prevent drift.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* ═══════════════════════════════════════════════════════════════════════════
|
|
11
|
+
* OTA-TELEMETRY-SPEC — status (spec §84-86)
|
|
12
|
+
* ═══════════════════════════════════════════════════════════════════════════
|
|
13
|
+
* Items 1-3 are DONE. All were additive and backward-compatible: old installed
|
|
14
|
+
* clients simply omit the new fields and never emit the new types, and the
|
|
15
|
+
* backend ingests nullable columns. Because they alter device runtime behaviour,
|
|
16
|
+
* verify against a real RN build + device kill-test before release — Metro
|
|
17
|
+
* cannot exercise the boot guard.
|
|
18
|
+
*
|
|
19
|
+
* 1. releaseId end-to-end — DONE. `recordInstallExpectation` persists the
|
|
20
|
+
* release id (so a rollback reported launches later can still name it),
|
|
21
|
+
* `hydrateCurrentBundleFromSlots` restores it, every emit site passes it, and
|
|
22
|
+
* `deliverOtaEvents` maps it onto the wire item.
|
|
23
|
+
*
|
|
24
|
+
* 2. CHECK + OFFERED — DONE. CHECK is emitted at the top of `sync()` for devices
|
|
25
|
+
* already on an OTA bundle (a device on the factory bundle has no owned
|
|
26
|
+
* bundle id to name, and the server drops rows it cannot resolve — those are
|
|
27
|
+
* counted server-side instead). OFFERED is emitted on `action === 'DOWNLOAD'`
|
|
28
|
+
* before any bytes move.
|
|
29
|
+
*
|
|
30
|
+
* 3. BOOT_SUCCESS — DONE. Emitted from the boot-guard heartbeat once the bundle
|
|
31
|
+
* has actually booted and survived to `healthyAfterMs`. INSTALLED is kept and
|
|
32
|
+
* still means "staged + swapped", but activation should be measured on
|
|
33
|
+
* BOOT_SUCCESS: INSTALLED fires before the bundle has run, so it credits
|
|
34
|
+
* bundles that installed and then crash-reverted.
|
|
35
|
+
*
|
|
36
|
+
* 4. Stamp the running OTA bundle onto session/crash telemetry — NOT DONE.
|
|
37
|
+
* `SessionMetadata.bundleId` is the NATIVE app package id, not the OTA bundle,
|
|
38
|
+
* so crashes cannot currently be attributed to the bundle that produced them
|
|
39
|
+
* (release-health crash impact). Needs optional otaBundleId?/otaBundleVersion?
|
|
40
|
+
* (distinct fields — do NOT overload bundleId) sourced from
|
|
41
|
+
* `otaOrchestrator.getCurrentBundle()` at session start, plus the matching
|
|
42
|
+
* backend columns and a Prisma migration.
|
|
43
|
+
*
|
|
44
|
+
* Do NOT repurpose errorCode (it already collapses failure-error vs rollback-
|
|
45
|
+
* reason); add a new optional field if the two must be distinguished.
|
|
46
|
+
* ═══════════════════════════════════════════════════════════════════════════
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
// ── SDK → backend (POST /sdk/ota/check) ──────────────────────────────────────
|
|
50
|
+
export interface OtaCheckRequest {
|
|
51
|
+
appVersion: string;
|
|
52
|
+
platform: 'android' | 'ios';
|
|
53
|
+
arch?: string;
|
|
54
|
+
installationId: string;
|
|
55
|
+
currentBundleId?: string;
|
|
56
|
+
currentBundleHash?: string;
|
|
57
|
+
/**
|
|
58
|
+
* What this build can do with an offer. `signed_patch_v1`: the native module
|
|
59
|
+
* has `verifyAndStagePatch`, so a SIGNED release can be applied from a patch.
|
|
60
|
+
* The server offers signed patches only to devices that say so — every older
|
|
61
|
+
* build would download the patch URL for nothing. Absent = no capabilities.
|
|
62
|
+
* Additive and optional (the backend DTO does not whitelist-strip).
|
|
63
|
+
*/
|
|
64
|
+
otaCapabilities?: string[];
|
|
65
|
+
/**
|
|
66
|
+
* Trusted key IDs embedded in this app binary, for SDK trust coverage
|
|
67
|
+
* (CICDPAGE §12). Telemetry only — never a source of server-side trust.
|
|
68
|
+
*/
|
|
69
|
+
trustedKeyIds?: string[];
|
|
70
|
+
/**
|
|
71
|
+
* Root/jailbreak indicator strings observed on this device at init, verbatim
|
|
72
|
+
* from the native detectors (`DeviceIntegrity.kt` / `DeviceIntegrity.swift`).
|
|
73
|
+
* Absent — not `[]` — when the native module could not be asked, so "not
|
|
74
|
+
* measured" stays distinguishable from "measured, nothing found".
|
|
75
|
+
*
|
|
76
|
+
* TELEMETRY ONLY, exactly like `trustedKeyIds`: never a source of server-side
|
|
77
|
+
* trust. Root defeats any check made from inside the app, so a device can
|
|
78
|
+
* always send `[]`; the value of the field is fleet-level ("what share of
|
|
79
|
+
* installs report indicators?"), never per-device enforcement.
|
|
80
|
+
*
|
|
81
|
+
* ADDITIVE AND OPTIONAL, deliberately. As of 2026-09-21 the backend's
|
|
82
|
+
* `OtaCheckDto` declares no such field, and the global ValidationPipe runs
|
|
83
|
+
* with `whitelist: false, forbidNonWhitelisted: false` — so sending it is
|
|
84
|
+
* safe (no 400, no stripping of the fields around it) but the value is
|
|
85
|
+
* IGNORED server-side until the backend adds the property and a column. The
|
|
86
|
+
* withholding decision itself is therefore entirely client-side and does not
|
|
87
|
+
* wait on a backend deploy. Mobile only: the web SDK has no OTA lane at all,
|
|
88
|
+
* so there is no web counterpart to keep in step.
|
|
89
|
+
*/
|
|
90
|
+
integrityIndicators?: string[];
|
|
91
|
+
|
|
92
|
+
// ── C1: channel + targeting context ────────────────────────────────────────
|
|
93
|
+
// The backend DTO has accepted all of these since Sprint 9. The SDK declared
|
|
94
|
+
// none of them and `checkForUpdate` sent none, so every device in the field
|
|
95
|
+
// resolved to the `default` channel with an empty targeting context: beta
|
|
96
|
+
// channels were unreachable and the entire targeting-rule engine — country,
|
|
97
|
+
// segment, lifecycle, attributes — could never match. Sending them is what
|
|
98
|
+
// turns that already-built subsystem on.
|
|
99
|
+
/** Channel to pull from. Omitted means `default`. */
|
|
100
|
+
channelName?: string;
|
|
101
|
+
/** ISO 3166-1 alpha-2. The server fills this from the edge when absent. */
|
|
102
|
+
country?: string;
|
|
103
|
+
/** Free-form device attributes evaluated by ATTRIBUTE rules. */
|
|
104
|
+
attributes?: Record<string, string | number>;
|
|
105
|
+
/** CDP segment ids this installation belongs to. */
|
|
106
|
+
segmentIds?: string[];
|
|
107
|
+
/** Lifecycle stage (e.g. 'onboarding', 'activated', 'churned'). */
|
|
108
|
+
lifecycleStage?: string;
|
|
109
|
+
|
|
110
|
+
// ── Runtime compatibility context ──────────────────────────────────────────
|
|
111
|
+
// `appVersion` is a marketing string; these are the actual runtime contract.
|
|
112
|
+
// Serving a bundle built for a different runtime is the most common way an
|
|
113
|
+
// OTA product bricks an app, and without these fields the backend cannot
|
|
114
|
+
// even detect the mismatch, let alone refuse to serve it.
|
|
115
|
+
/** React Native version of the host binary, e.g. `"0.81.5"`. */
|
|
116
|
+
rnVersion?: string;
|
|
117
|
+
/** True when the JS engine is Hermes. */
|
|
118
|
+
hermes?: boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Hermes bytecode (HBC) format version of the running engine. Independent of
|
|
121
|
+
* the RN release number. A mismatch either fails to load outright ("Wrong
|
|
122
|
+
* bytecode version. Expected 96 but got 98") or — worse — loads and crashes
|
|
123
|
+
* later on a path the older runtime does not expose.
|
|
124
|
+
*/
|
|
125
|
+
hermesBytecodeVersion?: number;
|
|
126
|
+
/** True when running the New Architecture's bridgeless runtime. */
|
|
127
|
+
bridgeless?: boolean;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ── backend → SDK ────────────────────────────────────────────────────────────
|
|
131
|
+
export interface OtaCheckResponse {
|
|
132
|
+
action: 'NONE' | 'DOWNLOAD' | 'ROLLBACK';
|
|
133
|
+
bundle?: OtaBundlePayload;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export interface OtaBundlePayload {
|
|
137
|
+
id: string;
|
|
138
|
+
version: number;
|
|
139
|
+
/**
|
|
140
|
+
* The release this bundle is served AS (the backend now includes it — see
|
|
141
|
+
* ota.contracts.ts / ota-check.service.ts). Optional, for backward-compat with
|
|
142
|
+
* older backends. Carry it onto the emitted OtaEventItem.releaseId so telemetry
|
|
143
|
+
* is attributable by RELEASE, not just bundle. See OTA-TELEMETRY-SPEC below.
|
|
144
|
+
*/
|
|
145
|
+
releaseId?: string;
|
|
146
|
+
url: string; // presigned GET — short-TTL
|
|
147
|
+
size: number;
|
|
148
|
+
sha256: string;
|
|
149
|
+
signature?: string; // ed25519 detached signature (hex) — legacy, unused by native RSA path
|
|
150
|
+
/**
|
|
151
|
+
* SB-OTA-RSA-SHA256-V1 release envelope. Present on signed releases; carries
|
|
152
|
+
* the protocol id, the id of the trusted RSA key the release was signed with,
|
|
153
|
+
* the canonical signed payload, and its signature. When present, the SDK hands
|
|
154
|
+
* the whole envelope to the native module (`verifyAndStageRelease`), which
|
|
155
|
+
* verifies the signature against the RSA public keys EMBEDDED in the app
|
|
156
|
+
* package and then downloads + integrity-checks + stages the artifact — JS
|
|
157
|
+
* never stages bytes it has not proven authentic, and never pins or verifies a
|
|
158
|
+
* key itself. Absent on legacy/unsigned releases, which fall back to
|
|
159
|
+
* `stageBundle` on SHA-256 integrity alone.
|
|
160
|
+
*/
|
|
161
|
+
envelope?: {
|
|
162
|
+
protocol: string;
|
|
163
|
+
keyId: string;
|
|
164
|
+
signedPayload: string;
|
|
165
|
+
signature: string;
|
|
166
|
+
};
|
|
167
|
+
isMandatory: boolean;
|
|
168
|
+
/**
|
|
169
|
+
* How to activate the bundle after install:
|
|
170
|
+
* ON_NEXT_RESTART — nothing to do now; next cold start loads it (default)
|
|
171
|
+
* ON_NEXT_RESUME — restart the JS runtime when the app next returns to
|
|
172
|
+
* the foreground after a background stay
|
|
173
|
+
* IMMEDIATE — restart the JS runtime right after install
|
|
174
|
+
* Absent means ON_NEXT_RESTART, which is what every pre-installMode release
|
|
175
|
+
* actually did.
|
|
176
|
+
*/
|
|
177
|
+
installMode?: 'ON_NEXT_RESTART' | 'ON_NEXT_RESUME' | 'IMMEDIATE';
|
|
178
|
+
releaseNote?: string;
|
|
179
|
+
patch?: OtaPatchPayload;
|
|
180
|
+
/**
|
|
181
|
+
* Identity marker compiled into this bundle at publish time.
|
|
182
|
+
*
|
|
183
|
+
* Recorded at install; compared after restart against the marker the RUNNING
|
|
184
|
+
* bundle carries. Its PRESENCE is the important part — knowing a bundle
|
|
185
|
+
* definitely has a marker is what turns "no marker after restart" from
|
|
186
|
+
* ambiguous into proof that the install never took effect.
|
|
187
|
+
*/
|
|
188
|
+
identityToken?: string;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export interface OtaPatchPayload {
|
|
192
|
+
url: string;
|
|
193
|
+
size: number;
|
|
194
|
+
sha256: string;
|
|
195
|
+
baseBundleId: string;
|
|
196
|
+
/**
|
|
197
|
+
* SHA-256 of the bundle this patch was made FROM. When present, native refuses
|
|
198
|
+
* the patch unless the installed bundle hashes to it (a bundle id alone does
|
|
199
|
+
* not prove the bytes). Optional: older servers do not send it.
|
|
200
|
+
*/
|
|
201
|
+
baseSha256?: string;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ── Adoption telemetry (rides the unified batch envelope as kind:'ota_event') ──
|
|
205
|
+
//
|
|
206
|
+
// The event vocabulary is declared ONCE, in OtaEventEmitter — the module that
|
|
207
|
+
// emits it. This file used to carry a second, shorter copy under the same name,
|
|
208
|
+
// so `OtaEventItem.type` and the emitter's events could disagree while both
|
|
209
|
+
// type-checked, and adding a funnel step meant remembering to edit two unions.
|
|
210
|
+
// `DOWNLOAD_PROGRESS` is emitted for UI only and never queued for upload, so it
|
|
211
|
+
// is excluded here rather than re-listing the rest. `UPDATE_WITHHELD` is
|
|
212
|
+
// excluded for a different reason: the backend's ingest lane validates `type`
|
|
213
|
+
// against a closed set and drops unknown types silently, so declaring it on the
|
|
214
|
+
// wire would claim a delivery that does not happen. See OtaEventEmitter.emit().
|
|
215
|
+
import type { OtaEventType as EmittedOtaEventType } from './OtaEventEmitter';
|
|
216
|
+
|
|
217
|
+
export type OtaEventType = Exclude<
|
|
218
|
+
EmittedOtaEventType,
|
|
219
|
+
'DOWNLOAD_PROGRESS' | 'UPDATE_WITHHELD'
|
|
220
|
+
>;
|
|
221
|
+
|
|
222
|
+
export interface OtaEventItem {
|
|
223
|
+
kind: 'ota_event';
|
|
224
|
+
bundleId: string;
|
|
225
|
+
releaseId?: string;
|
|
226
|
+
type: OtaEventType;
|
|
227
|
+
durationMs?: number;
|
|
228
|
+
errorCode?: string;
|
|
229
|
+
patchUsed?: boolean;
|
|
230
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Dimensions, Platform } from 'react-native';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Hardware/OS context auto-attached to OTA check payloads so ATTRIBUTE targeting
|
|
5
|
+
* rules can address device classes without any host-app wiring:
|
|
6
|
+
*
|
|
7
|
+
* deviceModel — 'SM-A155F', '23129RAA4G'… (Android; iOS does not expose it in JS)
|
|
8
|
+
* manufacturer — 'samsung', 'xiaomi'… (lowercased: rules shouldn't fail on casing)
|
|
9
|
+
* brand — 'redmi' vs manufacturer 'xiaomi' — sub-brands are real segments
|
|
10
|
+
* osVersion — Android Release ('14') / iOS version ('17.5')
|
|
11
|
+
* formFactor — 'phone' | 'tablet' | 'tv' (Android tablets via the 600dp
|
|
12
|
+
* smallest-width convention — the same line AndroidX draws)
|
|
13
|
+
*
|
|
14
|
+
* Host-supplied attributes always win on key collision: an app that knows better
|
|
15
|
+
* (e.g. its own device tiering) must not be overridden by generic detection.
|
|
16
|
+
* Everything here is best-effort — a missing constant yields a missing key,
|
|
17
|
+
* never a guessed value.
|
|
18
|
+
*/
|
|
19
|
+
export function deviceTargetingAttributes(): Record<string, string> {
|
|
20
|
+
const out: Record<string, string> = {};
|
|
21
|
+
try {
|
|
22
|
+
const c = (Platform.constants ?? {}) as Record<string, unknown>;
|
|
23
|
+
if (Platform.OS === 'android') {
|
|
24
|
+
if (typeof c.Model === 'string' && c.Model) out.deviceModel = c.Model;
|
|
25
|
+
if (typeof c.Manufacturer === 'string' && c.Manufacturer) {
|
|
26
|
+
out.manufacturer = c.Manufacturer.toLowerCase();
|
|
27
|
+
}
|
|
28
|
+
if (typeof c.Brand === 'string' && c.Brand) out.brand = c.Brand.toLowerCase();
|
|
29
|
+
if (typeof c.Release === 'string' && c.Release) out.osVersion = c.Release;
|
|
30
|
+
const screen = Dimensions.get('screen');
|
|
31
|
+
const smallestDp = Math.min(screen.width, screen.height);
|
|
32
|
+
out.formFactor = Platform.isTV ? 'tv' : smallestDp >= 600 ? 'tablet' : 'phone';
|
|
33
|
+
} else {
|
|
34
|
+
const osVersion = typeof c.osVersion === 'string' ? c.osVersion : String(Platform.Version ?? '');
|
|
35
|
+
if (osVersion) out.osVersion = osVersion;
|
|
36
|
+
out.formFactor = Platform.isTV
|
|
37
|
+
? 'tv'
|
|
38
|
+
: (c as { interfaceIdiom?: string }).interfaceIdiom === 'pad'
|
|
39
|
+
? 'tablet'
|
|
40
|
+
: 'phone';
|
|
41
|
+
}
|
|
42
|
+
} catch {
|
|
43
|
+
// Targeting enrichment must never break a check. Missing keys are honest.
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { Platform } from 'react-native';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* OTA runtime environment detection.
|
|
5
|
+
*
|
|
6
|
+
* ── Why this file exists ────────────────────────────────────────────────────
|
|
7
|
+
*
|
|
8
|
+
* Our Android OTA resolves the active bundle through
|
|
9
|
+
* `MainApplication.getJSBundleFile()`. That is a *bridge-mode* API.
|
|
10
|
+
*
|
|
11
|
+
* Under the New Architecture (bridgeless), the app is built by
|
|
12
|
+
* `DefaultReactHost` instead — and until React Native 0.76.1,
|
|
13
|
+
* `DefaultReactNativeHost.toReactHost()` never forwarded `jsBundleFile`:
|
|
14
|
+
*
|
|
15
|
+
* // RN 0.74.1 — DefaultReactNativeHost.kt
|
|
16
|
+
* public fun toReactHost(context: Context): ReactHost =
|
|
17
|
+
* DefaultReactHost.getDefaultReactHost(
|
|
18
|
+
* context, packages, jsMainModuleName,
|
|
19
|
+
* bundleAssetName ?: "index", // <- jsBundleFile is NEVER passed
|
|
20
|
+
* isHermesEnabled ?: true)
|
|
21
|
+
*
|
|
22
|
+
* // RN 0.74.1 — DefaultReactHost.kt
|
|
23
|
+
* val jsBundleLoader =
|
|
24
|
+
* JSBundleLoader.createAssetLoader(context, "assets://$jsBundleAssetPath", true)
|
|
25
|
+
*
|
|
26
|
+
* The loader is hardcoded to the APK asset. `getJSBundleFile()` is never
|
|
27
|
+
* consulted, so an update stages, applies, reports INSTALLED, restarts — and
|
|
28
|
+
* the app loads the bundle baked into the APK. Every signal says success and
|
|
29
|
+
* nothing happened. This is the same failure that killed CodePush on modern RN.
|
|
30
|
+
*
|
|
31
|
+
* Fixed upstream in 0.76.1 (`jsBundleFile` is threaded through). Verified
|
|
32
|
+
* present in 0.81.5.
|
|
33
|
+
*
|
|
34
|
+
* We refuse to run rather than pretend to work. A loud failure at startup is
|
|
35
|
+
* recoverable; a silent no-op that reports success is not — it corrupts the
|
|
36
|
+
* adoption metrics, the guard thresholds, and every rollout decision made
|
|
37
|
+
* from them.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
/** First React Native version where bridgeless honours `getJSBundleFile()`. */
|
|
41
|
+
export const MIN_BRIDGELESS_RN = { major: 0, minor: 76, patch: 1 } as const;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* React Native 0.82 REMOVED `ReactNativeHost`. The New Architecture became
|
|
45
|
+
* mandatory and `newArchEnabled=false` was withdrawn, so the legacy
|
|
46
|
+
* `override fun getJSBundleFile()` integration does not merely stop working —
|
|
47
|
+
* it does not compile. From 0.82 the only correct integration is passing
|
|
48
|
+
* `jsBundleFilePath` straight to `getDefaultReactHost(...)`.
|
|
49
|
+
*
|
|
50
|
+
* We cannot see which integration a host app used, so this is not a block. It
|
|
51
|
+
* drives a startup hint, and the post-restart identity check is what actually
|
|
52
|
+
* catches a host that got it wrong.
|
|
53
|
+
*/
|
|
54
|
+
export const REACT_HOST_ONLY_RN = { major: 0, minor: 82, patch: 0 } as const;
|
|
55
|
+
|
|
56
|
+
export interface RnVersion {
|
|
57
|
+
major: number;
|
|
58
|
+
minor: number;
|
|
59
|
+
patch: number;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface OtaEnvironment {
|
|
63
|
+
/** Parsed React Native version, or null when it could not be determined. */
|
|
64
|
+
rnVersion: RnVersion | null;
|
|
65
|
+
/** `"0.76.1"`, or null. Sent to the backend for compatibility gating. */
|
|
66
|
+
rnVersionString: string | null;
|
|
67
|
+
/** True when running on the New Architecture's bridgeless runtime. */
|
|
68
|
+
bridgeless: boolean;
|
|
69
|
+
/** True when the JS engine is Hermes. */
|
|
70
|
+
hermes: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Hermes bytecode (HBC) format version of the *running* engine. This is the
|
|
73
|
+
* file-format compatibility number, NOT a React Native release number — the
|
|
74
|
+
* two move independently. A bundle compiled by a different hermesc can be
|
|
75
|
+
* rejected outright ("Wrong bytecode version. Expected 96 but got 98") or,
|
|
76
|
+
* worse, load fine and crash later on a path the older runtime lacks.
|
|
77
|
+
*/
|
|
78
|
+
hermesBytecodeVersion: number | null;
|
|
79
|
+
/** False when OTA cannot work on this runtime and must not be enabled. */
|
|
80
|
+
supported: boolean;
|
|
81
|
+
/** Human-readable explanation when `supported` is false. */
|
|
82
|
+
blockReason: string | null;
|
|
83
|
+
/**
|
|
84
|
+
* True on RN >= 0.82, where `ReactNativeHost` no longer exists and the only
|
|
85
|
+
* valid integration is `getDefaultReactHost(..., jsBundleFilePath = …)`.
|
|
86
|
+
* Used to make the startup diagnostic name the right fix.
|
|
87
|
+
*/
|
|
88
|
+
requiresReactHostIntegration: boolean;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function compare(a: RnVersion, b: { major: number; minor: number; patch: number }): number {
|
|
92
|
+
if (a.major !== b.major) return a.major - b.major;
|
|
93
|
+
if (a.minor !== b.minor) return a.minor - b.minor;
|
|
94
|
+
return a.patch - b.patch;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function readRnVersion(): RnVersion | null {
|
|
98
|
+
// `Platform.constants.reactNativeVersion` is public API and present on both
|
|
99
|
+
// platforms since 0.62. Preferred over the deep `Libraries/Core/...` import,
|
|
100
|
+
// which is private and has moved between releases.
|
|
101
|
+
try {
|
|
102
|
+
const v = (Platform as unknown as { constants?: { reactNativeVersion?: RnVersion } })
|
|
103
|
+
.constants?.reactNativeVersion;
|
|
104
|
+
if (v && typeof v.major === 'number' && typeof v.minor === 'number') {
|
|
105
|
+
return { major: v.major, minor: v.minor, patch: v.patch ?? 0 };
|
|
106
|
+
}
|
|
107
|
+
} catch {
|
|
108
|
+
// fall through
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function readBridgeless(): boolean {
|
|
114
|
+
// Set by the runtime itself when the bridgeless host is in use. Absent on
|
|
115
|
+
// the old architecture, so `=== true` is the correct test.
|
|
116
|
+
try {
|
|
117
|
+
return (globalThis as unknown as { RN$Bridgeless?: boolean }).RN$Bridgeless === true;
|
|
118
|
+
} catch {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
interface HermesInternalShape {
|
|
124
|
+
getRuntimeProperties?: () => Record<string, unknown>;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function readHermes(): { hermes: boolean; bytecodeVersion: number | null } {
|
|
128
|
+
try {
|
|
129
|
+
const h = (globalThis as unknown as { HermesInternal?: HermesInternalShape }).HermesInternal;
|
|
130
|
+
if (!h) return { hermes: false, bytecodeVersion: null };
|
|
131
|
+
|
|
132
|
+
let bytecodeVersion: number | null = null;
|
|
133
|
+
const props = h.getRuntimeProperties?.();
|
|
134
|
+
if (props) {
|
|
135
|
+
// Hermes reports this as "Bytecode Version"; the value has been both a
|
|
136
|
+
// number and a numeric string across releases, so coerce and validate.
|
|
137
|
+
const raw = props['Bytecode Version'];
|
|
138
|
+
const n = typeof raw === 'string' ? Number(raw) : raw;
|
|
139
|
+
if (typeof n === 'number' && Number.isFinite(n)) bytecodeVersion = n;
|
|
140
|
+
}
|
|
141
|
+
return { hermes: true, bytecodeVersion };
|
|
142
|
+
} catch {
|
|
143
|
+
return { hermes: false, bytecodeVersion: null };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
let cached: OtaEnvironment | null = null;
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Detect the runtime environment and decide whether OTA can function at all.
|
|
151
|
+
* Result is cached — none of these values change during a process lifetime.
|
|
152
|
+
*/
|
|
153
|
+
export function detectOtaEnvironment(): OtaEnvironment {
|
|
154
|
+
if (cached) return cached;
|
|
155
|
+
|
|
156
|
+
const rnVersion = readRnVersion();
|
|
157
|
+
const bridgeless = readBridgeless();
|
|
158
|
+
const { hermes, bytecodeVersion } = readHermes();
|
|
159
|
+
|
|
160
|
+
let supported = true;
|
|
161
|
+
let blockReason: string | null = null;
|
|
162
|
+
|
|
163
|
+
if (bridgeless && rnVersion) {
|
|
164
|
+
if (compare(rnVersion, MIN_BRIDGELESS_RN) < 0) {
|
|
165
|
+
supported = false;
|
|
166
|
+
blockReason =
|
|
167
|
+
`React Native ${rnVersion.major}.${rnVersion.minor}.${rnVersion.patch} is running ` +
|
|
168
|
+
`bridgeless (New Architecture), but jsBundleFile was not threaded through ` +
|
|
169
|
+
`DefaultReactHost until RN 0.76.1. getJSBundleFile() is ignored on this runtime, ` +
|
|
170
|
+
`so an OTA bundle would install successfully and never actually load. ` +
|
|
171
|
+
`Upgrade to React Native >= 0.76.1, or disable the New Architecture.`;
|
|
172
|
+
}
|
|
173
|
+
} else if (bridgeless && !rnVersion) {
|
|
174
|
+
// Can't prove it's broken, and blocking every app whose version we failed
|
|
175
|
+
// to read would be worse than the bug. Warn instead of blocking.
|
|
176
|
+
blockReason = null;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
cached = {
|
|
180
|
+
rnVersion,
|
|
181
|
+
rnVersionString: rnVersion
|
|
182
|
+
? `${rnVersion.major}.${rnVersion.minor}.${rnVersion.patch}`
|
|
183
|
+
: null,
|
|
184
|
+
bridgeless,
|
|
185
|
+
hermes,
|
|
186
|
+
hermesBytecodeVersion: bytecodeVersion,
|
|
187
|
+
supported,
|
|
188
|
+
blockReason,
|
|
189
|
+
requiresReactHostIntegration: rnVersion
|
|
190
|
+
? compare(rnVersion, REACT_HOST_ONLY_RN) >= 0
|
|
191
|
+
: false,
|
|
192
|
+
};
|
|
193
|
+
return cached;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** Test seam — the detection result is process-lifetime cached. */
|
|
197
|
+
export function _resetOtaEnvironmentCache(): void {
|
|
198
|
+
cached = null;
|
|
199
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createStorageBackend } from '../../storage/StorageBackend';
|
|
2
|
+
import { logger } from '../../core/logger/internalLogger';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Device country via an edge Worker — the workaround for an API that is not
|
|
6
|
+
* behind a geo-stamping CDN.
|
|
7
|
+
*
|
|
8
|
+
* The clean architecture is the API itself resolving `cf-ipcountry` at its own
|
|
9
|
+
* edge (see backend `resolveCountry`) — the device can't forge it and every
|
|
10
|
+
* request carries it. When the API record isn't proxied, that header never
|
|
11
|
+
* exists, so this module asks a Cloudflare Worker (which DOES see the device's
|
|
12
|
+
* edge geo) and attaches the answer to the OTA check payload. Host-supplied
|
|
13
|
+
* country always wins; the server treats a client country as locale-grade, not
|
|
14
|
+
* proof of location.
|
|
15
|
+
*
|
|
16
|
+
* Failure-soft by design: a dead Worker, a timeout, or a bad payload leaves the
|
|
17
|
+
* country unset — an unknown country must render as unknown, never be guessed.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/** Default lookup endpoint. Overridable via {@link setGeoEndpoint}. */
|
|
21
|
+
const DEFAULT_GEO_ENDPOINT = 'https://get-location.imohamadfahmy.workers.dev/';
|
|
22
|
+
|
|
23
|
+
const K_COUNTRY = 'scalebun.ota.geoCountry';
|
|
24
|
+
const K_FETCHED_AT = 'scalebun.ota.geoCountryAt';
|
|
25
|
+
const TTL_MS = 24 * 60 * 60 * 1000; // countries change when people travel — daily is plenty
|
|
26
|
+
const TIMEOUT_MS = 2500;
|
|
27
|
+
|
|
28
|
+
/** Cloudflare's non-countries: Tor exits and internal probes. Unknown, not a place. */
|
|
29
|
+
const NON_COUNTRIES = new Set(['XX', 'T1', 'ZZ']);
|
|
30
|
+
|
|
31
|
+
let endpoint = DEFAULT_GEO_ENDPOINT;
|
|
32
|
+
let memory: string | null = null;
|
|
33
|
+
let inFlight: Promise<void> | null = null;
|
|
34
|
+
const storage = createStorageBackend();
|
|
35
|
+
|
|
36
|
+
/** Override the lookup endpoint (e.g. a self-hosted Worker). */
|
|
37
|
+
export function setGeoEndpoint(url: string): void {
|
|
38
|
+
endpoint = url;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Synchronous read of the cached country (uppercase ISO 3166-1 alpha-2), or
|
|
43
|
+
* null when no fresh lookup has ever succeeded. Never triggers network.
|
|
44
|
+
*/
|
|
45
|
+
export function getDeviceCountry(): string | null {
|
|
46
|
+
if (memory) return memory;
|
|
47
|
+
const stored = storage.get(K_COUNTRY);
|
|
48
|
+
const at = parseInt(storage.get(K_FETCHED_AT) ?? '0', 10) || 0;
|
|
49
|
+
if (stored && Date.now() - at < TTL_MS) {
|
|
50
|
+
memory = stored;
|
|
51
|
+
return stored;
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Refresh the cache from the Worker if stale. Fire-and-forget: call it at
|
|
58
|
+
* orchestrator init; the first check of a cold install may go out without a
|
|
59
|
+
* country (the server stores the country per device on later checks anyway).
|
|
60
|
+
*/
|
|
61
|
+
export function prefetchDeviceCountry(): Promise<void> {
|
|
62
|
+
if (getDeviceCountry()) return Promise.resolve(); // fresh — nothing to do
|
|
63
|
+
if (inFlight) return inFlight;
|
|
64
|
+
inFlight = (async () => {
|
|
65
|
+
const controller = new AbortController();
|
|
66
|
+
const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
67
|
+
try {
|
|
68
|
+
const res = await fetch(endpoint, { signal: controller.signal });
|
|
69
|
+
if (!res.ok) return;
|
|
70
|
+
const body = (await res.json()) as { country?: unknown };
|
|
71
|
+
const raw = typeof body?.country === 'string' ? body.country.trim().toUpperCase() : '';
|
|
72
|
+
if (!/^[A-Z]{2}$/.test(raw) || NON_COUNTRIES.has(raw)) return;
|
|
73
|
+
memory = raw;
|
|
74
|
+
storage.set(K_COUNTRY, raw);
|
|
75
|
+
storage.set(K_FETCHED_AT, String(Date.now()));
|
|
76
|
+
__DEV__ && logger.debug(`[OTA] Device country resolved: ${raw}`);
|
|
77
|
+
} catch (err: any) {
|
|
78
|
+
__DEV__ && logger.debug(`[OTA] Geo lookup skipped: ${err?.message ?? err}`);
|
|
79
|
+
} finally {
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
inFlight = null;
|
|
82
|
+
}
|
|
83
|
+
})();
|
|
84
|
+
return inFlight;
|
|
85
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { logger } from '../../core/logger/internalLogger';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Retry with exponential backoff and full jitter.
|
|
5
|
+
*
|
|
6
|
+
* ── Why ─────────────────────────────────────────────────────────────────────
|
|
7
|
+
*
|
|
8
|
+
* The OTA path had no retry at all. A download that failed on a flaky mobile
|
|
9
|
+
* connection returned an error and the device then waited for the next cold
|
|
10
|
+
* start to try again — which on a phone is often hours, and on a device that
|
|
11
|
+
* is never fully restarted, effectively never. On mobile networks a single
|
|
12
|
+
* transient failure is the common case, not the exception.
|
|
13
|
+
*
|
|
14
|
+
* Full jitter (`random(0, backoff)` rather than `backoff`) matters more here
|
|
15
|
+
* than in most clients: every device on a release checks in against the same
|
|
16
|
+
* schedule, so a fixed backoff would retry the whole fleet in lockstep and
|
|
17
|
+
* turn one origin blip into a synchronised thundering herd.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
export interface RetryOptions {
|
|
21
|
+
/** Total attempts including the first. Default 3. */
|
|
22
|
+
attempts?: number;
|
|
23
|
+
/** Base delay in ms for the first backoff. Default 1000. */
|
|
24
|
+
baseDelayMs?: number;
|
|
25
|
+
/** Upper bound on any single delay. Default 30_000. */
|
|
26
|
+
maxDelayMs?: number;
|
|
27
|
+
/** Label used in log lines. */
|
|
28
|
+
label?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Decides whether a given failure is worth retrying. Default: retry
|
|
31
|
+
* everything. Callers should pass a predicate that returns false for
|
|
32
|
+
* failures that will never succeed on a retry (4xx, hash mismatch), so a
|
|
33
|
+
* device does not burn battery re-requesting something already rejected.
|
|
34
|
+
*/
|
|
35
|
+
isRetryable?: (err: unknown) => boolean;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const DEFAULT_ATTEMPTS = 3;
|
|
39
|
+
const DEFAULT_BASE_DELAY_MS = 1_000;
|
|
40
|
+
const DEFAULT_MAX_DELAY_MS = 30_000;
|
|
41
|
+
|
|
42
|
+
const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));
|
|
43
|
+
|
|
44
|
+
/** Exposed for tests; `Math.random` is the only nondeterminism in the schedule. */
|
|
45
|
+
export function backoffDelay(
|
|
46
|
+
attemptIndex: number,
|
|
47
|
+
baseDelayMs: number,
|
|
48
|
+
maxDelayMs: number,
|
|
49
|
+
random: () => number = Math.random,
|
|
50
|
+
): number {
|
|
51
|
+
const exponential = Math.min(maxDelayMs, baseDelayMs * Math.pow(2, attemptIndex));
|
|
52
|
+
return Math.floor(random() * exponential);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Run `fn`, retrying on failure with exponential backoff.
|
|
57
|
+
* Rethrows the last error once attempts are exhausted.
|
|
58
|
+
*/
|
|
59
|
+
export async function retryWithBackoff<T>(
|
|
60
|
+
fn: (attempt: number) => Promise<T>,
|
|
61
|
+
options: RetryOptions = {},
|
|
62
|
+
): Promise<T> {
|
|
63
|
+
const attempts = options.attempts ?? DEFAULT_ATTEMPTS;
|
|
64
|
+
const baseDelayMs = options.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;
|
|
65
|
+
const maxDelayMs = options.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;
|
|
66
|
+
const label = options.label ?? 'operation';
|
|
67
|
+
const isRetryable = options.isRetryable ?? (() => true);
|
|
68
|
+
|
|
69
|
+
let lastError: unknown;
|
|
70
|
+
|
|
71
|
+
for (let attempt = 0; attempt < attempts; attempt++) {
|
|
72
|
+
try {
|
|
73
|
+
return await fn(attempt);
|
|
74
|
+
} catch (err) {
|
|
75
|
+
lastError = err;
|
|
76
|
+
|
|
77
|
+
if (!isRetryable(err)) {
|
|
78
|
+
__DEV__ && logger.debug(`[OTA] ${label} failed with a non-retryable error — not retrying`);
|
|
79
|
+
throw err;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const isLast = attempt === attempts - 1;
|
|
83
|
+
if (isLast) break;
|
|
84
|
+
|
|
85
|
+
const delay = backoffDelay(attempt, baseDelayMs, maxDelayMs);
|
|
86
|
+
__DEV__ && logger.debug(
|
|
87
|
+
`[OTA] ${label} failed (attempt ${attempt + 1}/${attempts}) — retrying in ${delay}ms`,
|
|
88
|
+
);
|
|
89
|
+
await sleep(delay);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
throw lastError;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* True for failures that a later attempt could plausibly survive.
|
|
98
|
+
*
|
|
99
|
+
* Network errors and 5xx/429 are retryable. A 4xx other than 429 is the server
|
|
100
|
+
* telling us the request itself is wrong — retrying it just wastes battery.
|
|
101
|
+
*/
|
|
102
|
+
export function isRetryableNetworkError(err: unknown): boolean {
|
|
103
|
+
const status = (err as { status?: number } | undefined)?.status;
|
|
104
|
+
if (typeof status === 'number') {
|
|
105
|
+
if (status === 429) return true;
|
|
106
|
+
if (status >= 500) return true;
|
|
107
|
+
if (status >= 400) return false;
|
|
108
|
+
}
|
|
109
|
+
// fetch() rejects with a TypeError on DNS failure, connection refused, and
|
|
110
|
+
// airplane mode — all of which are exactly what we want to retry.
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Error carrying an HTTP status so `isRetryableNetworkError` can classify it. */
|
|
115
|
+
export class HttpStatusError extends Error {
|
|
116
|
+
constructor(
|
|
117
|
+
message: string,
|
|
118
|
+
public readonly status: number,
|
|
119
|
+
) {
|
|
120
|
+
super(message);
|
|
121
|
+
this.name = 'HttpStatusError';
|
|
122
|
+
}
|
|
123
|
+
}
|