@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,249 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
Downloads an OTA bundle to a local file (OTA-05).
|
|
5
|
+
|
|
6
|
+
WHY THIS EXISTS. `OtaOrchestrator.sync()` has always passed `bundle.url` — a
|
|
7
|
+
presigned HTTPS URL — into `stageBundle()`, while `OtaSlotManager.stage` treated
|
|
8
|
+
that argument as a filesystem path and called
|
|
9
|
+
`copyItem(at: URL(fileURLWithPath:))`, which throws for a remote URL. No part of
|
|
10
|
+
the SDK downloaded the bundle, so OTA could never install an update, and every
|
|
11
|
+
safety mechanism downstream had only ever run against synthetic events.
|
|
12
|
+
|
|
13
|
+
Synchronous by design: `stageBundle` is a promise-returning bridge method that
|
|
14
|
+
already runs off the main thread, and the slot manager's staging step is
|
|
15
|
+
synchronous. A semaphore here keeps the call site a straight line rather than
|
|
16
|
+
threading a completion handler through the bridge for no behavioural gain.
|
|
17
|
+
|
|
18
|
+
Delegate-based rather than completion-handler-based, for one reason: the size
|
|
19
|
+
cap must fire DURING the stream, not after it. The previous implementation
|
|
20
|
+
checked the file size only once the download completed — by which point a
|
|
21
|
+
hostile or buggy 5 GB body had already been written to the user's disk. The
|
|
22
|
+
Android downloader has always cancelled mid-stream; this brings iOS to parity.
|
|
23
|
+
*/
|
|
24
|
+
enum BundleDownloader {
|
|
25
|
+
|
|
26
|
+
/// Matches the server-side finalize cap. A larger body is a bug or an attack.
|
|
27
|
+
fileprivate static let maxBytes: Int64 = 50 * 1024 * 1024
|
|
28
|
+
fileprivate static let timeout: TimeInterval = 60
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
Download `urlString` to `destination`. Returns true on success.
|
|
32
|
+
|
|
33
|
+
Integrity is NOT checked here — `OtaSlotManager.stage` re-hashes what landed
|
|
34
|
+
on disk, which is the only measurement that matters. On any failure the
|
|
35
|
+
destination is removed so a partial body cannot be mistaken for a bundle.
|
|
36
|
+
|
|
37
|
+
C2a: `URLSession` advertises and transparently decodes gzip, so what reaches
|
|
38
|
+
disk is the decompressed bundle — the same bytes the server hashed and the
|
|
39
|
+
signature covers.
|
|
40
|
+
*/
|
|
41
|
+
static func download(urlString: String, destination: URL) -> Bool {
|
|
42
|
+
downloadWithReason(urlString: urlString, destination: destination) == nil
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
As `download`, but says WHY it failed: nil on success, otherwise a
|
|
47
|
+
`DownloadFailure` code. Never a URL, host or error description.
|
|
48
|
+
*/
|
|
49
|
+
static func downloadWithReason(urlString: String, destination: URL) -> String? {
|
|
50
|
+
guard let url = URL(string: urlString) else {
|
|
51
|
+
NSLog("[ScaleBunOta] Download failed: malformed URL")
|
|
52
|
+
return DownloadFailure.io
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
let configuration = URLSessionConfiguration.ephemeral
|
|
56
|
+
configuration.timeoutIntervalForRequest = timeout
|
|
57
|
+
configuration.timeoutIntervalForResource = timeout * 4
|
|
58
|
+
|
|
59
|
+
let delegate = SizeCappedDownloadDelegate(destination: destination)
|
|
60
|
+
let session = URLSession(
|
|
61
|
+
configuration: configuration,
|
|
62
|
+
delegate: delegate,
|
|
63
|
+
delegateQueue: nil
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
// downloadTask streams to a temp file rather than buffering the whole
|
|
67
|
+
// bundle in memory — a 50 MB dataTask spike is enough to get the host app
|
|
68
|
+
// jetsammed on an older device.
|
|
69
|
+
session.downloadTask(with: url).resume()
|
|
70
|
+
let waited = delegate.semaphore.wait(timeout: .now() + timeout * 4)
|
|
71
|
+
|
|
72
|
+
// The session retains its delegate until invalidated; without this,
|
|
73
|
+
// every download across the app's lifetime leaked a session + delegate.
|
|
74
|
+
session.invalidateAndCancel()
|
|
75
|
+
|
|
76
|
+
if delegate.success { return nil }
|
|
77
|
+
try? FileManager.default.removeItem(at: destination)
|
|
78
|
+
// Our own deadline passed before URLSession reported anything.
|
|
79
|
+
if waited == .timedOut { return DownloadFailure.timeout }
|
|
80
|
+
return delegate.failureReason ?? DownloadFailure.io
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
URLSession delegate enforcing the byte cap while the body streams in.
|
|
86
|
+
|
|
87
|
+
`urlSession(_:downloadTask:didWriteData:...)` fires per chunk; the moment the
|
|
88
|
+
running total (or the server's own Content-Length claim) exceeds the cap, the
|
|
89
|
+
task is cancelled — nothing more lands on disk. All terminal paths signal the
|
|
90
|
+
semaphore exactly once: didFinishDownloading only signals on success, and every
|
|
91
|
+
completion (success, cancel, error, timeout) also passes through
|
|
92
|
+
`didCompleteWithError`, where the single signal for failures lives.
|
|
93
|
+
*/
|
|
94
|
+
private final class SizeCappedDownloadDelegate: NSObject, URLSessionDownloadDelegate {
|
|
95
|
+
let semaphore = DispatchSemaphore(value: 0)
|
|
96
|
+
private(set) var success = false
|
|
97
|
+
/// The first failure cause observed (DownloadFailure vocabulary). Later
|
|
98
|
+
/// signals — didCompleteWithError always follows — never overwrite it.
|
|
99
|
+
private(set) var failureReason: String?
|
|
100
|
+
private func fail(_ reason: String) {
|
|
101
|
+
if failureReason == nil { failureReason = reason }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private let destination: URL
|
|
105
|
+
private var cancelledForSize = false
|
|
106
|
+
|
|
107
|
+
init(destination: URL) {
|
|
108
|
+
self.destination = destination
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
Certificate pinning, when the host app ships pins.
|
|
113
|
+
|
|
114
|
+
This runs during the TLS handshake — before a single body byte is written
|
|
115
|
+
and before any redirect is followed — so an intercepted endpoint can neither
|
|
116
|
+
serve content nor bounce the download somewhere else. No pins configured for
|
|
117
|
+
the host means `verify` returns true and behaviour is unchanged.
|
|
118
|
+
|
|
119
|
+
Rejecting here cancels the task, which reaches `didCompleteWithError` and
|
|
120
|
+
fails the download exactly like any other transport error. It is not retried
|
|
121
|
+
against the same endpoint: a pin mismatch is not a transient condition.
|
|
122
|
+
*/
|
|
123
|
+
func urlSession(
|
|
124
|
+
_ session: URLSession,
|
|
125
|
+
didReceive challenge: URLAuthenticationChallenge,
|
|
126
|
+
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void
|
|
127
|
+
) {
|
|
128
|
+
guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust,
|
|
129
|
+
let serverTrust = challenge.protectionSpace.serverTrust else {
|
|
130
|
+
completionHandler(.performDefaultHandling, nil)
|
|
131
|
+
return
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
let host = challenge.protectionSpace.host
|
|
135
|
+
if TlsPinning.verify(serverTrust: serverTrust, host: host) {
|
|
136
|
+
completionHandler(.useCredential, URLCredential(trust: serverTrust))
|
|
137
|
+
} else {
|
|
138
|
+
pinRejected = true
|
|
139
|
+
completionHandler(.cancelAuthenticationChallenge, nil)
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/// Set when a handshake was refused by pinning, so the failure logs honestly.
|
|
144
|
+
private(set) var pinRejected = false
|
|
145
|
+
|
|
146
|
+
/// Emit at most one progress event per this interval — didWriteData is hot.
|
|
147
|
+
private static let progressIntervalMs: Int64 = 500
|
|
148
|
+
private var lastProgressAtMs: Int64 = 0
|
|
149
|
+
|
|
150
|
+
func urlSession(
|
|
151
|
+
_ session: URLSession,
|
|
152
|
+
downloadTask: URLSessionDownloadTask,
|
|
153
|
+
didWriteData bytesWritten: Int64,
|
|
154
|
+
totalBytesWritten: Int64,
|
|
155
|
+
totalBytesExpectedToWrite: Int64
|
|
156
|
+
) {
|
|
157
|
+
let claimed = totalBytesExpectedToWrite // NSURLSessionTransferSizeUnknown (-1) when absent
|
|
158
|
+
if totalBytesWritten > BundleDownloader.maxBytes ||
|
|
159
|
+
(claimed > 0 && claimed > BundleDownloader.maxBytes) {
|
|
160
|
+
cancelledForSize = true
|
|
161
|
+
NSLog(
|
|
162
|
+
"[ScaleBunOta] Download rejected: exceeds \(BundleDownloader.maxBytes) bytes " +
|
|
163
|
+
"(written=\(totalBytesWritten), claimed=\(claimed)) — cancelling mid-stream"
|
|
164
|
+
)
|
|
165
|
+
downloadTask.cancel()
|
|
166
|
+
return
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Throttled progress to JS. `claimed` can be the COMPRESSED length on
|
|
170
|
+
// an encoded response while written bytes are decompressed — JS clamps
|
|
171
|
+
// the percentage, and -1 (unknown) is passed through as unknown.
|
|
172
|
+
let nowMs = Int64(Date().timeIntervalSince1970 * 1000)
|
|
173
|
+
if nowMs - lastProgressAtMs >= SizeCappedDownloadDelegate.progressIntervalMs {
|
|
174
|
+
lastProgressAtMs = nowMs
|
|
175
|
+
ScaleBunOtaEventsModule.emitProgress(
|
|
176
|
+
bytesRead: totalBytesWritten,
|
|
177
|
+
totalBytes: claimed
|
|
178
|
+
)
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
func urlSession(
|
|
183
|
+
_ session: URLSession,
|
|
184
|
+
downloadTask: URLSessionDownloadTask,
|
|
185
|
+
didFinishDownloadingTo location: URL
|
|
186
|
+
) {
|
|
187
|
+
if let http = downloadTask.response as? HTTPURLResponse,
|
|
188
|
+
!(200...299).contains(http.statusCode) {
|
|
189
|
+
NSLog("[ScaleBunOta] Download failed: HTTP \(http.statusCode)")
|
|
190
|
+
fail(DownloadFailure.http(http.statusCode))
|
|
191
|
+
return // didCompleteWithError still fires and signals
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
let fm = FileManager.default
|
|
195
|
+
|
|
196
|
+
// Belt over the streaming brace: a body small enough to never trip the
|
|
197
|
+
// per-chunk check is re-measured once whole.
|
|
198
|
+
let attributes = try? fm.attributesOfItem(atPath: location.path)
|
|
199
|
+
let size = (attributes?[.size] as? NSNumber)?.int64Value ?? 0
|
|
200
|
+
if size > BundleDownloader.maxBytes {
|
|
201
|
+
NSLog("[ScaleBunOta] Download rejected: \(size) bytes exceeds \(BundleDownloader.maxBytes)")
|
|
202
|
+
fail(DownloadFailure.sizeExceeded)
|
|
203
|
+
return
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
do {
|
|
207
|
+
try? fm.removeItem(at: destination)
|
|
208
|
+
try fm.createDirectory(
|
|
209
|
+
at: destination.deletingLastPathComponent(),
|
|
210
|
+
withIntermediateDirectories: true
|
|
211
|
+
)
|
|
212
|
+
// The system deletes `location` as soon as this handler returns,
|
|
213
|
+
// so the file must be moved out synchronously, not scheduled.
|
|
214
|
+
try fm.moveItem(at: location, to: destination)
|
|
215
|
+
success = true
|
|
216
|
+
// Terminal tick: read == total signals completion even when the
|
|
217
|
+
// whole body arrived inside one throttle window.
|
|
218
|
+
ScaleBunOtaEventsModule.emitProgress(bytesRead: size, totalBytes: size)
|
|
219
|
+
} catch {
|
|
220
|
+
NSLog("[ScaleBunOta] Download failed to persist the file")
|
|
221
|
+
fail(DownloadFailure.io)
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
func urlSession(
|
|
226
|
+
_ session: URLSession,
|
|
227
|
+
task: URLSessionTask,
|
|
228
|
+
didCompleteWithError error: Error?
|
|
229
|
+
) {
|
|
230
|
+
if cancelledForSize {
|
|
231
|
+
fail(DownloadFailure.sizeExceeded)
|
|
232
|
+
} else if pinRejected {
|
|
233
|
+
fail(DownloadFailure.pinMismatch)
|
|
234
|
+
} else if let error = error {
|
|
235
|
+
fail(DownloadFailure.of(error))
|
|
236
|
+
}
|
|
237
|
+
if let error = error, !cancelledForSize, !pinRejected {
|
|
238
|
+
// The code only: the error description and userInfo can carry the
|
|
239
|
+
// presigned URL, signature included.
|
|
240
|
+
NSLog("[ScaleBunOta] Download failed: \((error as NSError).code) (\(failureReason ?? DownloadFailure.io))")
|
|
241
|
+
} else if pinRejected {
|
|
242
|
+
// TlsPinning.verify already logged which host and how many pins it
|
|
243
|
+
// weighed. Repeating it as a transport error ("cancelled") would bury
|
|
244
|
+
// the only line that says why.
|
|
245
|
+
NSLog("[ScaleBunOta] Download aborted: TLS pin check refused the connection")
|
|
246
|
+
}
|
|
247
|
+
semaphore.signal()
|
|
248
|
+
}
|
|
249
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import MachO
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
Best-effort jailbreak detection.
|
|
6
|
+
|
|
7
|
+
The iOS half of `DeviceIntegrity.kt`, and deliberately as modest in what it
|
|
8
|
+
claims. Jailbreak detection is a signal, never a boundary: anything running
|
|
9
|
+
outside the sandbox can defeat any check made from inside the app, and an
|
|
10
|
+
attacker with a jailbroken device has already won that argument. What it IS good
|
|
11
|
+
for is telling an operator that a fleet's telemetry — crash rates, adoption,
|
|
12
|
+
rollback rates — includes devices whose OTA slot is writable by other processes,
|
|
13
|
+
and letting a security-sensitive host app decide to withhold updates on those
|
|
14
|
+
devices.
|
|
15
|
+
|
|
16
|
+
That decision point now exists, in JS rather than here, and identically on both
|
|
17
|
+
platforms: `ota.onCompromisedDevice` ('allow' by default; 'withhold'
|
|
18
|
+
short-circuits the check/download path and emits an UPDATE_WITHHELD event
|
|
19
|
+
naming these indicators). See BootGuardConfig in
|
|
20
|
+
features/ota/OtaOrchestrator.ts. Nothing in this file enforces anything — it
|
|
21
|
+
measures, and the measurement is reported either way.
|
|
22
|
+
|
|
23
|
+
The checks are the cheap, well-understood ones: known jailbreak paths, a write
|
|
24
|
+
outside the sandbox, and injected tweak libraries. No heuristics that produce
|
|
25
|
+
false positives on ordinary devices, because a false positive here means a
|
|
26
|
+
paying customer stops receiving updates. Nothing here touches UIKit, so it is
|
|
27
|
+
safe from any thread and inside an app extension.
|
|
28
|
+
|
|
29
|
+
`root_manager_installed` is shared with Android where the condition is the same,
|
|
30
|
+
so the dashboard does not have to special-case a platform to count one fact.
|
|
31
|
+
*/
|
|
32
|
+
enum DeviceIntegrity {
|
|
33
|
+
|
|
34
|
+
private static let jailbreakPaths = [
|
|
35
|
+
"/Applications/Cydia.app",
|
|
36
|
+
"/Applications/Sileo.app",
|
|
37
|
+
"/Applications/Zebra.app",
|
|
38
|
+
"/Library/MobileSubstrate/MobileSubstrate.dylib",
|
|
39
|
+
"/usr/sbin/sshd",
|
|
40
|
+
"/usr/bin/ssh",
|
|
41
|
+
"/etc/apt",
|
|
42
|
+
"/private/var/lib/apt/",
|
|
43
|
+
"/var/jb",
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
/// Substrings of dyld image names that only appear when a tweak is injected.
|
|
47
|
+
private static let injectedLibraryMarkers = [
|
|
48
|
+
"mobilesubstrate",
|
|
49
|
+
"substrate",
|
|
50
|
+
"substitute",
|
|
51
|
+
"libhooker",
|
|
52
|
+
"ellekit",
|
|
53
|
+
"cycript",
|
|
54
|
+
"frida",
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
Reasons this device looks jailbroken. Empty list = nothing detected, which
|
|
59
|
+
is NOT the same as "device is clean" — see the type comment.
|
|
60
|
+
|
|
61
|
+
Always empty on the simulator: several of these trip there by construction,
|
|
62
|
+
and reporting a developer's simulator as compromised is noise that would
|
|
63
|
+
train operators to ignore the signal.
|
|
64
|
+
*/
|
|
65
|
+
static func jailbreakIndicators() -> [String] {
|
|
66
|
+
#if targetEnvironment(simulator)
|
|
67
|
+
return []
|
|
68
|
+
#else
|
|
69
|
+
var found: [String] = []
|
|
70
|
+
let fm = FileManager.default
|
|
71
|
+
|
|
72
|
+
if jailbreakPaths.contains(where: { fm.fileExists(atPath: $0) }) {
|
|
73
|
+
found.append("jailbreak_path_present")
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// A sandboxed app cannot write outside its container. Succeeding here
|
|
77
|
+
// means the sandbox is not being enforced, which is the condition that
|
|
78
|
+
// actually matters for an OTA slot — it is what lets another process
|
|
79
|
+
// rewrite the bundle we are about to execute.
|
|
80
|
+
let probe = "/private/scalebun_sandbox_probe"
|
|
81
|
+
if (try? "probe".write(toFile: probe, atomically: true, encoding: .utf8)) != nil {
|
|
82
|
+
found.append("sandbox_escape_writable")
|
|
83
|
+
try? fm.removeItem(atPath: probe)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if hasInjectedLibrary() {
|
|
87
|
+
found.append("root_manager_installed")
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return found
|
|
91
|
+
#endif
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
Is a known tweak runtime loaded into this process?
|
|
96
|
+
|
|
97
|
+
Walks the dyld image list, which is a read of already-resident process state
|
|
98
|
+
— no filesystem access, no entitlements, no prompts. This is the check that
|
|
99
|
+
survives the common trick of hiding the jailbreak paths from `stat`, because
|
|
100
|
+
a tweak that is actually hooking the app has to be mapped into it.
|
|
101
|
+
*/
|
|
102
|
+
private static func hasInjectedLibrary() -> Bool {
|
|
103
|
+
for index in 0..<_dyld_image_count() {
|
|
104
|
+
guard let raw = _dyld_get_image_name(index) else { continue }
|
|
105
|
+
let name = String(cString: raw).lowercased()
|
|
106
|
+
if injectedLibraryMarkers.contains(where: { name.contains($0) }) {
|
|
107
|
+
return true
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return false
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
WHY a bundle download failed, as a code from a FIXED vocabulary — the iOS twin of
|
|
5
|
+
android/.../DownloadFailure.kt, with the same strings.
|
|
6
|
+
|
|
7
|
+
The downloader returned a bare Bool, so every failure reached the dashboard as
|
|
8
|
+
"DOWNLOAD_FAILED": an expired presigned URL, a DNS failure and a dropped connection
|
|
9
|
+
were one row.
|
|
10
|
+
|
|
11
|
+
NEVER a URL, host or error description. Presigned URLs carry X-Amz-Signature, the
|
|
12
|
+
object-store host names the account, and NSError's userInfo holds the failing URL.
|
|
13
|
+
Classification reads the error CODE only; JS re-validates the result against the
|
|
14
|
+
same list (signedDownload.ts DOWNLOAD_REASON) before anything reaches the wire.
|
|
15
|
+
|
|
16
|
+
Pure Foundation so `swift test` compiles it (Package.swift sources list).
|
|
17
|
+
*/
|
|
18
|
+
enum DownloadFailure {
|
|
19
|
+
static let timeout = "timeout"
|
|
20
|
+
static let dns = "dns"
|
|
21
|
+
static let tls = "tls"
|
|
22
|
+
static let io = "io"
|
|
23
|
+
static let pinMismatch = "pin_mismatch"
|
|
24
|
+
static let sizeExceeded = "size_exceeded"
|
|
25
|
+
static let redirectLimit = "redirect_limit"
|
|
26
|
+
|
|
27
|
+
/// `http_404`. A status outside 100...599 is not HTTP at all — reported as io.
|
|
28
|
+
static func http(_ status: Int) -> String {
|
|
29
|
+
(100...599).contains(status) ? "http_\(status)" : io
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/// Classify a transport error by its URLError CODE. Never reads a description.
|
|
33
|
+
static func of(_ error: Error?) -> String {
|
|
34
|
+
guard let error = error else { return io }
|
|
35
|
+
let ns = error as NSError
|
|
36
|
+
guard ns.domain == NSURLErrorDomain else { return io }
|
|
37
|
+
switch URLError.Code(rawValue: ns.code) {
|
|
38
|
+
case .timedOut:
|
|
39
|
+
return timeout
|
|
40
|
+
case .cannotFindHost, .dnsLookupFailed:
|
|
41
|
+
return dns
|
|
42
|
+
case .secureConnectionFailed,
|
|
43
|
+
.serverCertificateHasBadDate,
|
|
44
|
+
.serverCertificateUntrusted,
|
|
45
|
+
.serverCertificateHasUnknownRoot,
|
|
46
|
+
.serverCertificateNotYetValid,
|
|
47
|
+
.clientCertificateRejected,
|
|
48
|
+
.clientCertificateRequired:
|
|
49
|
+
return tls
|
|
50
|
+
case .httpTooManyRedirects, .redirectToNonExistentLocation:
|
|
51
|
+
return redirectLimit
|
|
52
|
+
default:
|
|
53
|
+
return io
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* SB-OTA-RSA-SHA256-V1 binary codec — the iOS mirror of the TypeScript reference
|
|
5
|
+
* (`packages/ota-protocol/src/codec.ts`), the Android `OtaProtocol.kt`, and the
|
|
6
|
+
* JVM parity harness (`tools/rsa-ota-parity/RsaOtaParity.java`). Pure Foundation,
|
|
7
|
+
* no RN/CryptoKit dependency, so it is unit-testable and cannot be neutered by
|
|
8
|
+
* the JS bundle it protects. See docs/ota/SB-OTA-RSA-SHA256-V1.md.
|
|
9
|
+
*
|
|
10
|
+
* Still not compiled on the development machine (Windows, no macOS toolchain),
|
|
11
|
+
* but no longer unproven: `Package.swift` at the repo root wraps this file,
|
|
12
|
+
* ScaleBunOtaKeyRegistry and ScaleBunOtaReleaseVerifier into a Swift package with
|
|
13
|
+
* no React dependency, and ci.yml's `ios-ota-verifier` job runs `swift test` on a
|
|
14
|
+
* macOS runner — compiling them and executing ScaleBunOtaVerifierTests
|
|
15
|
+
* (packages/react-native/ios/OtaTests) against the SAME shared fixtures as the
|
|
16
|
+
* JVM parity harness, in the same job.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
enum OtaFailureCode: String {
|
|
20
|
+
case INVALID_ENVELOPE
|
|
21
|
+
case INVALID_BASE64
|
|
22
|
+
case UNSUPPORTED_PROTOCOL
|
|
23
|
+
case UNSUPPORTED_SCHEMA
|
|
24
|
+
case UNSUPPORTED_SIGNATURE_ALGORITHM
|
|
25
|
+
case UNSUPPORTED_HASH_ALGORITHM
|
|
26
|
+
case UNKNOWN_KEY_ID
|
|
27
|
+
case INVALID_PUBLIC_KEY
|
|
28
|
+
case INVALID_SIGNATURE
|
|
29
|
+
case INVALID_SIGNED_PAYLOAD
|
|
30
|
+
case PROJECT_MISMATCH
|
|
31
|
+
case APPLICATION_MISMATCH
|
|
32
|
+
case PLATFORM_MISMATCH
|
|
33
|
+
case APP_VERSION_MISMATCH
|
|
34
|
+
case RUNTIME_VERSION_MISMATCH
|
|
35
|
+
case RELEASE_DOWNGRADE_REJECTED
|
|
36
|
+
case RELEASE_EXPIRED
|
|
37
|
+
case DOWNLOAD_FAILED
|
|
38
|
+
case DOWNLOAD_TOO_LARGE
|
|
39
|
+
case ARTIFACT_SIZE_MISMATCH
|
|
40
|
+
case ARTIFACT_HASH_MISMATCH
|
|
41
|
+
case PATCH_BASE_MISMATCH
|
|
42
|
+
case PATCH_RESULT_MISMATCH
|
|
43
|
+
case UNSAFE_ARCHIVE
|
|
44
|
+
case STAGING_FAILED
|
|
45
|
+
case ACTIVATION_FAILED
|
|
46
|
+
case INTERNAL_VERIFICATION_ERROR
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
struct OtaVerifyError: Error {
|
|
50
|
+
let code: OtaFailureCode
|
|
51
|
+
let message: String
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
struct SignedRelease {
|
|
55
|
+
let signatureAlgorithm: String
|
|
56
|
+
let hashAlgorithm: String
|
|
57
|
+
let keyId: String
|
|
58
|
+
let projectId: String
|
|
59
|
+
let applicationId: String
|
|
60
|
+
let releaseId: String
|
|
61
|
+
let bundleId: String
|
|
62
|
+
let platform: String
|
|
63
|
+
let artifactType: String
|
|
64
|
+
let targetAppVersion: String
|
|
65
|
+
let targetRuntimeVersion: String
|
|
66
|
+
let minimumSdkVersion: String
|
|
67
|
+
let releaseSequence: Int64
|
|
68
|
+
let issuedAtEpochSeconds: Int64
|
|
69
|
+
let expiresAtEpochSeconds: Int64
|
|
70
|
+
let artifactSize: Int64
|
|
71
|
+
let artifactSha256: String
|
|
72
|
+
let baseBundleId: String
|
|
73
|
+
let baseArtifactSha256: String
|
|
74
|
+
let resultArtifactSha256: String
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
enum OtaProtocol {
|
|
78
|
+
static let magic = "SBOTA001"
|
|
79
|
+
static let schemaVersion = 1
|
|
80
|
+
static let signatureAlgorithm = "SB-OTA-RSA-SHA256-V1"
|
|
81
|
+
static let hashAlgorithm = "SHA-256"
|
|
82
|
+
static let maxSignedPayloadBytes = 8192
|
|
83
|
+
static let maxSignatureBytes = 1024
|
|
84
|
+
static let maxStringFieldBytes = 256
|
|
85
|
+
static let sha256Len = 32
|
|
86
|
+
static let maxSafeUint64: Int64 = 9_007_199_254_740_991 // 2^53 - 1
|
|
87
|
+
|
|
88
|
+
private static let magicBytes = Array(magic.utf8)
|
|
89
|
+
|
|
90
|
+
/// Strict canonical standard-Base64 decode with a hard size cap.
|
|
91
|
+
static func decodeBase64Strict(_ value: String, _ maxBytes: Int, _ what: String) throws -> [UInt8] {
|
|
92
|
+
if value.isEmpty { throw OtaVerifyError(code: .INVALID_BASE64, message: "\(what): empty") }
|
|
93
|
+
if value.count > (maxBytes * 4) / 3 + 4 {
|
|
94
|
+
throw OtaVerifyError(code: .INVALID_BASE64, message: "\(what): exceeds size limit")
|
|
95
|
+
}
|
|
96
|
+
if value.count % 4 != 0 || value.range(of: "^[A-Za-z0-9+/]*={0,2}$", options: .regularExpression) == nil {
|
|
97
|
+
throw OtaVerifyError(code: .INVALID_BASE64, message: "\(what): not canonical base64")
|
|
98
|
+
}
|
|
99
|
+
guard let decoded = Data(base64Encoded: value) else {
|
|
100
|
+
throw OtaVerifyError(code: .INVALID_BASE64, message: "\(what): invalid base64")
|
|
101
|
+
}
|
|
102
|
+
if decoded.base64EncodedString() != value {
|
|
103
|
+
throw OtaVerifyError(code: .INVALID_BASE64, message: "\(what): non-canonical base64")
|
|
104
|
+
}
|
|
105
|
+
if decoded.count > maxBytes {
|
|
106
|
+
throw OtaVerifyError(code: .INVALID_BASE64, message: "\(what): decoded exceeds limit")
|
|
107
|
+
}
|
|
108
|
+
return [UInt8](decoded)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/// Parse ONLY enough to obtain the (still-unauthenticated) keyId (docs §5).
|
|
112
|
+
static func peekKeyId(_ bytes: [UInt8]) throws -> String {
|
|
113
|
+
if bytes.count > maxSignedPayloadBytes {
|
|
114
|
+
throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "payload too large")
|
|
115
|
+
}
|
|
116
|
+
var r = Reader(bytes)
|
|
117
|
+
if try r.fixed(magicBytes.count) != magicBytes {
|
|
118
|
+
throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "bad magic")
|
|
119
|
+
}
|
|
120
|
+
if try r.u16() != schemaVersion { throw OtaVerifyError(code: .UNSUPPORTED_SCHEMA, message: "schema") }
|
|
121
|
+
_ = try r.str("signatureAlgorithm")
|
|
122
|
+
_ = try r.str("hashAlgorithm")
|
|
123
|
+
let keyId = try r.str("keyId")
|
|
124
|
+
if keyId.isEmpty { throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "empty keyId") }
|
|
125
|
+
return keyId
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/// Fully parse + validate an authenticated payload.
|
|
129
|
+
static func parse(_ bytes: [UInt8]) throws -> SignedRelease {
|
|
130
|
+
if bytes.count > maxSignedPayloadBytes {
|
|
131
|
+
throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "payload too large")
|
|
132
|
+
}
|
|
133
|
+
var r = Reader(bytes)
|
|
134
|
+
if try r.fixed(magicBytes.count) != magicBytes {
|
|
135
|
+
throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "bad magic")
|
|
136
|
+
}
|
|
137
|
+
if try r.u16() != schemaVersion { throw OtaVerifyError(code: .UNSUPPORTED_SCHEMA, message: "schema") }
|
|
138
|
+
let sigAlg = try r.str("signatureAlgorithm")
|
|
139
|
+
if sigAlg != signatureAlgorithm { throw OtaVerifyError(code: .UNSUPPORTED_SIGNATURE_ALGORITHM, message: sigAlg) }
|
|
140
|
+
let hashAlg = try r.str("hashAlgorithm")
|
|
141
|
+
if hashAlg != hashAlgorithm { throw OtaVerifyError(code: .UNSUPPORTED_HASH_ALGORITHM, message: hashAlg) }
|
|
142
|
+
|
|
143
|
+
let keyId = try r.str("keyId")
|
|
144
|
+
let projectId = try r.str("projectId")
|
|
145
|
+
let applicationId = try r.str("applicationId")
|
|
146
|
+
let releaseId = try r.str("releaseId")
|
|
147
|
+
let bundleId = try r.str("bundleId")
|
|
148
|
+
for v in [keyId, projectId, applicationId, releaseId, bundleId] where v.isEmpty {
|
|
149
|
+
throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "empty id")
|
|
150
|
+
}
|
|
151
|
+
let platform = try r.str("platform")
|
|
152
|
+
if platform != "android" && platform != "ios" {
|
|
153
|
+
throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "platform")
|
|
154
|
+
}
|
|
155
|
+
let artifactType = try r.str("artifactType")
|
|
156
|
+
if artifactType != "full" && artifactType != "patch" {
|
|
157
|
+
throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "artifactType")
|
|
158
|
+
}
|
|
159
|
+
let targetAppVersion = try r.str("targetAppVersion")
|
|
160
|
+
let targetRuntimeVersion = try r.str("targetRuntimeVersion")
|
|
161
|
+
let minimumSdkVersion = try r.str("minimumSdkVersion")
|
|
162
|
+
let releaseSequence = try r.u64()
|
|
163
|
+
let issuedAt = try r.u64()
|
|
164
|
+
let expiresAt = try r.u64()
|
|
165
|
+
let artifactSize = try r.u64()
|
|
166
|
+
if issuedAt == 0 { throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "issuedAt zero") }
|
|
167
|
+
if artifactSize == 0 { throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "artifactSize zero") }
|
|
168
|
+
if expiresAt != 0 && expiresAt < issuedAt {
|
|
169
|
+
throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "expiresAt < issuedAt")
|
|
170
|
+
}
|
|
171
|
+
let artifactSha = try r.fixed(sha256Len)
|
|
172
|
+
let baseBundleId = try r.str("baseBundleId")
|
|
173
|
+
let baseSha = try r.lenBytes(sha256Len, "baseArtifactSha256")
|
|
174
|
+
let resultSha = try r.fixed(sha256Len)
|
|
175
|
+
if artifactType == "full" {
|
|
176
|
+
if !baseBundleId.isEmpty || !baseSha.isEmpty {
|
|
177
|
+
throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "full has base fields")
|
|
178
|
+
}
|
|
179
|
+
} else {
|
|
180
|
+
if baseBundleId.isEmpty || baseSha.count != sha256Len {
|
|
181
|
+
throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "patch missing base")
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if r.remaining() != 0 { throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "trailing bytes") }
|
|
185
|
+
|
|
186
|
+
return SignedRelease(
|
|
187
|
+
signatureAlgorithm: sigAlg, hashAlgorithm: hashAlg, keyId: keyId, projectId: projectId,
|
|
188
|
+
applicationId: applicationId, releaseId: releaseId, bundleId: bundleId, platform: platform,
|
|
189
|
+
artifactType: artifactType, targetAppVersion: targetAppVersion,
|
|
190
|
+
targetRuntimeVersion: targetRuntimeVersion, minimumSdkVersion: minimumSdkVersion,
|
|
191
|
+
releaseSequence: releaseSequence, issuedAtEpochSeconds: issuedAt, expiresAtEpochSeconds: expiresAt,
|
|
192
|
+
artifactSize: artifactSize, artifactSha256: toHex(artifactSha), baseBundleId: baseBundleId,
|
|
193
|
+
baseArtifactSha256: baseSha.count == sha256Len ? toHex(baseSha) : "", resultArtifactSha256: toHex(resultSha)
|
|
194
|
+
)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
static func toHex(_ bytes: [UInt8]) -> String {
|
|
198
|
+
bytes.map { String(format: "%02x", $0) }.joined()
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
private struct Reader {
|
|
202
|
+
let b: [UInt8]
|
|
203
|
+
var pos = 0
|
|
204
|
+
init(_ b: [UInt8]) { self.b = b }
|
|
205
|
+
|
|
206
|
+
mutating func need(_ n: Int) throws {
|
|
207
|
+
if n < 0 || pos + n > b.count { throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "truncated") }
|
|
208
|
+
}
|
|
209
|
+
mutating func fixed(_ n: Int) throws -> [UInt8] {
|
|
210
|
+
try need(n); let o = Array(b[pos..<pos + n]); pos += n; return o
|
|
211
|
+
}
|
|
212
|
+
mutating func u16() throws -> Int {
|
|
213
|
+
let x = try fixed(2); return (Int(x[0]) << 8) | Int(x[1])
|
|
214
|
+
}
|
|
215
|
+
mutating func u32() throws -> Int64 {
|
|
216
|
+
let x = try fixed(4)
|
|
217
|
+
return (Int64(x[0]) << 24) | (Int64(x[1]) << 16) | (Int64(x[2]) << 8) | Int64(x[3])
|
|
218
|
+
}
|
|
219
|
+
mutating func u64() throws -> Int64 {
|
|
220
|
+
let x = try fixed(8)
|
|
221
|
+
var v: Int64 = 0
|
|
222
|
+
for i in 0..<8 {
|
|
223
|
+
// guard against overflow into the sign bit before shifting.
|
|
224
|
+
if v > (Int64.max >> 8) { throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "uint64 overflow") }
|
|
225
|
+
v = (v << 8) | Int64(x[i])
|
|
226
|
+
}
|
|
227
|
+
if v < 0 || v > maxSafeUint64 {
|
|
228
|
+
throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "uint64 out of safe range")
|
|
229
|
+
}
|
|
230
|
+
return v
|
|
231
|
+
}
|
|
232
|
+
mutating func lenBytes(_ max: Int, _ field: String) throws -> [UInt8] {
|
|
233
|
+
let n = try u32()
|
|
234
|
+
if n > Int64(max) { throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "\(field) length \(n) > \(max)") }
|
|
235
|
+
return try fixed(Int(n))
|
|
236
|
+
}
|
|
237
|
+
mutating func str(_ field: String = "string") throws -> String {
|
|
238
|
+
let raw = try lenBytes(maxStringFieldBytes, field)
|
|
239
|
+
guard let s = String(bytes: raw, encoding: .utf8) else {
|
|
240
|
+
throw OtaVerifyError(code: .INVALID_SIGNED_PAYLOAD, message: "\(field): invalid UTF-8")
|
|
241
|
+
}
|
|
242
|
+
return s
|
|
243
|
+
}
|
|
244
|
+
func remaining() -> Int { b.count - pos }
|
|
245
|
+
}
|
|
246
|
+
}
|