@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,793 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import React
|
|
3
|
+
import UIKit
|
|
4
|
+
|
|
5
|
+
/// Main ReplaySdk native module (RCTEventEmitter subclass).
|
|
6
|
+
/// Method signatures are exported to React Native via RCT_EXTERN_MODULE /
|
|
7
|
+
/// RCT_EXTERN_METHOD in ReplaySdkBridge.m; this class holds the implementations
|
|
8
|
+
/// and emits events to JS through `sendEvent(withName:body:)`.
|
|
9
|
+
@objc(ReplaySdk)
|
|
10
|
+
class ReplaySdk: RCTEventEmitter {
|
|
11
|
+
|
|
12
|
+
private var sessionManager: SessionManager?
|
|
13
|
+
private var transport: ReplayTransport?
|
|
14
|
+
private let interactionTracker = InteractionTracker()
|
|
15
|
+
private var nativeOutbox: NativeOutbox?
|
|
16
|
+
private var outboxUploader: OutboxUploader?
|
|
17
|
+
private var outboxConfig: ReplayConfig?
|
|
18
|
+
/// Outbox lanes parked by a per-feature quota block (shared contract v1). Kept on the module so a
|
|
19
|
+
/// block set before the outbox/uploader exists is applied when they are built. Guarded by
|
|
20
|
+
/// `quotaLock`. Written by setOutboxLaneQuota (bridge method queue) and by the uploader's
|
|
21
|
+
/// onLaneParked callback (upload queue) when it parks a lane itself after a 402 / partial grant.
|
|
22
|
+
/// `outboxUploader` is published under the same lock (see attachQuota).
|
|
23
|
+
private var quotaBlockedLanes = Set<String>()
|
|
24
|
+
private let quotaLock = NSLock()
|
|
25
|
+
|
|
26
|
+
/// Events this module can emit to JS. Must match the JS NativeEventEmitter
|
|
27
|
+
/// listener names (ScaleBunNativeInteraction drives high-confidence touch capture).
|
|
28
|
+
override func supportedEvents() -> [String]! {
|
|
29
|
+
return [
|
|
30
|
+
"ReplaySdk_SessionStateChanged", "ReplaySdk_FrameCaptured",
|
|
31
|
+
"ReplaySdk_UploadProgress", "ReplaySdk_UploadComplete",
|
|
32
|
+
"ReplaySdk_UploadFailed", "ReplaySdk_Error",
|
|
33
|
+
"ReplaySdk_SessionLimitReached", "ReplaySdk_ScreenChanged",
|
|
34
|
+
"ReplaySdk_OutboxQuotaExceeded",
|
|
35
|
+
"ScaleBunNativeInteraction"
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@objc override static func requiresMainQueueSetup() -> Bool {
|
|
40
|
+
return false
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/// Attach native touch tracking to the key window.
|
|
44
|
+
///
|
|
45
|
+
/// RETRIED, AND RE-ATTACHED ON FOREGROUND — because the previous one-shot version is the most
|
|
46
|
+
/// likely explanation for iOS capturing coordinates on 0.4% of interactions where Android
|
|
47
|
+
/// manages 15.3%.
|
|
48
|
+
///
|
|
49
|
+
/// It ran exactly once, 500 ms after `initialize()`. If `getKeyWindow()` returned nil at that
|
|
50
|
+
/// instant it logged a warning and never tried again, so native touch tracking was off for the
|
|
51
|
+
/// WHOLE app session. A cold start behind a heavy JS bundle, a slow device, or a scene-based
|
|
52
|
+
/// app whose key window is not the one that existed at +500 ms — any of those and no touch is
|
|
53
|
+
/// ever tracked. Losing that race once lost it permanently.
|
|
54
|
+
///
|
|
55
|
+
/// Android never had the problem because it attaches from a lifecycle hook
|
|
56
|
+
/// (`ReplaySdkModule.onHostResume`), so every foreground corrects an attach that was too early.
|
|
57
|
+
/// This mirrors that: bounded retries for the cold-start race, plus a foreground observer that
|
|
58
|
+
/// attaches if a previous attempt never succeeded. `attach` is idempotent —
|
|
59
|
+
/// `guard !isActive else { return }` — so a redundant call costs nothing and cannot install a
|
|
60
|
+
/// second gesture recognizer.
|
|
61
|
+
///
|
|
62
|
+
/// WHAT THIS DOES NOT FIX, stated because that same guard is why: a key window that CHANGES
|
|
63
|
+
/// after a successful attach. `attach` returns early on `isActive` without comparing the
|
|
64
|
+
/// window, so the tracker stays bound to the original one and the foreground observer cannot
|
|
65
|
+
/// help. That needs a detach-and-rebind inside `InteractionTracker`, which is a larger change
|
|
66
|
+
/// than the race this addresses. The cold-start race is the dominant cause — it costs the whole
|
|
67
|
+
/// session every time it is lost — and it is fixed here; the window-change case remains open.
|
|
68
|
+
private func activateNativeTracking() {
|
|
69
|
+
scheduleAttach(attemptsRemaining: 10)
|
|
70
|
+
NotificationCenter.default.addObserver(
|
|
71
|
+
self,
|
|
72
|
+
selector: #selector(reattachNativeTracking),
|
|
73
|
+
name: UIApplication.didBecomeActiveNotification,
|
|
74
|
+
object: nil
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// Try to attach, and try again shortly if there is no key window yet.
|
|
79
|
+
///
|
|
80
|
+
/// Ten attempts at 500 ms covers about five seconds of startup, which is far longer than a
|
|
81
|
+
/// window takes to appear and short enough that a genuinely window-less process stops asking.
|
|
82
|
+
/// The last failure is logged at warn so a host that never gets tracking is told, rather than
|
|
83
|
+
/// discovering it as an empty heatmap.
|
|
84
|
+
private func scheduleAttach(attemptsRemaining: Int) {
|
|
85
|
+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
|
|
86
|
+
guard let self = self else { return }
|
|
87
|
+
guard let window = Self.getKeyWindow() else {
|
|
88
|
+
if attemptsRemaining > 1 {
|
|
89
|
+
self.scheduleAttach(attemptsRemaining: attemptsRemaining - 1)
|
|
90
|
+
} else {
|
|
91
|
+
ReplayLogger.warn(
|
|
92
|
+
"Native tracking: no key window after repeated attempts — touch capture is off"
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
return
|
|
96
|
+
}
|
|
97
|
+
self.interactionTracker.attach(to: window, sendEvent: { [weak self] name, payload in
|
|
98
|
+
self?.sendEvent(withName: name, body: payload)
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/// Re-attach when the app becomes active, mirroring Android's `onHostResume`.
|
|
104
|
+
@objc private func reattachNativeTracking() {
|
|
105
|
+
guard let window = Self.getKeyWindow() else { return }
|
|
106
|
+
interactionTracker.attach(to: window, sendEvent: { [weak self] name, payload in
|
|
107
|
+
self?.sendEvent(withName: name, body: payload)
|
|
108
|
+
})
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/// Matches what the other two observer-registering modules here do
|
|
112
|
+
/// (`SessionManager`, `ScaleBunProfilerModule`). A native module usually outlives the app's
|
|
113
|
+
/// interesting lifetime and selector observers have been zeroing-weak since iOS 9, so this is
|
|
114
|
+
/// hygiene rather than a crash fix — but being the one file that registers and never removes is
|
|
115
|
+
/// how a convention quietly stops being one.
|
|
116
|
+
deinit {
|
|
117
|
+
NotificationCenter.default.removeObserver(self)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private static func getKeyWindow() -> UIWindow? {
|
|
121
|
+
return WindowResolver.keyWindow()
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ─── Lifecycle ──────────────────────────────────────────────────────
|
|
125
|
+
|
|
126
|
+
@objc func initialize(_ config: NSDictionary,
|
|
127
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
128
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
129
|
+
do {
|
|
130
|
+
let dict = config as? [String: Any] ?? [:]
|
|
131
|
+
let replayConfig = ReplayConfig(from: dict)
|
|
132
|
+
ReplayLogger.verbose = replayConfig.verboseLogging
|
|
133
|
+
|
|
134
|
+
sessionManager = SessionManager(config: replayConfig)
|
|
135
|
+
sessionManager?.onStateChanged = { [weak self] prev, next, sessionId in
|
|
136
|
+
self?.sendEvent(withName: "ReplaySdk_SessionStateChanged", body: [
|
|
137
|
+
"sessionId": sessionId,
|
|
138
|
+
"previousState": prev,
|
|
139
|
+
"newState": next,
|
|
140
|
+
"timestamp": Int(Date().timeIntervalSince1970 * 1000)
|
|
141
|
+
])
|
|
142
|
+
}
|
|
143
|
+
sessionManager?.onFrameCaptured = { [weak self] frameId, sessionId, seq, screen, trigger, size in
|
|
144
|
+
self?.sendEvent(withName: "ReplaySdk_FrameCaptured", body: [
|
|
145
|
+
"frameId": frameId,
|
|
146
|
+
"sessionId": sessionId,
|
|
147
|
+
"timestamp": Int(Date().timeIntervalSince1970 * 1000),
|
|
148
|
+
"sequenceNumber": seq,
|
|
149
|
+
"screenName": screen,
|
|
150
|
+
"trigger": trigger,
|
|
151
|
+
"sizeBytes": size
|
|
152
|
+
])
|
|
153
|
+
}
|
|
154
|
+
sessionManager?.onLimitReached = { [weak self] limitType, current, max, sessionId in
|
|
155
|
+
self?.sendEvent(withName: "ReplaySdk_SessionLimitReached", body: [
|
|
156
|
+
"sessionId": sessionId,
|
|
157
|
+
"limitType": limitType,
|
|
158
|
+
"currentValue": current,
|
|
159
|
+
"maxValue": max
|
|
160
|
+
])
|
|
161
|
+
}
|
|
162
|
+
// Forward screen changes to JS so the backend event stream gets SCREEN_VIEW events
|
|
163
|
+
sessionManager?.onScreenChanged = { [weak self] screenName in
|
|
164
|
+
self?.sendEvent(withName: "ReplaySdk_ScreenChanged", body: [
|
|
165
|
+
"screenName": screenName,
|
|
166
|
+
"timestamp": Int(Date().timeIntervalSince1970 * 1000)
|
|
167
|
+
])
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
transport = ReplayTransport(endpoint: replayConfig.endpoint,
|
|
171
|
+
apiKey: replayConfig.apiKey,
|
|
172
|
+
maxRetries: replayConfig.maxRetryAttempts)
|
|
173
|
+
|
|
174
|
+
// Native file-based outbox (default-safe: only when explicitly enabled).
|
|
175
|
+
outboxConfig = replayConfig
|
|
176
|
+
if replayConfig.enableNativeFileOutbox {
|
|
177
|
+
let ob = NativeOutbox(maxBytes: Int64(replayConfig.outboxMaxBytes),
|
|
178
|
+
maxAgeMs: Int64(replayConfig.outboxMaxAgeMs))
|
|
179
|
+
nativeOutbox = ob
|
|
180
|
+
// startup recovery: requeue interrupted uploads, sweep orphans, drop
|
|
181
|
+
// committed frames that violate the mask policy (masked=false).
|
|
182
|
+
ob.recover(maskRequired: ReplaySdk.maskRequired(replayConfig))
|
|
183
|
+
if replayConfig.nativeOutboxUploadEnabled {
|
|
184
|
+
let uploader = OutboxUploader(
|
|
185
|
+
outbox: ob,
|
|
186
|
+
apiBaseUrl: replayConfig.apiBaseUrl,
|
|
187
|
+
clientKey: replayConfig.clientKey,
|
|
188
|
+
useObjectStorageForFrames: replayConfig.useObjectStorageForFrames,
|
|
189
|
+
maxUploadAttempts: replayConfig.outboxMaxUploadAttempts,
|
|
190
|
+
retryIntervalMs: Int64(replayConfig.outboxRetryIntervalMs),
|
|
191
|
+
poisonMaxAttempts: replayConfig.outboxPoisonMaxAttempts,
|
|
192
|
+
respectRetryAfter: replayConfig.outboxRespectRetryAfter,
|
|
193
|
+
strictThreeSecondRetry: replayConfig.outboxStrictThreeSecondRetry)
|
|
194
|
+
attachQuota(uploader) // publishes outboxUploader under quotaLock
|
|
195
|
+
uploader.flush()
|
|
196
|
+
}
|
|
197
|
+
ReplayLogger.info("Native file outbox enabled (upload=\(replayConfig.nativeOutboxUploadEnabled))")
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
ReplayLogger.info("Native module initialized")
|
|
201
|
+
self.activateNativeTracking()
|
|
202
|
+
resolve(true)
|
|
203
|
+
} catch {
|
|
204
|
+
reject("INIT_ERROR", error.localizedDescription, error)
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
@objc func startSession(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
209
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
210
|
+
if let id = sessionManager?.startSession() {
|
|
211
|
+
resolve(id)
|
|
212
|
+
} else {
|
|
213
|
+
reject("SESSION_ERROR", "Failed to start session", nil)
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
@objc func stopSession(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
218
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
219
|
+
resolve(sessionManager?.stopSession() ?? false)
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
@objc func pauseSession(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
223
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
224
|
+
resolve(sessionManager?.pauseSession() ?? false)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
@objc func resumeSession(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
228
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
229
|
+
resolve(sessionManager?.resumeSession() ?? false)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// ─── Capture ────────────────────────────────────────────────────────
|
|
233
|
+
|
|
234
|
+
@objc func captureFrame(_ reason: String,
|
|
235
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
236
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
237
|
+
sessionManager?.captureFrame(trigger: reason) { frame in
|
|
238
|
+
if let frame = frame {
|
|
239
|
+
var result: [String: Any] = [
|
|
240
|
+
"base64": frame["base64"] as? String ?? "",
|
|
241
|
+
"width": frame["width"] as? Int ?? 0,
|
|
242
|
+
"height": frame["height"] as? Int ?? 0,
|
|
243
|
+
"sizeBytes": frame["sizeBytes"] as? Int ?? 0,
|
|
244
|
+
"format": frame["format"] as? String ?? "jpeg",
|
|
245
|
+
"timestamp": frame["timestamp"] as? Int ?? 0
|
|
246
|
+
]
|
|
247
|
+
// Visible scroll containers at capture time (points). Absent = not measured.
|
|
248
|
+
if let scrollState = frame["scrollState"] as? [[String: Any]] {
|
|
249
|
+
result["scrollState"] = scrollState
|
|
250
|
+
}
|
|
251
|
+
resolve(result)
|
|
252
|
+
} else {
|
|
253
|
+
resolve(NSNull())
|
|
254
|
+
}
|
|
255
|
+
} ?? resolve(NSNull())
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
@objc func captureManualFrame(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
259
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
260
|
+
captureFrame("manual", resolve: resolve, reject: reject)
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/// Standalone screenshot capture — works WITHOUT session initialization.
|
|
264
|
+
/// Creates a temporary ScreenshotCaptureManager, captures, and destroys.
|
|
265
|
+
/// Used by scalebun-sdk's perfCaptureScreen command for performance screenshots.
|
|
266
|
+
@objc func captureScreenshot(_ reason: String,
|
|
267
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
268
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
269
|
+
let config = ReplayConfig(from: [:])
|
|
270
|
+
let captureManager = ScreenshotCaptureManager(config: config)
|
|
271
|
+
captureManager.capture(
|
|
272
|
+
sessionId: "standalone",
|
|
273
|
+
screenName: "unknown",
|
|
274
|
+
trigger: reason
|
|
275
|
+
) { frame in
|
|
276
|
+
// captureManager is retained by this closure until completion
|
|
277
|
+
_ = captureManager // prevent premature dealloc
|
|
278
|
+
if let frame = frame {
|
|
279
|
+
var result: [String: Any] = [
|
|
280
|
+
"base64": frame["base64"] as? String ?? "",
|
|
281
|
+
"width": frame["width"] as? Int ?? 0,
|
|
282
|
+
"height": frame["height"] as? Int ?? 0,
|
|
283
|
+
"sizeBytes": frame["sizeBytes"] as? Int ?? 0,
|
|
284
|
+
"format": frame["format"] as? String ?? "jpeg",
|
|
285
|
+
"timestamp": frame["timestamp"] as? Int ?? 0
|
|
286
|
+
]
|
|
287
|
+
// Visible scroll containers at capture time (points). Absent = not measured.
|
|
288
|
+
if let scrollState = frame["scrollState"] as? [[String: Any]] {
|
|
289
|
+
result["scrollState"] = scrollState
|
|
290
|
+
}
|
|
291
|
+
resolve(result)
|
|
292
|
+
} else {
|
|
293
|
+
resolve(NSNull())
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// ─── Native file outbox ─────────────────────────────────────────────
|
|
299
|
+
|
|
300
|
+
/// Lightweight outbox bootstrap for the SaaS path where the full native
|
|
301
|
+
/// `initialize()` (which builds a SessionManager) is never called. Constructs
|
|
302
|
+
/// ONLY the durable NativeOutbox + OutboxUploader from a minimal config map.
|
|
303
|
+
/// Whether the active masking policy requires masking (drives recover() orphan sweep).
|
|
304
|
+
static func maskRequired(_ c: ReplayConfig) -> Bool {
|
|
305
|
+
return c.maskTextInputs || c.maskImages || !c.maskedElementIds.isEmpty
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/// Idempotent: a no-op once the outbox exists. Resolves false when the flag is
|
|
309
|
+
/// off or already initialized.
|
|
310
|
+
@objc func initOutbox(_ config: NSDictionary,
|
|
311
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
312
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
313
|
+
if nativeOutbox != nil { resolve(true); return }
|
|
314
|
+
let dict = config as? [String: Any] ?? [:]
|
|
315
|
+
let replayConfig = ReplayConfig(from: dict)
|
|
316
|
+
if !replayConfig.enableNativeFileOutbox { resolve(false); return }
|
|
317
|
+
outboxConfig = replayConfig
|
|
318
|
+
let ob = NativeOutbox(maxBytes: Int64(replayConfig.outboxMaxBytes),
|
|
319
|
+
maxAgeMs: Int64(replayConfig.outboxMaxAgeMs))
|
|
320
|
+
nativeOutbox = ob
|
|
321
|
+
ob.recover(maskRequired: ReplaySdk.maskRequired(replayConfig))
|
|
322
|
+
if replayConfig.nativeOutboxUploadEnabled {
|
|
323
|
+
let uploader = OutboxUploader(
|
|
324
|
+
outbox: ob,
|
|
325
|
+
apiBaseUrl: replayConfig.apiBaseUrl,
|
|
326
|
+
clientKey: replayConfig.clientKey,
|
|
327
|
+
useObjectStorageForFrames: replayConfig.useObjectStorageForFrames,
|
|
328
|
+
maxUploadAttempts: replayConfig.outboxMaxUploadAttempts,
|
|
329
|
+
retryIntervalMs: Int64(replayConfig.outboxRetryIntervalMs),
|
|
330
|
+
poisonMaxAttempts: replayConfig.outboxPoisonMaxAttempts,
|
|
331
|
+
respectRetryAfter: replayConfig.outboxRespectRetryAfter,
|
|
332
|
+
strictThreeSecondRetry: replayConfig.outboxStrictThreeSecondRetry)
|
|
333
|
+
attachQuota(uploader) // publishes outboxUploader under quotaLock
|
|
334
|
+
uploader.flush()
|
|
335
|
+
}
|
|
336
|
+
ReplayLogger.info("Native file outbox bootstrapped (upload=\(replayConfig.nativeOutboxUploadEnabled))")
|
|
337
|
+
resolve(true)
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/// Capture a screenshot to the durable native outbox. Returns metadata ONLY —
|
|
341
|
+
/// no base64 crosses the bridge. Resolves null on failure / when outbox disabled.
|
|
342
|
+
@objc func captureScreenshotToFile(_ input: NSDictionary,
|
|
343
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
344
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
345
|
+
guard let ob = nativeOutbox else {
|
|
346
|
+
reject("OUTBOX_DISABLED", "enableNativeFileOutbox is off", nil); return
|
|
347
|
+
}
|
|
348
|
+
// frames quota exhausted: don't spend CPU/disk capturing a frame that can never upload.
|
|
349
|
+
if isLaneQuotaBlocked(NativeOutbox.FRAMES) { resolve(NSNull()); return }
|
|
350
|
+
let dict = input as? [String: Any] ?? [:]
|
|
351
|
+
guard let sessionId = dict["sessionId"] as? String, !sessionId.isEmpty else {
|
|
352
|
+
reject("OUTBOX_ARG", "sessionId required", nil); return
|
|
353
|
+
}
|
|
354
|
+
let screenName = dict["screenName"] as? String ?? "unknown"
|
|
355
|
+
let trigger = dict["trigger"] as? String ?? "manual"
|
|
356
|
+
let cfg = outboxConfig ?? ReplayConfig(from: [:])
|
|
357
|
+
|
|
358
|
+
ob.initSession(sessionId, screenName)
|
|
359
|
+
let cm = ScreenshotCaptureManager(config: cfg)
|
|
360
|
+
cm.captureToData(sessionId: sessionId, screenName: screenName, trigger: trigger) { frame, data in
|
|
361
|
+
_ = cm // retain until completion
|
|
362
|
+
guard let meta = frame, let bytes = data else { resolve(NSNull()); return }
|
|
363
|
+
let frameId = meta["frameId"] as? String ?? ""
|
|
364
|
+
let format = meta["format"] as? String ?? "jpeg"
|
|
365
|
+
// Stage IMAGE ONLY — JS (ReplayCaptureManager) decides keyframe/delta +
|
|
366
|
+
// change-detection, then calls commitOutboxFrame (writes meta) or
|
|
367
|
+
// discardOutboxFrame (suppressed). No metadata json is written here.
|
|
368
|
+
guard let localFile = ob.writeFrameImage(sessionId, frameId, format, bytes) else {
|
|
369
|
+
resolve(NSNull()); return
|
|
370
|
+
}
|
|
371
|
+
var result: [String: Any] = [
|
|
372
|
+
"frameId": frameId,
|
|
373
|
+
"sessionId": sessionId,
|
|
374
|
+
"localPath": localFile,
|
|
375
|
+
"width": meta["width"] ?? 0,
|
|
376
|
+
"height": meta["height"] ?? 0,
|
|
377
|
+
"sizeBytes": meta["sizeBytes"] ?? 0,
|
|
378
|
+
"format": format,
|
|
379
|
+
"contentType": meta["contentType"] ?? "image/jpeg",
|
|
380
|
+
"timestamp": meta["timestamp"] ?? 0,
|
|
381
|
+
"screenName": screenName,
|
|
382
|
+
"trigger": trigger,
|
|
383
|
+
"masked": meta["masked"] ?? false,
|
|
384
|
+
// Cheap content hash so the JS change-detector works without base64.
|
|
385
|
+
"frameHash": ReplaySdk.fnv1a(bytes),
|
|
386
|
+
]
|
|
387
|
+
// Visible scroll containers at capture time (points). Absent = not measured.
|
|
388
|
+
if let scrollState = meta["scrollState"] as? [[String: Any]] {
|
|
389
|
+
result["scrollState"] = scrollState
|
|
390
|
+
}
|
|
391
|
+
resolve(result)
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// ─── Per-feature quota (shared contract v1) ─────────────────────────
|
|
396
|
+
|
|
397
|
+
private func isLaneQuotaBlocked(_ lane: String) -> Bool {
|
|
398
|
+
quotaLock.lock(); defer { quotaLock.unlock() }
|
|
399
|
+
return quotaBlockedLanes.contains(lane)
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/// Apply the module's parked lanes to a freshly built uploader and route its 402s back to JS.
|
|
403
|
+
private func attachQuota(_ uploader: OutboxUploader) {
|
|
404
|
+
// The uploader has already parked/purged natively. JS records the refusal from the body
|
|
405
|
+
// (which names the feature), drops a refused session by id, and re-syncs every lane.
|
|
406
|
+
uploader.onQuotaExceeded = { [weak self] status, body, retryAfterMs, sessionId in
|
|
407
|
+
self?.sendEvent(withName: "ReplaySdk_OutboxQuotaExceeded", body: [
|
|
408
|
+
"status": status,
|
|
409
|
+
"body": body,
|
|
410
|
+
"retryAfterMs": retryAfterMs,
|
|
411
|
+
"sessionId": sessionId,
|
|
412
|
+
])
|
|
413
|
+
}
|
|
414
|
+
// A lane the uploader parks itself is mirrored into the module set at once, so enqueue /
|
|
415
|
+
// commit / capture-to-file gating does not wait for JS to sync.
|
|
416
|
+
uploader.onLaneParked = { [weak self] lane in
|
|
417
|
+
guard let self = self else { return }
|
|
418
|
+
self.quotaLock.lock()
|
|
419
|
+
self.quotaBlockedLanes.insert(lane)
|
|
420
|
+
self.quotaLock.unlock()
|
|
421
|
+
}
|
|
422
|
+
// Publish the uploader and apply the parked set UNDER quotaLock — the lock setOutboxLaneQuota
|
|
423
|
+
// holds while it reads `outboxUploader` — so a park/un-park racing this is never lost, without
|
|
424
|
+
// relying on the bridge's serial method queue: either it is in the set read here, or it sees
|
|
425
|
+
// the published uploader and applies itself.
|
|
426
|
+
quotaLock.lock()
|
|
427
|
+
outboxUploader = uploader
|
|
428
|
+
for lane in quotaBlockedLanes { uploader.setLaneQuotaBlocked(lane, true) }
|
|
429
|
+
quotaLock.unlock()
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/// Park + purge (blocked) or un-park a lane. Resolves the number of files purged (0 on
|
|
433
|
+
/// un-park, or when the outbox does not exist yet — the block is still remembered and applied
|
|
434
|
+
/// when it is built).
|
|
435
|
+
@objc func setOutboxLaneQuota(_ lane: String,
|
|
436
|
+
blocked: Bool,
|
|
437
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
438
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
439
|
+
// Only the lanes of LIMITED features can be parked; errors/logs/performance never.
|
|
440
|
+
guard OutboxUploader.QUOTA_FEATURE_LANES.values.contains(lane) else { resolve(0); return }
|
|
441
|
+
var removed = 0
|
|
442
|
+
quotaLock.lock()
|
|
443
|
+
if blocked { quotaBlockedLanes.insert(lane) } else { quotaBlockedLanes.remove(lane) }
|
|
444
|
+
if let uploader = outboxUploader {
|
|
445
|
+
// Purge runs on the uploader's queue, serialized with any in-flight drain.
|
|
446
|
+
uploader.setLaneQuotaBlocked(lane, blocked)
|
|
447
|
+
} else if blocked, let ob = nativeOutbox {
|
|
448
|
+
removed = ob.purgeLane(lane)
|
|
449
|
+
}
|
|
450
|
+
quotaLock.unlock()
|
|
451
|
+
resolve(removed)
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/// Commit a staged frame: write metadata json carrying JS-authoritative
|
|
455
|
+
/// sequenceNumber/frameType/baseFrameId. Resolves the meta path or null.
|
|
456
|
+
@objc func commitOutboxFrame(_ input: NSDictionary,
|
|
457
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
458
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
459
|
+
guard let ob = nativeOutbox else { resolve(NSNull()); return }
|
|
460
|
+
let meta = (input as? [String: Any]) ?? [:]
|
|
461
|
+
if isLaneQuotaBlocked(NativeOutbox.FRAMES) {
|
|
462
|
+
// frames quota exhausted: the staged image is discarded, never made uploadable.
|
|
463
|
+
if let sid = meta["sessionId"] as? String, let fid = meta["frameId"] as? String {
|
|
464
|
+
ob.discardFrame(sid, fid)
|
|
465
|
+
}
|
|
466
|
+
resolve(NSNull()); return
|
|
467
|
+
}
|
|
468
|
+
guard let path = ob.commitFrame(meta) else { resolve(NSNull()); return }
|
|
469
|
+
outboxUploader?.flush()
|
|
470
|
+
resolve(path)
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/// Discard a staged frame the JS orchestrator suppressed (no upload).
|
|
474
|
+
@objc func discardOutboxFrame(_ sessionId: String,
|
|
475
|
+
frameId: String,
|
|
476
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
477
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
478
|
+
nativeOutbox?.discardFrame(sessionId, frameId)
|
|
479
|
+
resolve(true)
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/// Append non-frame telemetry records to the session's JSONL segment outbox.
|
|
483
|
+
/// Resolves false if the outbox is disabled (JS falls back to its own path).
|
|
484
|
+
@objc func enqueueOutboxRecords(_ lane: String,
|
|
485
|
+
sessionId: String,
|
|
486
|
+
records: NSArray,
|
|
487
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
488
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
489
|
+
guard let ob = nativeOutbox else { resolve(false); return }
|
|
490
|
+
if sessionId.isEmpty { resolve(false); return }
|
|
491
|
+
// Quota-parked lane: accept-and-discard (true), so JS does not fall back to posting records
|
|
492
|
+
// the server would refuse.
|
|
493
|
+
if isLaneQuotaBlocked(lane) { resolve(true); return }
|
|
494
|
+
ob.initSession(sessionId, "unknown")
|
|
495
|
+
let list = (records as? [[String: Any]]) ?? []
|
|
496
|
+
ob.appendTelemetry(sessionId, lane, list, laneFlushCount(lane), 256 * 1024)
|
|
497
|
+
outboxUploader?.flush()
|
|
498
|
+
resolve(true)
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
@objc func flushNativeOutbox(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
502
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
503
|
+
guard let ob = nativeOutbox else { resolve(false); return }
|
|
504
|
+
for sid in ob.listSessionIds() { ob.closeAllOpenSegments(sid) }
|
|
505
|
+
outboxUploader?.flush()
|
|
506
|
+
resolve(true)
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
@objc func recoverNativeOutbox(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
510
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
511
|
+
nativeOutbox?.recover()
|
|
512
|
+
resolve(true)
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
@objc func getOutboxStats(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
516
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
517
|
+
guard let ob = nativeOutbox else { resolve(NSNull()); return }
|
|
518
|
+
resolve([
|
|
519
|
+
"enabled": true,
|
|
520
|
+
"uploadEnabled": outboxUploader != nil,
|
|
521
|
+
"totalBytes": ob.totalBytes(),
|
|
522
|
+
"sessionCount": ob.listSessionIds().count,
|
|
523
|
+
])
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
private func laneFlushCount(_ lane: String) -> Int {
|
|
527
|
+
switch lane {
|
|
528
|
+
case "events": return 30
|
|
529
|
+
case "logs": return 50
|
|
530
|
+
case "network": return 50
|
|
531
|
+
case "errors": return 20
|
|
532
|
+
case "performance": return 50
|
|
533
|
+
default: return 30
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/// FNV-1a (32-bit) over sampled bytes — cheap content hash for JS change
|
|
538
|
+
/// detection. Samples large frames so cost stays O(1)-ish; folds in length.
|
|
539
|
+
static func fnv1a(_ data: Data) -> String {
|
|
540
|
+
var h: UInt32 = 0x811c9dc5
|
|
541
|
+
let len = data.count
|
|
542
|
+
let step = len > 4096 ? (len / 4096 + 1) : 1
|
|
543
|
+
var i = 0
|
|
544
|
+
while i < len {
|
|
545
|
+
h ^= UInt32(data[i])
|
|
546
|
+
h = h &* 0x01000193
|
|
547
|
+
i += step
|
|
548
|
+
}
|
|
549
|
+
return String(h, radix: 36) + "-" + String(len, radix: 36)
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
// ─── Voice notes (Slice D) ──────────────────────────────────────────
|
|
553
|
+
|
|
554
|
+
private static var voiceRecorder: VoiceRecorder?
|
|
555
|
+
|
|
556
|
+
@objc func startVoiceRecording(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
557
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
558
|
+
let recorder = VoiceRecorder()
|
|
559
|
+
Self.voiceRecorder = recorder
|
|
560
|
+
recorder.start { granted, err in
|
|
561
|
+
if granted {
|
|
562
|
+
resolve(NSNull())
|
|
563
|
+
} else {
|
|
564
|
+
Self.voiceRecorder = nil
|
|
565
|
+
reject("VOICE_START", err ?? "could not start recording", nil)
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
@objc func stopVoiceRecording(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
571
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
572
|
+
guard let recorder = Self.voiceRecorder else { resolve(NSNull()); return }
|
|
573
|
+
recorder.stop { clip in
|
|
574
|
+
Self.voiceRecorder = nil
|
|
575
|
+
guard let clip = clip else { resolve(NSNull()); return }
|
|
576
|
+
resolve([
|
|
577
|
+
"base64": clip.base64,
|
|
578
|
+
"mime": "audio/mp4",
|
|
579
|
+
"durationMs": clip.durationMs,
|
|
580
|
+
"byteSize": clip.byteSize,
|
|
581
|
+
"transcript": clip.transcript,
|
|
582
|
+
"transcriptAvailable": clip.transcriptAvailable,
|
|
583
|
+
])
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
@objc func cancelVoiceRecording(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
588
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
589
|
+
Self.voiceRecorder?.cancel()
|
|
590
|
+
Self.voiceRecorder = nil
|
|
591
|
+
resolve(NSNull())
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
// ─── Configuration ──────────────────────────────────────────────────
|
|
595
|
+
|
|
596
|
+
@objc func setEnabled(_ enabled: Bool,
|
|
597
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
598
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
599
|
+
resolve(NSNull())
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
@objc func setCapturingMode(_ mode: String,
|
|
603
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
604
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
605
|
+
// Apply the runtime capture-mode change (e.g. admin-forced 'frequency' via /config, or a
|
|
606
|
+
// revert to the developer's mode). Dispatched to main so the frequency Timer schedules on
|
|
607
|
+
// the main run loop. Unknown modes are ignored (leaves the current mode intact).
|
|
608
|
+
if let m = CaptureMode(rawValue: mode) {
|
|
609
|
+
DispatchQueue.main.async { [weak self] in
|
|
610
|
+
self?.sessionManager?.setCaptureMode(m)
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
resolve(NSNull())
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
@objc func setScreenshotQuality(_ quality: String,
|
|
617
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
618
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
619
|
+
resolve(NSNull())
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
@objc func setScreenshotCaptureInterval(_ intervalMs: Double,
|
|
623
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
624
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
625
|
+
// Apply the frequency-mode capture interval (paired with setCapturingMode('frequency') by
|
|
626
|
+
// the admin override). Dispatched to main so the Timer re-arms on the main run loop.
|
|
627
|
+
DispatchQueue.main.async { [weak self] in
|
|
628
|
+
self?.sessionManager?.setScreenshotInterval(Int(intervalMs))
|
|
629
|
+
}
|
|
630
|
+
resolve(NSNull())
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
@objc func setUserStepsEnabled(_ enabled: Bool,
|
|
634
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
635
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
636
|
+
resolve(NSNull())
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
@objc func setNetworkLogsEnabled(_ enabled: Bool,
|
|
640
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
641
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
642
|
+
resolve(NSNull())
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
@objc func setSdkLogsEnabled(_ enabled: Bool,
|
|
646
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
647
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
648
|
+
resolve(NSNull())
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
// ─── Privacy ────────────────────────────────────────────────────────
|
|
652
|
+
|
|
653
|
+
@objc func setPrivacyOptions(_ options: NSDictionary,
|
|
654
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
655
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
656
|
+
// Was a no-op stub — the runtime toggle silently did nothing (only a restart, which
|
|
657
|
+
// re-reads the init config, honoured it). Each supplied key merges onto the running
|
|
658
|
+
// config via SessionManager.updatePrivacy → the capture manager; absent keys stay nil →
|
|
659
|
+
// unchanged, so a partial setPrivacy call never resets the other fields.
|
|
660
|
+
sessionManager?.updatePrivacy(
|
|
661
|
+
disableScreenshots: options["disableScreenshots"] as? Bool,
|
|
662
|
+
maskTextInputs: options["maskTextInputs"] as? Bool,
|
|
663
|
+
maskImages: options["maskImages"] as? Bool,
|
|
664
|
+
ignoredScreens: options["ignoredScreens"] as? [String],
|
|
665
|
+
maskedElementIds: options["maskedElementIds"] as? [String]
|
|
666
|
+
)
|
|
667
|
+
resolve(NSNull())
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
@objc func maskElement(_ elementId: String,
|
|
671
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
672
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
673
|
+
sessionManager?.addMaskedElement(elementId)
|
|
674
|
+
resolve(NSNull())
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
@objc func unmaskElement(_ elementId: String,
|
|
678
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
679
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
680
|
+
sessionManager?.removeMaskedElement(elementId)
|
|
681
|
+
resolve(NSNull())
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
// ─── User ───────────────────────────────────────────────────────────
|
|
685
|
+
|
|
686
|
+
@objc func setUser(_ user: NSDictionary,
|
|
687
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
688
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
689
|
+
resolve(NSNull())
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
@objc func clearUser(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
693
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
694
|
+
resolve(NSNull())
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
// ─── Breadcrumbs ────────────────────────────────────────────────────
|
|
698
|
+
|
|
699
|
+
@objc func addBreadcrumb(_ breadcrumb: NSDictionary,
|
|
700
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
701
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
702
|
+
resolve(NSNull())
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
@objc func addNetworkBreadcrumb(_ request: NSDictionary,
|
|
706
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
707
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
708
|
+
resolve(NSNull())
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
// ─── Screen / Interaction ─────────────────────────────────────────
|
|
712
|
+
|
|
713
|
+
@objc func setCurrentScreen(_ screenName: String,
|
|
714
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
715
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
716
|
+
sessionManager?.setCurrentScreen(screenName)
|
|
717
|
+
resolve(NSNull())
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
@objc func reportInteraction(_ interaction: NSDictionary,
|
|
721
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
722
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
723
|
+
if sessionManager?.state == .recording {
|
|
724
|
+
let trigger = interaction["type"] as? String ?? "interaction"
|
|
725
|
+
sessionManager?.captureFrame(trigger: trigger) { _ in }
|
|
726
|
+
}
|
|
727
|
+
resolve(NSNull())
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
// ─── Query ──────────────────────────────────────────────────────────
|
|
731
|
+
|
|
732
|
+
@objc func getSessionInfo(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
733
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
734
|
+
resolve(sessionManager?.getSessionInfo() as Any)
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
@objc func getDeviceInfo(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
738
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
739
|
+
let device = UIDevice.current
|
|
740
|
+
let screen = UIScreen.main
|
|
741
|
+
let bundle = Bundle.main
|
|
742
|
+
resolve([
|
|
743
|
+
"platform": "ios",
|
|
744
|
+
"osVersion": device.systemVersion,
|
|
745
|
+
// NOT device.model — that is the family ("iPhone"), identical on every iPhone ever
|
|
746
|
+
// made. ScaleBunDeviceIdentity reports the hardware identifier, which is unique per model.
|
|
747
|
+
"deviceModel": ScaleBunDeviceIdentity.modelIdentifier(),
|
|
748
|
+
"screenWidth": Int(screen.bounds.width * screen.scale),
|
|
749
|
+
"screenHeight": Int(screen.bounds.height * screen.scale),
|
|
750
|
+
"pixelDensity": screen.scale,
|
|
751
|
+
"appName": bundle.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String ?? "",
|
|
752
|
+
"appVersion": bundle.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "0.0.0",
|
|
753
|
+
"bundleId": bundle.bundleIdentifier ?? "",
|
|
754
|
+
"locale": Locale.current.identifier
|
|
755
|
+
])
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
@objc func getSessionReplayLink(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
759
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
760
|
+
if let id = sessionManager?.sessionId {
|
|
761
|
+
resolve(["url": "", "sessionId": id, "uploaded": false])
|
|
762
|
+
} else {
|
|
763
|
+
resolve(NSNull())
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
// ─── Upload ─────────────────────────────────────────────────────────
|
|
768
|
+
|
|
769
|
+
@objc func flushUpload(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
770
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
771
|
+
resolve(true)
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
@objc func cancelUpload(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
775
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
776
|
+
resolve(NSNull())
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
// ─── Cleanup ────────────────────────────────────────────────────────
|
|
780
|
+
|
|
781
|
+
@objc func destroy(_ resolve: @escaping RCTPromiseResolveBlock,
|
|
782
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
783
|
+
interactionTracker.detach()
|
|
784
|
+
sessionManager?.destroy()
|
|
785
|
+
transport?.destroy()
|
|
786
|
+
sessionManager = nil
|
|
787
|
+
transport = nil
|
|
788
|
+
outboxUploader = nil
|
|
789
|
+
nativeOutbox = nil
|
|
790
|
+
ReplayLogger.info("Native module destroyed")
|
|
791
|
+
resolve(NSNull())
|
|
792
|
+
}
|
|
793
|
+
}
|