@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.
Files changed (1203) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -0
  3. package/android/build.gradle +94 -0
  4. package/android/consumer-rules.pro +28 -0
  5. package/android/src/androidTest/java/com/scalebun/rn/ota/ScaleBunOtaVerifierInstrumentedTest.kt +112 -0
  6. package/android/src/main/AndroidManifest.xml +14 -0
  7. package/android/src/main/java/com/scalebun/core/crash/CrashStorage.kt +155 -0
  8. package/android/src/main/java/com/scalebun/core/crash/NativeCrashHandler.kt +93 -0
  9. package/android/src/main/java/com/scalebun/core/performance/ANRWatchdog.kt +100 -0
  10. package/android/src/main/java/com/scalebun/core/performance/AppStartCollector.kt +180 -0
  11. package/android/src/main/java/com/scalebun/core/performance/FrameMetricsCollector.kt +230 -0
  12. package/android/src/main/java/com/scalebun/core/performance/PerformanceCore.kt +165 -0
  13. package/android/src/main/java/com/scalebun/profiler/ProfilerModule.kt +398 -0
  14. package/android/src/main/java/com/scalebun/profiler/ProfilerPackage.kt +24 -0
  15. package/android/src/main/java/com/scalebun/profiler/collectors/CpuCollector.kt +161 -0
  16. package/android/src/main/java/com/scalebun/profiler/collectors/IncidentDetector.kt +223 -0
  17. package/android/src/main/java/com/scalebun/profiler/collectors/MemoryCollector.kt +157 -0
  18. package/android/src/main/java/com/scalebun/profiler/collectors/RenderCollector.kt +194 -0
  19. package/android/src/main/java/com/scalebun/profiler/collectors/SamplerScheduler.kt +218 -0
  20. package/android/src/main/java/com/scalebun/profiler/collectors/ThreadCollector.kt +142 -0
  21. package/android/src/main/java/com/scalebun/replaysdk/ReplaySdkModule.kt +1117 -0
  22. package/android/src/main/java/com/scalebun/replaysdk/ReplaySdkPackage.kt +24 -0
  23. package/android/src/main/java/com/scalebun/replaysdk/capture/CaptureReason.kt +47 -0
  24. package/android/src/main/java/com/scalebun/replaysdk/capture/FrameCaptureManager.kt +574 -0
  25. package/android/src/main/java/com/scalebun/replaysdk/capture/FrameCaptureScheduler.kt +187 -0
  26. package/android/src/main/java/com/scalebun/replaysdk/capture/UiStabilityDetector.kt +214 -0
  27. package/android/src/main/java/com/scalebun/replaysdk/core/ReplayConfig.kt +144 -0
  28. package/android/src/main/java/com/scalebun/replaysdk/core/ReplayLogger.kt +31 -0
  29. package/android/src/main/java/com/scalebun/replaysdk/core/SessionIdGenerator.kt +15 -0
  30. package/android/src/main/java/com/scalebun/replaysdk/models/ReplayModels.kt +94 -0
  31. package/android/src/main/java/com/scalebun/replaysdk/outbox/NativeOutbox.kt +574 -0
  32. package/android/src/main/java/com/scalebun/replaysdk/outbox/OutboxUploader.kt +559 -0
  33. package/android/src/main/java/com/scalebun/replaysdk/privacy/PrivacyMaskProcessor.kt +126 -0
  34. package/android/src/main/java/com/scalebun/replaysdk/session/SessionManager.kt +322 -0
  35. package/android/src/main/java/com/scalebun/replaysdk/storage/ReplayStorage.kt +136 -0
  36. package/android/src/main/java/com/scalebun/replaysdk/timeline/TimelineCollector.kt +28 -0
  37. package/android/src/main/java/com/scalebun/replaysdk/tracking/InteractionTracker.kt +470 -0
  38. package/android/src/main/java/com/scalebun/replaysdk/tracking/ScreenTracker.kt +20 -0
  39. package/android/src/main/java/com/scalebun/replaysdk/tracking/ScrollContextProbe.kt +188 -0
  40. package/android/src/main/java/com/scalebun/replaysdk/transport/ReplayTransport.kt +99 -0
  41. package/android/src/main/java/com/scalebun/replaysdk/voice/VoiceRecorder.kt +121 -0
  42. package/android/src/main/java/com/scalebun/replaysdk/voice/VoiceTranscriber.kt +170 -0
  43. package/android/src/main/java/com/scalebun/rn/ScaleBunPackage.kt +113 -0
  44. package/android/src/main/java/com/scalebun/rn/crash/ScaleBunCrashModule.kt +188 -0
  45. package/android/src/main/java/com/scalebun/rn/crash/ScaleBunCrashPackage.kt +22 -0
  46. package/android/src/main/java/com/scalebun/rn/engage/ScaleBunEngageModule.kt +579 -0
  47. package/android/src/main/java/com/scalebun/rn/engage/ScaleBunEngagePackage.kt +22 -0
  48. package/android/src/main/java/com/scalebun/rn/engage/ScaleBunNotificationPresenter.kt +110 -0
  49. package/android/src/main/java/com/scalebun/rn/ota/BsPatch.kt +240 -0
  50. package/android/src/main/java/com/scalebun/rn/ota/BundleDownloader.kt +195 -0
  51. package/android/src/main/java/com/scalebun/rn/ota/DeviceIntegrity.kt +81 -0
  52. package/android/src/main/java/com/scalebun/rn/ota/DownloadFailure.kt +55 -0
  53. package/android/src/main/java/com/scalebun/rn/ota/OtaProtocol.kt +244 -0
  54. package/android/src/main/java/com/scalebun/rn/ota/ScaleBunOtaKeyRegistry.kt +100 -0
  55. package/android/src/main/java/com/scalebun/rn/ota/ScaleBunOtaModule.kt +683 -0
  56. package/android/src/main/java/com/scalebun/rn/ota/ScaleBunOtaReleaseVerifier.kt +136 -0
  57. package/android/src/main/java/com/scalebun/rn/ota/SlotManager.kt +578 -0
  58. package/android/src/main/java/com/scalebun/rn/ota/TlsPinning.kt +118 -0
  59. package/android/src/main/java/com/scalebun/rn/performance/PerformanceModule.kt +217 -0
  60. package/android/src/main/java/com/scalebun/rn/referrer/ScaleBunInstallReferrerModule.kt +77 -0
  61. package/android/src/main/java/com/scalebun/rn/storage/ScaleBunStorageModule.kt +68 -0
  62. package/android/src/main/java/com/scalebun/storage/KvFileStore.kt +174 -0
  63. package/android/src/newarch/java/com/scalebun/profiler/ProfilerSpec.kt +12 -0
  64. package/android/src/newarch/java/com/scalebun/replaysdk/ReplaySdkSpec.kt +12 -0
  65. package/android/src/newarch/java/com/scalebun/rn/crash/ScaleBunCrashSpec.kt +15 -0
  66. package/android/src/newarch/java/com/scalebun/rn/ota/ScaleBunOtaSpec.kt +16 -0
  67. package/android/src/newarch/java/com/scalebun/rn/performance/PerformanceSpec.kt +12 -0
  68. package/android/src/newarch/java/com/scalebun/rn/referrer/ScaleBunInstallReferrerSpec.kt +14 -0
  69. package/android/src/newarch/java/com/scalebun/rn/storage/ScaleBunStorageSpec.kt +16 -0
  70. package/android/src/oldarch/java/com/scalebun/profiler/ProfilerSpec.kt +34 -0
  71. package/android/src/oldarch/java/com/scalebun/replaysdk/ReplaySdkSpec.kt +77 -0
  72. package/android/src/oldarch/java/com/scalebun/rn/crash/ScaleBunCrashSpec.kt +40 -0
  73. package/android/src/oldarch/java/com/scalebun/rn/ota/ScaleBunOtaSpec.kt +42 -0
  74. package/android/src/oldarch/java/com/scalebun/rn/performance/PerformanceSpec.kt +27 -0
  75. package/android/src/oldarch/java/com/scalebun/rn/referrer/ScaleBunInstallReferrerSpec.kt +18 -0
  76. package/android/src/oldarch/java/com/scalebun/rn/storage/ScaleBunStorageSpec.kt +26 -0
  77. package/bin/lib/androidCodemod.js +370 -0
  78. package/bin/lib/iosCodemod.js +343 -0
  79. package/bin/scalebun.js +1004 -0
  80. package/dist/scalebun.full.js +37348 -0
  81. package/dist/scalebun.slim.js +34137 -0
  82. package/ios/Capture/InteractionTracker.swift +237 -0
  83. package/ios/Capture/PrivacyMaskProcessor.swift +158 -0
  84. package/ios/Capture/ScreenshotCaptureManager.swift +398 -0
  85. package/ios/Capture/WindowResolver.swift +63 -0
  86. package/ios/Core/DeviceIdentity.swift +50 -0
  87. package/ios/Core/ReplayConfig.swift +100 -0
  88. package/ios/Core/ReplayLogger.swift +22 -0
  89. package/ios/Core/SessionIdGenerator.swift +18 -0
  90. package/ios/Crash/ScaleBunCrashBridge.mm +74 -0
  91. package/ios/Crash/ScaleBunCrashHandler.swift +84 -0
  92. package/ios/Crash/ScaleBunCrashModule.swift +98 -0
  93. package/ios/Crash/ScaleBunCrashSignalBridge.h +49 -0
  94. package/ios/Crash/ScaleBunCrashSignalBridge.m +296 -0
  95. package/ios/Crash/ScaleBunCrashSignalStress.c +137 -0
  96. package/ios/Crash/ScaleBunCrashStorage.swift +121 -0
  97. package/ios/Crash/ScaleBunExceptionChain.swift +71 -0
  98. package/ios/CrashTests/ScaleBunExceptionChainTests.swift +144 -0
  99. package/ios/Engage/ScaleBunEngageBridge.m +32 -0
  100. package/ios/Engage/ScaleBunEngageModule.swift +250 -0
  101. package/ios/Engage/ScaleBunPushNotificationCenter.swift +185 -0
  102. package/ios/Ota/BsPatch.swift +203 -0
  103. package/ios/Ota/BundleDownloader.swift +249 -0
  104. package/ios/Ota/DeviceIntegrity.swift +112 -0
  105. package/ios/Ota/DownloadFailure.swift +56 -0
  106. package/ios/Ota/OtaProtocol.swift +246 -0
  107. package/ios/Ota/OtaSlotManager.swift +613 -0
  108. package/ios/Ota/ScaleBunOtaBridge.mm +92 -0
  109. package/ios/Ota/ScaleBunOtaEventsModule.swift +61 -0
  110. package/ios/Ota/ScaleBunOtaKeyRegistry.swift +147 -0
  111. package/ios/Ota/ScaleBunOtaModule.swift +587 -0
  112. package/ios/Ota/ScaleBunOtaReleaseVerifier.swift +119 -0
  113. package/ios/Ota/TlsPinning.swift +222 -0
  114. package/ios/OtaTests/DownloadFailureTests.swift +78 -0
  115. package/ios/OtaTests/ScaleBunOtaVerifierTests.swift +548 -0
  116. package/ios/Outbox/NativeOutbox.swift +632 -0
  117. package/ios/Outbox/OutboxUploader.swift +578 -0
  118. package/ios/Performance/ScaleBunPerformanceBridge.m +32 -0
  119. package/ios/Performance/ScaleBunPerformanceModule.swift +290 -0
  120. package/ios/PrivacyInfo.xcprivacy +97 -0
  121. package/ios/Profiler/ScaleBunProfilerBridge.m +55 -0
  122. package/ios/Profiler/ScaleBunProfilerModule.swift +966 -0
  123. package/ios/ReplaySdk-Bridging-Header.h +2 -0
  124. package/ios/ReplaySdk.swift +793 -0
  125. package/ios/ReplaySdkBridge.m +97 -0
  126. package/ios/Session/SessionManager.swift +273 -0
  127. package/ios/Skan/ScaleBunSkanBridge.m +14 -0
  128. package/ios/Skan/ScaleBunSkanModule.swift +61 -0
  129. package/ios/Storage/ReplayStorage.swift +61 -0
  130. package/ios/Storage/ScaleBunKvFileStore.swift +125 -0
  131. package/ios/Storage/ScaleBunStorageBridge.mm +72 -0
  132. package/ios/Storage/ScaleBunStorageModule.swift +57 -0
  133. package/ios/Transport/ReplayTransport.swift +70 -0
  134. package/ios/VoiceRecorder.swift +145 -0
  135. package/lib/commonjs/analytics/EventTracker.js +598 -0
  136. package/lib/commonjs/analytics/automaticEvents.js +71 -0
  137. package/lib/commonjs/analytics/batching.js +64 -0
  138. package/lib/commonjs/analytics/eventLane.js +55 -0
  139. package/lib/commonjs/analytics/revenue.js +125 -0
  140. package/lib/commonjs/analytics/subscription.js +94 -0
  141. package/lib/commonjs/bootstrap/FeatureRegistry.js +86 -0
  142. package/lib/commonjs/bootstrap/SDKBootstrapper.js +748 -0
  143. package/lib/commonjs/bucketing/fnv1a32.js +45 -0
  144. package/lib/commonjs/compat/codepush.js +153 -0
  145. package/lib/commonjs/config/ConfigManager.js +238 -0
  146. package/lib/commonjs/config/configTypes.js +16 -0
  147. package/lib/commonjs/config/otaPolicyState.js +85 -0
  148. package/lib/commonjs/config/quotaState.js +435 -0
  149. package/lib/commonjs/core/architecture.js +45 -0
  150. package/lib/commonjs/core/clock/now.js +13 -0
  151. package/lib/commonjs/core/config/defaults.js +2 -0
  152. package/lib/commonjs/core/config/schema.js +512 -0
  153. package/lib/commonjs/core/constants/endpoints.js +19 -0
  154. package/lib/commonjs/core/constants/protocol.js +31 -0
  155. package/lib/commonjs/core/constants/timings.js +39 -0
  156. package/lib/commonjs/core/constants/version.js +18 -0
  157. package/lib/commonjs/core/context/app.js +2 -0
  158. package/lib/commonjs/core/context/device.js +155 -0
  159. package/lib/commonjs/core/context/session.js +2 -0
  160. package/lib/commonjs/core/context/user.js +2 -0
  161. package/lib/commonjs/core/contracts/IFeature.js +2 -0
  162. package/lib/commonjs/core/di/container.js +29 -0
  163. package/lib/commonjs/core/encoding/base64.js +50 -0
  164. package/lib/commonjs/core/id/deviceId.js +52 -0
  165. package/lib/commonjs/core/id/installationId.js +55 -0
  166. package/lib/commonjs/core/id/sessionId.js +2 -0
  167. package/lib/commonjs/core/lifecycle/appLifecycle.js +31 -0
  168. package/lib/commonjs/core/lifecycle/crashSafe.js +33 -0
  169. package/lib/commonjs/core/logger/errorClassification.js +107 -0
  170. package/lib/commonjs/core/logger/internalLogger.js +63 -0
  171. package/lib/commonjs/core/logger/levels.js +2 -0
  172. package/lib/commonjs/crypto/hmacSha256.js +132 -0
  173. package/lib/commonjs/debug/bootstrap.js +429 -0
  174. package/lib/commonjs/debug/commands.js +732 -0
  175. package/lib/commonjs/debug/configBuilder.js +70 -0
  176. package/lib/commonjs/debug/exportBridge.js +155 -0
  177. package/lib/commonjs/debug/hostResolver.js +42 -0
  178. package/lib/commonjs/debug/index.js +141 -0
  179. package/lib/commonjs/debug/metrics.js +39 -0
  180. package/lib/commonjs/debug/perf.js +186 -0
  181. package/lib/commonjs/debug/perfWiring.js +109 -0
  182. package/lib/commonjs/debug/protocol.js +121 -0
  183. package/lib/commonjs/debug/redaction.js +422 -0
  184. package/lib/commonjs/debug/replayWiring.js +149 -0
  185. package/lib/commonjs/debug/screenTracking.js +60 -0
  186. package/lib/commonjs/debug/sessionWiring.js +48 -0
  187. package/lib/commonjs/debug/stream.js +542 -0
  188. package/lib/commonjs/debug/transport.js +368 -0
  189. package/lib/commonjs/features/bugreport/BugReportFeature.js +112 -0
  190. package/lib/commonjs/features/bugreport/buildPayload.js +97 -0
  191. package/lib/commonjs/features/bugreport/index.js +2 -0
  192. package/lib/commonjs/features/crash/CrashFeature.js +86 -0
  193. package/lib/commonjs/features/crash/CrashReporter.js +160 -0
  194. package/lib/commonjs/features/crash/NativeCrashFeature.js +42 -0
  195. package/lib/commonjs/features/crash/capture.js +48 -0
  196. package/lib/commonjs/features/crash/globalHandler.js +41 -0
  197. package/lib/commonjs/features/crash/index.js +14 -0
  198. package/lib/commonjs/features/crash/nativeCrashBridge.js +361 -0
  199. package/lib/commonjs/features/crash/rejectionHandler.js +180 -0
  200. package/lib/commonjs/features/crash/scrubCrash.js +158 -0
  201. package/lib/commonjs/features/engage/EngageAnchor.js +132 -0
  202. package/lib/commonjs/features/engage/EngageArchetypeRenderers.js +4292 -0
  203. package/lib/commonjs/features/engage/EngageInAppView.js +2670 -0
  204. package/lib/commonjs/features/engage/EngageInlinePlacement.js +133 -0
  205. package/lib/commonjs/features/engage/EngagePromptProvider.js +1063 -0
  206. package/lib/commonjs/features/engage/EngagePromptView.js +1252 -0
  207. package/lib/commonjs/features/engage/EngageTransport.js +608 -0
  208. package/lib/commonjs/features/engage/EngageVariantContent.js +1778 -0
  209. package/lib/commonjs/features/engage/__test-support__/reactNativeStub.js +54 -0
  210. package/lib/commonjs/features/engage/attachmentCapture.js +48 -0
  211. package/lib/commonjs/features/engage/captureVoiceAttachment.js +88 -0
  212. package/lib/commonjs/features/engage/engageCoachmarkTour.js +106 -0
  213. package/lib/commonjs/features/engage/engageGameLogic.js +308 -0
  214. package/lib/commonjs/features/engage/engageMediaSizing.js +60 -0
  215. package/lib/commonjs/features/engage/engageMultiStepSheet.js +43 -0
  216. package/lib/commonjs/features/engage/engageOutcome.js +118 -0
  217. package/lib/commonjs/features/engage/engagePushTokenBridge.js +72 -0
  218. package/lib/commonjs/features/engage/engageShakeBridge.js +62 -0
  219. package/lib/commonjs/features/engage/engageSignals.js +39 -0
  220. package/lib/commonjs/features/engage/engageStoreReviewBridge.js +49 -0
  221. package/lib/commonjs/features/engage/engageTestSeenStore.js +99 -0
  222. package/lib/commonjs/features/engage/engageThrottle.js +404 -0
  223. package/lib/commonjs/features/engage/engageTriggerEngine.js +365 -0
  224. package/lib/commonjs/features/engage/engageTypes.js +116 -0
  225. package/lib/commonjs/features/engage/engageVariantResolver.js +143 -0
  226. package/lib/commonjs/features/engage/engageWindowInsets.js +98 -0
  227. package/lib/commonjs/features/engage/gestureTriggerDetector.js +85 -0
  228. package/lib/commonjs/features/engage/transcription/TranscriptionProvider.js +55 -0
  229. package/lib/commonjs/features/install-referrer/installReferrer.js +113 -0
  230. package/lib/commonjs/features/journey/ScaleBunDebugRoot.js +1038 -0
  231. package/lib/commonjs/features/journey/ScaleBunFlatList.js +39 -0
  232. package/lib/commonjs/features/journey/ScaleBunImpression.js +113 -0
  233. package/lib/commonjs/features/journey/ScaleBunScrollView.js +102 -0
  234. package/lib/commonjs/features/journey/ScaleBunSectionList.js +39 -0
  235. package/lib/commonjs/features/journey/autoInstrumentScroll.js +161 -0
  236. package/lib/commonjs/features/journey/calibrationContext.js +42 -0
  237. package/lib/commonjs/features/journey/gestureBuffer.js +63 -0
  238. package/lib/commonjs/features/journey/gestureDetector.js +176 -0
  239. package/lib/commonjs/features/journey/impression.js +93 -0
  240. package/lib/commonjs/features/journey/interactionProtocol.js +168 -0
  241. package/lib/commonjs/features/journey/journeyManager.js +466 -0
  242. package/lib/commonjs/features/journey/journeyTypes.js +55 -0
  243. package/lib/commonjs/features/journey/nativeScroll.js +85 -0
  244. package/lib/commonjs/features/journey/navDetector.js +161 -0
  245. package/lib/commonjs/features/journey/screenshotHelper.js +136 -0
  246. package/lib/commonjs/features/journey/scrollContext.js +154 -0
  247. package/lib/commonjs/features/journey/targetGeometry.js +185 -0
  248. package/lib/commonjs/features/journey/targetRegistry.js +53 -0
  249. package/lib/commonjs/features/journey/touchTarget.js +249 -0
  250. package/lib/commonjs/features/journey/uiState.js +188 -0
  251. package/lib/commonjs/features/navigation/AutoScreenDetector.js +607 -0
  252. package/lib/commonjs/features/network/NetworkFeature.js +216 -0
  253. package/lib/commonjs/features/network/index.js +23 -0
  254. package/lib/commonjs/features/network/thirdParty.js +151 -0
  255. package/lib/commonjs/features/ota/OtaEventEmitter.js +129 -0
  256. package/lib/commonjs/features/ota/OtaOrchestrator.js +1309 -0
  257. package/lib/commonjs/features/ota/OtaTypes.js +6 -0
  258. package/lib/commonjs/features/ota/deviceAttributes.js +48 -0
  259. package/lib/commonjs/features/ota/environment.js +172 -0
  260. package/lib/commonjs/features/ota/geoCountry.js +93 -0
  261. package/lib/commonjs/features/ota/retry.js +96 -0
  262. package/lib/commonjs/features/ota/signedDownload.js +187 -0
  263. package/lib/commonjs/features/ota/useOtaUpdate.js +106 -0
  264. package/lib/commonjs/features/performance/PerformanceFeature.js +649 -0
  265. package/lib/commonjs/features/performance/collectors/AppLaunchCollector.js +122 -0
  266. package/lib/commonjs/features/performance/collectors/AutoScreenLoadCollector.js +232 -0
  267. package/lib/commonjs/features/performance/collectors/CustomTraceCollector.js +99 -0
  268. package/lib/commonjs/features/performance/collectors/FrameMetricsCollector.js +184 -0
  269. package/lib/commonjs/features/performance/collectors/JsStallCollector.js +165 -0
  270. package/lib/commonjs/features/performance/collectors/NetworkPerfCollector.js +59 -0
  271. package/lib/commonjs/features/performance/collectors/ScreenLoadCollector.js +78 -0
  272. package/lib/commonjs/features/performance/collectors/UiHangCollector.js +78 -0
  273. package/lib/commonjs/features/performance/config.js +58 -0
  274. package/lib/commonjs/features/performance/getNativePerformanceModule.js +44 -0
  275. package/lib/commonjs/features/performance/index.js +58 -0
  276. package/lib/commonjs/features/performance/metrics/MetricsEngine.js +148 -0
  277. package/lib/commonjs/features/performance/models.js +48 -0
  278. package/lib/commonjs/features/performance/transport/PerformanceTransport.js +168 -0
  279. package/lib/commonjs/features/profiler/ProfilerFeature.js +600 -0
  280. package/lib/commonjs/features/profiler/config.js +151 -0
  281. package/lib/commonjs/features/profiler/contracts.js +62 -0
  282. package/lib/commonjs/features/profiler/index.js +40 -0
  283. package/lib/commonjs/features/profiler/models.js +112 -0
  284. package/lib/commonjs/features/profiler/transport/ProfilerTransport.js +94 -0
  285. package/lib/commonjs/features/replay/bridge/adapters/bridgeAdapter.js +203 -0
  286. package/lib/commonjs/features/replay/bridge/eventEmitter.js +128 -0
  287. package/lib/commonjs/features/replay/bridge/nativeModule.js +95 -0
  288. package/lib/commonjs/features/replay/bridge/nativeQuota.js +121 -0
  289. package/lib/commonjs/features/replay/core/clock/clock.js +47 -0
  290. package/lib/commonjs/features/replay/core/config/defaults.js +88 -0
  291. package/lib/commonjs/features/replay/core/config/validator.js +109 -0
  292. package/lib/commonjs/features/replay/core/env/environmentDetector.js +28 -0
  293. package/lib/commonjs/features/replay/core/errors/safeCall.js +42 -0
  294. package/lib/commonjs/features/replay/core/ids/sessionId.js +53 -0
  295. package/lib/commonjs/features/replay/core/logger/logger.js +36 -0
  296. package/lib/commonjs/features/replay/core/privacy/privacyTypes.js +34 -0
  297. package/lib/commonjs/features/replay/core/queue/boundedQueue.js +71 -0
  298. package/lib/commonjs/features/replay/integrations/alert/alertInstrumentation.js +259 -0
  299. package/lib/commonjs/features/replay/integrations/logs/consoleIntegration.js +139 -0
  300. package/lib/commonjs/features/replay/integrations/network/networkAdapter.js +77 -0
  301. package/lib/commonjs/features/replay/integrations/react-navigation/navigationIntegration.js +88 -0
  302. package/lib/commonjs/features/replay/integrations/touch/ReplayRoot.js +103 -0
  303. package/lib/commonjs/features/replay/pipeline/batching/batchManager.js +119 -0
  304. package/lib/commonjs/features/replay/pipeline/envelope/envelopeBuilder.js +52 -0
  305. package/lib/commonjs/features/replay/pipeline/retry/retryPolicy.js +53 -0
  306. package/lib/commonjs/features/replay/pipeline/transport/transportTypes.js +67 -0
  307. package/lib/commonjs/features/replay/public/api.js +336 -0
  308. package/lib/commonjs/features/replay/public/enums.js +85 -0
  309. package/lib/commonjs/features/replay/public/types.js +6 -0
  310. package/lib/commonjs/features/replay/replay/breadcrumbs/breadcrumbCollector.js +119 -0
  311. package/lib/commonjs/features/replay/replay/frames/frameModels.js +40 -0
  312. package/lib/commonjs/features/replay/replay/session/sessionOrchestrator.js +279 -0
  313. package/lib/commonjs/features/replay/replay/timeline/timelineModels.js +120 -0
  314. package/lib/commonjs/features/replay/transport/BackendReplayTransport.js +175 -0
  315. package/lib/commonjs/features/replay/transport/CompositeReplayTransport.js +75 -0
  316. package/lib/commonjs/features/replay/transport/DesktopReplayTransport.js +124 -0
  317. package/lib/commonjs/features/replay/transport/ReplayTransport.js +2 -0
  318. package/lib/commonjs/features/session/BackendSessionAdapter.js +1915 -0
  319. package/lib/commonjs/features/session/DesktopSessionTransport.js +124 -0
  320. package/lib/commonjs/features/session/JourneyEventPipeline.js +244 -0
  321. package/lib/commonjs/features/session/ReplayCaptureManager.js +1253 -0
  322. package/lib/commonjs/features/session/ScrollTracker.js +147 -0
  323. package/lib/commonjs/features/session/SessionManager.js +1448 -0
  324. package/lib/commonjs/features/session/SyncDecisionEngine.js +95 -0
  325. package/lib/commonjs/features/session/frameLink.js +36 -0
  326. package/lib/commonjs/features/session/frameScrollState.js +41 -0
  327. package/lib/commonjs/features/session/index.js +84 -0
  328. package/lib/commonjs/features/session/nativeCapture.js +53 -0
  329. package/lib/commonjs/features/session/outboxFrameCapture.js +83 -0
  330. package/lib/commonjs/features/session/sessionTypes.js +230 -0
  331. package/lib/commonjs/features/session/viewportPlausibility.js +143 -0
  332. package/lib/commonjs/features/skan/skanBridge.js +54 -0
  333. package/lib/commonjs/features/skan/skanConversionManager.js +134 -0
  334. package/lib/commonjs/index.js +267 -0
  335. package/lib/commonjs/integrations/fetch/fetchInterceptor.js +174 -0
  336. package/lib/commonjs/integrations/navigation/screenTracker.js +2 -0
  337. package/lib/commonjs/integrations/network/bodyCapture.js +336 -0
  338. package/lib/commonjs/integrations/xhr/xhrInterceptor.js +224 -0
  339. package/lib/commonjs/metro/composeSourceMap.js +105 -0
  340. package/lib/commonjs/metro/featureModules.js +131 -0
  341. package/lib/commonjs/metro/index.js +230 -0
  342. package/lib/commonjs/metro/optionalDependencyStub.js +6 -0
  343. package/lib/commonjs/metro/optionalModules.js +31 -0
  344. package/lib/commonjs/metro/serializerCompose.js +161 -0
  345. package/lib/commonjs/pipeline/dispatcher/dispatcher.js +28 -0
  346. package/lib/commonjs/pipeline/envelope/envelope.js +17 -0
  347. package/lib/commonjs/pipeline/envelope/serializer.js +14 -0
  348. package/lib/commonjs/pipeline/processors/dedupe.js +2 -0
  349. package/lib/commonjs/pipeline/processors/enrich.js +16 -0
  350. package/lib/commonjs/pipeline/processors/sampling.js +2 -0
  351. package/lib/commonjs/pipeline/processors/sanitize.js +28 -0
  352. package/lib/commonjs/pipeline/queue/flushQueue.js +107 -0
  353. package/lib/commonjs/pipeline/queue/memoryQueue.js +31 -0
  354. package/lib/commonjs/pipeline/queue/persistentQueue.js +342 -0
  355. package/lib/commonjs/pipeline/queue/queuePolicy.js +2 -0
  356. package/lib/commonjs/pipeline/scheduler/flushScheduler.js +45 -0
  357. package/lib/commonjs/pipeline/scheduler/retryPolicy.js +15 -0
  358. package/lib/commonjs/public/ScaleBunErrorBoundary.js +91 -0
  359. package/lib/commonjs/public/ScaleBunFacade.js +2044 -0
  360. package/lib/commonjs/public/ScaleBunProvider.js +62 -0
  361. package/lib/commonjs/public/typedTracker.js +79 -0
  362. package/lib/commonjs/public/types.js +6 -0
  363. package/lib/commonjs/push/PushManager.js +270 -0
  364. package/lib/commonjs/push/adapters/ManualAdapter.js +86 -0
  365. package/lib/commonjs/push/adapters/NativeBridgeAdapter.js +131 -0
  366. package/lib/commonjs/push/adapters/NoopAdapter.js +45 -0
  367. package/lib/commonjs/push/adapters/RNFirebaseMessagingAdapter.js +248 -0
  368. package/lib/commonjs/push/adapters/loadMessaging.js +29 -0
  369. package/lib/commonjs/push/adapters/loadNotifee.js +36 -0
  370. package/lib/commonjs/push/adapters/selectAdapter.js +153 -0
  371. package/lib/commonjs/push/detect/capabilities.js +136 -0
  372. package/lib/commonjs/push/index.js +33 -0
  373. package/lib/commonjs/push/native/nativeNotifications.js +168 -0
  374. package/lib/commonjs/push/types.js +2 -0
  375. package/lib/commonjs/specs/NativeReplaySdk.js +28 -0
  376. package/lib/commonjs/specs/NativeScaleBunCrash.js +30 -0
  377. package/lib/commonjs/specs/NativeScaleBunInstallReferrer.js +24 -0
  378. package/lib/commonjs/specs/NativeScaleBunOta.js +32 -0
  379. package/lib/commonjs/specs/NativeScaleBunPerformance.js +25 -0
  380. package/lib/commonjs/specs/NativeScaleBunProfiler.js +26 -0
  381. package/lib/commonjs/specs/NativeScaleBunStorage.js +40 -0
  382. package/lib/commonjs/storage/StorageBackend.js +240 -0
  383. package/lib/commonjs/storage/db/sqlite.js +2 -0
  384. package/lib/commonjs/storage/files/fileStore.js +2 -0
  385. package/lib/commonjs/transport/auth/sdkSession.js +28 -0
  386. package/lib/commonjs/transport/backoff/exponentialJitter.js +16 -0
  387. package/lib/commonjs/transport/http/endpoints.js +46 -0
  388. package/lib/commonjs/transport/http/httpClient.js +72 -0
  389. package/lib/commonjs/transport/rateLimit/retryAfter.js +2 -0
  390. package/lib/commonjs/transport/signing/requestSigner.js +2 -0
  391. package/lib/commonjs/vendor/protocol/index.js +327 -0
  392. package/lib/commonjs/vendor/protocol/internal/validation.js +429 -0
  393. package/lib/commonjs/vendor/sdk-contracts/bridge.js +2 -0
  394. package/lib/commonjs/vendor/sdk-contracts/config.js +2 -0
  395. package/lib/commonjs/vendor/sdk-contracts/events.js +2 -0
  396. package/lib/commonjs/vendor/sdk-contracts/features.js +2 -0
  397. package/lib/commonjs/vendor/sdk-contracts/index.js +2 -0
  398. package/lib/commonjs/vendor/sdk-contracts/platform.js +2 -0
  399. package/lib/commonjs/vendor/sdk-contracts/session-boundary.js +6 -0
  400. package/lib/commonjs/vendor/sdk-contracts/session.js +2 -0
  401. package/lib/commonjs/vendor/vendor.manifest +10 -0
  402. package/lib/module/analytics/EventTracker.js +592 -0
  403. package/lib/module/analytics/automaticEvents.js +63 -0
  404. package/lib/module/analytics/batching.js +55 -0
  405. package/lib/module/analytics/eventLane.js +47 -0
  406. package/lib/module/analytics/revenue.js +117 -0
  407. package/lib/module/analytics/subscription.js +86 -0
  408. package/lib/module/bootstrap/FeatureRegistry.js +79 -0
  409. package/lib/module/bootstrap/SDKBootstrapper.js +742 -0
  410. package/lib/module/bucketing/fnv1a32.js +37 -0
  411. package/lib/module/compat/codepush.js +147 -0
  412. package/lib/module/config/ConfigManager.js +230 -0
  413. package/lib/module/config/configTypes.js +10 -0
  414. package/lib/module/config/otaPolicyState.js +76 -0
  415. package/lib/module/config/quotaState.js +423 -0
  416. package/lib/module/core/architecture.js +38 -0
  417. package/lib/module/core/clock/now.js +7 -0
  418. package/lib/module/core/config/defaults.js +2 -0
  419. package/lib/module/core/config/schema.js +506 -0
  420. package/lib/module/core/constants/endpoints.js +13 -0
  421. package/lib/module/core/constants/protocol.js +25 -0
  422. package/lib/module/core/constants/timings.js +26 -0
  423. package/lib/module/core/constants/version.js +12 -0
  424. package/lib/module/core/context/app.js +2 -0
  425. package/lib/module/core/context/device.js +143 -0
  426. package/lib/module/core/context/session.js +2 -0
  427. package/lib/module/core/context/user.js +2 -0
  428. package/lib/module/core/contracts/IFeature.js +2 -0
  429. package/lib/module/core/di/container.js +22 -0
  430. package/lib/module/core/encoding/base64.js +44 -0
  431. package/lib/module/core/id/deviceId.js +45 -0
  432. package/lib/module/core/id/installationId.js +50 -0
  433. package/lib/module/core/id/sessionId.js +2 -0
  434. package/lib/module/core/lifecycle/appLifecycle.js +25 -0
  435. package/lib/module/core/lifecycle/crashSafe.js +26 -0
  436. package/lib/module/core/logger/errorClassification.js +96 -0
  437. package/lib/module/core/logger/internalLogger.js +59 -0
  438. package/lib/module/core/logger/levels.js +2 -0
  439. package/lib/module/crypto/hmacSha256.js +126 -0
  440. package/lib/module/debug/bootstrap.js +393 -0
  441. package/lib/module/debug/commands.js +726 -0
  442. package/lib/module/debug/configBuilder.js +63 -0
  443. package/lib/module/debug/exportBridge.js +148 -0
  444. package/lib/module/debug/hostResolver.js +37 -0
  445. package/lib/module/debug/index.js +13 -0
  446. package/lib/module/debug/metrics.js +33 -0
  447. package/lib/module/debug/perf.js +180 -0
  448. package/lib/module/debug/perfWiring.js +102 -0
  449. package/lib/module/debug/protocol.js +19 -0
  450. package/lib/module/debug/redaction.js +411 -0
  451. package/lib/module/debug/replayWiring.js +139 -0
  452. package/lib/module/debug/screenTracking.js +53 -0
  453. package/lib/module/debug/sessionWiring.js +43 -0
  454. package/lib/module/debug/stream.js +536 -0
  455. package/lib/module/debug/transport.js +362 -0
  456. package/lib/module/features/bugreport/BugReportFeature.js +105 -0
  457. package/lib/module/features/bugreport/buildPayload.js +91 -0
  458. package/lib/module/features/bugreport/index.js +2 -0
  459. package/lib/module/features/crash/CrashFeature.js +79 -0
  460. package/lib/module/features/crash/CrashReporter.js +151 -0
  461. package/lib/module/features/crash/NativeCrashFeature.js +36 -0
  462. package/lib/module/features/crash/capture.js +42 -0
  463. package/lib/module/features/crash/globalHandler.js +36 -0
  464. package/lib/module/features/crash/index.js +8 -0
  465. package/lib/module/features/crash/nativeCrashBridge.js +350 -0
  466. package/lib/module/features/crash/rejectionHandler.js +171 -0
  467. package/lib/module/features/crash/scrubCrash.js +149 -0
  468. package/lib/module/features/engage/EngageAnchor.js +121 -0
  469. package/lib/module/features/engage/EngageArchetypeRenderers.js +4264 -0
  470. package/lib/module/features/engage/EngageInAppView.js +2656 -0
  471. package/lib/module/features/engage/EngageInlinePlacement.js +123 -0
  472. package/lib/module/features/engage/EngagePromptProvider.js +1054 -0
  473. package/lib/module/features/engage/EngagePromptView.js +1243 -0
  474. package/lib/module/features/engage/EngageTransport.js +602 -0
  475. package/lib/module/features/engage/EngageVariantContent.js +1771 -0
  476. package/lib/module/features/engage/__test-support__/reactNativeStub.js +52 -0
  477. package/lib/module/features/engage/attachmentCapture.js +42 -0
  478. package/lib/module/features/engage/captureVoiceAttachment.js +80 -0
  479. package/lib/module/features/engage/engageCoachmarkTour.js +94 -0
  480. package/lib/module/features/engage/engageGameLogic.js +287 -0
  481. package/lib/module/features/engage/engageMediaSizing.js +51 -0
  482. package/lib/module/features/engage/engageMultiStepSheet.js +35 -0
  483. package/lib/module/features/engage/engageOutcome.js +108 -0
  484. package/lib/module/features/engage/engagePushTokenBridge.js +65 -0
  485. package/lib/module/features/engage/engageShakeBridge.js +56 -0
  486. package/lib/module/features/engage/engageSignals.js +34 -0
  487. package/lib/module/features/engage/engageStoreReviewBridge.js +43 -0
  488. package/lib/module/features/engage/engageTestSeenStore.js +92 -0
  489. package/lib/module/features/engage/engageThrottle.js +390 -0
  490. package/lib/module/features/engage/engageTriggerEngine.js +360 -0
  491. package/lib/module/features/engage/engageTypes.js +110 -0
  492. package/lib/module/features/engage/engageVariantResolver.js +135 -0
  493. package/lib/module/features/engage/engageWindowInsets.js +89 -0
  494. package/lib/module/features/engage/gestureTriggerDetector.js +80 -0
  495. package/lib/module/features/engage/transcription/TranscriptionProvider.js +46 -0
  496. package/lib/module/features/install-referrer/installReferrer.js +104 -0
  497. package/lib/module/features/journey/ScaleBunDebugRoot.js +1030 -0
  498. package/lib/module/features/journey/ScaleBunFlatList.js +32 -0
  499. package/lib/module/features/journey/ScaleBunImpression.js +105 -0
  500. package/lib/module/features/journey/ScaleBunScrollView.js +95 -0
  501. package/lib/module/features/journey/ScaleBunSectionList.js +32 -0
  502. package/lib/module/features/journey/autoInstrumentScroll.js +155 -0
  503. package/lib/module/features/journey/calibrationContext.js +35 -0
  504. package/lib/module/features/journey/gestureBuffer.js +56 -0
  505. package/lib/module/features/journey/gestureDetector.js +169 -0
  506. package/lib/module/features/journey/impression.js +84 -0
  507. package/lib/module/features/journey/interactionProtocol.js +158 -0
  508. package/lib/module/features/journey/journeyManager.js +459 -0
  509. package/lib/module/features/journey/journeyTypes.js +49 -0
  510. package/lib/module/features/journey/nativeScroll.js +77 -0
  511. package/lib/module/features/journey/navDetector.js +154 -0
  512. package/lib/module/features/journey/screenshotHelper.js +129 -0
  513. package/lib/module/features/journey/scrollContext.js +142 -0
  514. package/lib/module/features/journey/targetGeometry.js +175 -0
  515. package/lib/module/features/journey/targetRegistry.js +44 -0
  516. package/lib/module/features/journey/touchTarget.js +241 -0
  517. package/lib/module/features/journey/uiState.js +176 -0
  518. package/lib/module/features/navigation/AutoScreenDetector.js +601 -0
  519. package/lib/module/features/network/NetworkFeature.js +209 -0
  520. package/lib/module/features/network/index.js +17 -0
  521. package/lib/module/features/network/thirdParty.js +142 -0
  522. package/lib/module/features/ota/OtaEventEmitter.js +123 -0
  523. package/lib/module/features/ota/OtaOrchestrator.js +1302 -0
  524. package/lib/module/features/ota/OtaTypes.js +2 -0
  525. package/lib/module/features/ota/deviceAttributes.js +43 -0
  526. package/lib/module/features/ota/environment.js +165 -0
  527. package/lib/module/features/ota/geoCountry.js +86 -0
  528. package/lib/module/features/ota/retry.js +87 -0
  529. package/lib/module/features/ota/signedDownload.js +174 -0
  530. package/lib/module/features/ota/useOtaUpdate.js +100 -0
  531. package/lib/module/features/performance/PerformanceFeature.js +643 -0
  532. package/lib/module/features/performance/collectors/AppLaunchCollector.js +115 -0
  533. package/lib/module/features/performance/collectors/AutoScreenLoadCollector.js +225 -0
  534. package/lib/module/features/performance/collectors/CustomTraceCollector.js +92 -0
  535. package/lib/module/features/performance/collectors/FrameMetricsCollector.js +177 -0
  536. package/lib/module/features/performance/collectors/JsStallCollector.js +158 -0
  537. package/lib/module/features/performance/collectors/NetworkPerfCollector.js +52 -0
  538. package/lib/module/features/performance/collectors/ScreenLoadCollector.js +71 -0
  539. package/lib/module/features/performance/collectors/UiHangCollector.js +71 -0
  540. package/lib/module/features/performance/config.js +51 -0
  541. package/lib/module/features/performance/getNativePerformanceModule.js +39 -0
  542. package/lib/module/features/performance/index.js +9 -0
  543. package/lib/module/features/performance/metrics/MetricsEngine.js +139 -0
  544. package/lib/module/features/performance/models.js +42 -0
  545. package/lib/module/features/performance/transport/PerformanceTransport.js +162 -0
  546. package/lib/module/features/profiler/ProfilerFeature.js +594 -0
  547. package/lib/module/features/profiler/config.js +143 -0
  548. package/lib/module/features/profiler/contracts.js +56 -0
  549. package/lib/module/features/profiler/index.js +11 -0
  550. package/lib/module/features/profiler/models.js +106 -0
  551. package/lib/module/features/profiler/transport/ProfilerTransport.js +87 -0
  552. package/lib/module/features/replay/bridge/adapters/bridgeAdapter.js +198 -0
  553. package/lib/module/features/replay/bridge/eventEmitter.js +122 -0
  554. package/lib/module/features/replay/bridge/nativeModule.js +89 -0
  555. package/lib/module/features/replay/bridge/nativeQuota.js +109 -0
  556. package/lib/module/features/replay/core/clock/clock.js +37 -0
  557. package/lib/module/features/replay/core/config/defaults.js +82 -0
  558. package/lib/module/features/replay/core/config/validator.js +103 -0
  559. package/lib/module/features/replay/core/env/environmentDetector.js +22 -0
  560. package/lib/module/features/replay/core/errors/safeCall.js +35 -0
  561. package/lib/module/features/replay/core/ids/sessionId.js +44 -0
  562. package/lib/module/features/replay/core/logger/logger.js +29 -0
  563. package/lib/module/features/replay/core/privacy/privacyTypes.js +27 -0
  564. package/lib/module/features/replay/core/queue/boundedQueue.js +64 -0
  565. package/lib/module/features/replay/integrations/alert/alertInstrumentation.js +252 -0
  566. package/lib/module/features/replay/integrations/logs/consoleIntegration.js +131 -0
  567. package/lib/module/features/replay/integrations/network/networkAdapter.js +70 -0
  568. package/lib/module/features/replay/integrations/react-navigation/navigationIntegration.js +82 -0
  569. package/lib/module/features/replay/integrations/touch/ReplayRoot.js +96 -0
  570. package/lib/module/features/replay/pipeline/batching/batchManager.js +113 -0
  571. package/lib/module/features/replay/pipeline/envelope/envelopeBuilder.js +43 -0
  572. package/lib/module/features/replay/pipeline/retry/retryPolicy.js +45 -0
  573. package/lib/module/features/replay/pipeline/transport/transportTypes.js +60 -0
  574. package/lib/module/features/replay/public/api.js +332 -0
  575. package/lib/module/features/replay/public/enums.js +85 -0
  576. package/lib/module/features/replay/public/types.js +2 -0
  577. package/lib/module/features/replay/replay/breadcrumbs/breadcrumbCollector.js +113 -0
  578. package/lib/module/features/replay/replay/frames/frameModels.js +33 -0
  579. package/lib/module/features/replay/replay/session/sessionOrchestrator.js +272 -0
  580. package/lib/module/features/replay/replay/timeline/timelineModels.js +108 -0
  581. package/lib/module/features/replay/transport/BackendReplayTransport.js +169 -0
  582. package/lib/module/features/replay/transport/CompositeReplayTransport.js +68 -0
  583. package/lib/module/features/replay/transport/DesktopReplayTransport.js +119 -0
  584. package/lib/module/features/replay/transport/ReplayTransport.js +2 -0
  585. package/lib/module/features/session/BackendSessionAdapter.js +1908 -0
  586. package/lib/module/features/session/DesktopSessionTransport.js +118 -0
  587. package/lib/module/features/session/JourneyEventPipeline.js +239 -0
  588. package/lib/module/features/session/ReplayCaptureManager.js +1248 -0
  589. package/lib/module/features/session/ScrollTracker.js +141 -0
  590. package/lib/module/features/session/SessionManager.js +1443 -0
  591. package/lib/module/features/session/SyncDecisionEngine.js +88 -0
  592. package/lib/module/features/session/frameLink.js +29 -0
  593. package/lib/module/features/session/frameScrollState.js +34 -0
  594. package/lib/module/features/session/index.js +35 -0
  595. package/lib/module/features/session/nativeCapture.js +45 -0
  596. package/lib/module/features/session/outboxFrameCapture.js +77 -0
  597. package/lib/module/features/session/sessionTypes.js +226 -0
  598. package/lib/module/features/session/viewportPlausibility.js +137 -0
  599. package/lib/module/features/skan/skanBridge.js +48 -0
  600. package/lib/module/features/skan/skanConversionManager.js +128 -0
  601. package/lib/module/index.js +80 -0
  602. package/lib/module/integrations/fetch/fetchInterceptor.js +169 -0
  603. package/lib/module/integrations/navigation/screenTracker.js +2 -0
  604. package/lib/module/integrations/network/bodyCapture.js +320 -0
  605. package/lib/module/integrations/xhr/xhrInterceptor.js +219 -0
  606. package/lib/module/metro/composeSourceMap.js +97 -0
  607. package/lib/module/metro/featureModules.js +123 -0
  608. package/lib/module/metro/index.js +218 -0
  609. package/lib/module/metro/optionalDependencyStub.js +14 -0
  610. package/lib/module/metro/optionalModules.js +25 -0
  611. package/lib/module/metro/serializerCompose.js +152 -0
  612. package/lib/module/pipeline/dispatcher/dispatcher.js +21 -0
  613. package/lib/module/pipeline/envelope/envelope.js +11 -0
  614. package/lib/module/pipeline/envelope/serializer.js +8 -0
  615. package/lib/module/pipeline/processors/dedupe.js +2 -0
  616. package/lib/module/pipeline/processors/enrich.js +10 -0
  617. package/lib/module/pipeline/processors/sampling.js +2 -0
  618. package/lib/module/pipeline/processors/sanitize.js +22 -0
  619. package/lib/module/pipeline/queue/flushQueue.js +102 -0
  620. package/lib/module/pipeline/queue/memoryQueue.js +24 -0
  621. package/lib/module/pipeline/queue/persistentQueue.js +336 -0
  622. package/lib/module/pipeline/queue/queuePolicy.js +2 -0
  623. package/lib/module/pipeline/scheduler/flushScheduler.js +38 -0
  624. package/lib/module/pipeline/scheduler/retryPolicy.js +9 -0
  625. package/lib/module/public/ScaleBunErrorBoundary.js +82 -0
  626. package/lib/module/public/ScaleBunFacade.js +2038 -0
  627. package/lib/module/public/ScaleBunProvider.js +54 -0
  628. package/lib/module/public/typedTracker.js +72 -0
  629. package/lib/module/public/types.js +2 -0
  630. package/lib/module/push/PushManager.js +263 -0
  631. package/lib/module/push/adapters/ManualAdapter.js +79 -0
  632. package/lib/module/push/adapters/NativeBridgeAdapter.js +124 -0
  633. package/lib/module/push/adapters/NoopAdapter.js +38 -0
  634. package/lib/module/push/adapters/RNFirebaseMessagingAdapter.js +241 -0
  635. package/lib/module/push/adapters/loadMessaging.js +23 -0
  636. package/lib/module/push/adapters/loadNotifee.js +30 -0
  637. package/lib/module/push/adapters/selectAdapter.js +147 -0
  638. package/lib/module/push/detect/capabilities.js +130 -0
  639. package/lib/module/push/index.js +9 -0
  640. package/lib/module/push/native/nativeNotifications.js +155 -0
  641. package/lib/module/push/types.js +2 -0
  642. package/lib/module/specs/NativeReplaySdk.js +24 -0
  643. package/lib/module/specs/NativeScaleBunCrash.js +26 -0
  644. package/lib/module/specs/NativeScaleBunInstallReferrer.js +20 -0
  645. package/lib/module/specs/NativeScaleBunOta.js +28 -0
  646. package/lib/module/specs/NativeScaleBunPerformance.js +21 -0
  647. package/lib/module/specs/NativeScaleBunProfiler.js +22 -0
  648. package/lib/module/specs/NativeScaleBunStorage.js +36 -0
  649. package/lib/module/storage/StorageBackend.js +231 -0
  650. package/lib/module/storage/db/sqlite.js +2 -0
  651. package/lib/module/storage/files/fileStore.js +2 -0
  652. package/lib/module/transport/auth/sdkSession.js +21 -0
  653. package/lib/module/transport/backoff/exponentialJitter.js +10 -0
  654. package/lib/module/transport/http/endpoints.js +40 -0
  655. package/lib/module/transport/http/httpClient.js +64 -0
  656. package/lib/module/transport/rateLimit/retryAfter.js +2 -0
  657. package/lib/module/transport/signing/requestSigner.js +2 -0
  658. package/lib/module/vendor/protocol/index.js +312 -0
  659. package/lib/module/vendor/protocol/internal/validation.js +423 -0
  660. package/lib/module/vendor/sdk-contracts/bridge.js +2 -0
  661. package/lib/module/vendor/sdk-contracts/config.js +2 -0
  662. package/lib/module/vendor/sdk-contracts/events.js +2 -0
  663. package/lib/module/vendor/sdk-contracts/features.js +2 -0
  664. package/lib/module/vendor/sdk-contracts/index.js +2 -0
  665. package/lib/module/vendor/sdk-contracts/platform.js +2 -0
  666. package/lib/module/vendor/sdk-contracts/session-boundary.js +2 -0
  667. package/lib/module/vendor/sdk-contracts/session.js +2 -0
  668. package/lib/module/vendor/vendor.manifest +10 -0
  669. package/lib/typescript/analytics/EventTracker.d.ts +197 -0
  670. package/lib/typescript/analytics/automaticEvents.d.ts +30 -0
  671. package/lib/typescript/analytics/batching.d.ts +33 -0
  672. package/lib/typescript/analytics/eventLane.d.ts +22 -0
  673. package/lib/typescript/analytics/revenue.d.ts +94 -0
  674. package/lib/typescript/analytics/subscription.d.ts +35 -0
  675. package/lib/typescript/bootstrap/FeatureRegistry.d.ts +36 -0
  676. package/lib/typescript/bootstrap/SDKBootstrapper.d.ts +82 -0
  677. package/lib/typescript/bucketing/fnv1a32.d.ts +20 -0
  678. package/lib/typescript/compat/codepush.d.ts +76 -0
  679. package/lib/typescript/config/ConfigManager.d.ts +82 -0
  680. package/lib/typescript/config/configTypes.d.ts +73 -0
  681. package/lib/typescript/config/otaPolicyState.d.ts +55 -0
  682. package/lib/typescript/config/quotaState.d.ts +155 -0
  683. package/lib/typescript/core/architecture.d.ts +29 -0
  684. package/lib/typescript/core/clock/now.d.ts +5 -0
  685. package/lib/typescript/core/config/defaults.d.ts +1 -0
  686. package/lib/typescript/core/config/schema.d.ts +107 -0
  687. package/lib/typescript/core/constants/endpoints.d.ts +13 -0
  688. package/lib/typescript/core/constants/protocol.d.ts +23 -0
  689. package/lib/typescript/core/constants/timings.d.ts +22 -0
  690. package/lib/typescript/core/constants/version.d.ts +12 -0
  691. package/lib/typescript/core/context/app.d.ts +1 -0
  692. package/lib/typescript/core/context/device.d.ts +61 -0
  693. package/lib/typescript/core/context/session.d.ts +1 -0
  694. package/lib/typescript/core/context/user.d.ts +24 -0
  695. package/lib/typescript/core/contracts/IFeature.d.ts +44 -0
  696. package/lib/typescript/core/di/container.d.ts +9 -0
  697. package/lib/typescript/core/encoding/base64.d.ts +13 -0
  698. package/lib/typescript/core/id/deviceId.d.ts +9 -0
  699. package/lib/typescript/core/id/installationId.d.ts +20 -0
  700. package/lib/typescript/core/id/sessionId.d.ts +1 -0
  701. package/lib/typescript/core/lifecycle/appLifecycle.d.ts +14 -0
  702. package/lib/typescript/core/lifecycle/crashSafe.d.ts +7 -0
  703. package/lib/typescript/core/logger/errorClassification.d.ts +46 -0
  704. package/lib/typescript/core/logger/internalLogger.d.ts +24 -0
  705. package/lib/typescript/core/logger/levels.d.ts +1 -0
  706. package/lib/typescript/crypto/hmacSha256.d.ts +10 -0
  707. package/lib/typescript/debug/bootstrap.d.ts +148 -0
  708. package/lib/typescript/debug/commands.d.ts +77 -0
  709. package/lib/typescript/debug/configBuilder.d.ts +13 -0
  710. package/lib/typescript/debug/exportBridge.d.ts +27 -0
  711. package/lib/typescript/debug/hostResolver.d.ts +14 -0
  712. package/lib/typescript/debug/index.d.ts +12 -0
  713. package/lib/typescript/debug/metrics.d.ts +2 -0
  714. package/lib/typescript/debug/perf.d.ts +43 -0
  715. package/lib/typescript/debug/perfWiring.d.ts +33 -0
  716. package/lib/typescript/debug/protocol.d.ts +15 -0
  717. package/lib/typescript/debug/redaction.d.ts +69 -0
  718. package/lib/typescript/debug/replayWiring.d.ts +25 -0
  719. package/lib/typescript/debug/screenTracking.d.ts +16 -0
  720. package/lib/typescript/debug/sessionWiring.d.ts +16 -0
  721. package/lib/typescript/debug/stream.d.ts +77 -0
  722. package/lib/typescript/debug/transport.d.ts +110 -0
  723. package/lib/typescript/features/bugreport/BugReportFeature.d.ts +59 -0
  724. package/lib/typescript/features/bugreport/buildPayload.d.ts +51 -0
  725. package/lib/typescript/features/bugreport/index.d.ts +1 -0
  726. package/lib/typescript/features/crash/CrashFeature.d.ts +21 -0
  727. package/lib/typescript/features/crash/CrashReporter.d.ts +107 -0
  728. package/lib/typescript/features/crash/NativeCrashFeature.d.ts +17 -0
  729. package/lib/typescript/features/crash/capture.d.ts +22 -0
  730. package/lib/typescript/features/crash/globalHandler.d.ts +14 -0
  731. package/lib/typescript/features/crash/index.d.ts +2 -0
  732. package/lib/typescript/features/crash/nativeCrashBridge.d.ts +43 -0
  733. package/lib/typescript/features/crash/rejectionHandler.d.ts +65 -0
  734. package/lib/typescript/features/crash/scrubCrash.d.ts +35 -0
  735. package/lib/typescript/features/engage/EngageAnchor.d.ts +36 -0
  736. package/lib/typescript/features/engage/EngageArchetypeRenderers.d.ts +66 -0
  737. package/lib/typescript/features/engage/EngageInAppView.d.ts +164 -0
  738. package/lib/typescript/features/engage/EngageInlinePlacement.d.ts +42 -0
  739. package/lib/typescript/features/engage/EngagePromptProvider.d.ts +233 -0
  740. package/lib/typescript/features/engage/EngagePromptView.d.ts +97 -0
  741. package/lib/typescript/features/engage/EngageTransport.d.ts +158 -0
  742. package/lib/typescript/features/engage/EngageVariantContent.d.ts +12 -0
  743. package/lib/typescript/features/engage/attachmentCapture.d.ts +17 -0
  744. package/lib/typescript/features/engage/captureVoiceAttachment.d.ts +31 -0
  745. package/lib/typescript/features/engage/engageCoachmarkTour.d.ts +18 -0
  746. package/lib/typescript/features/engage/engageGameLogic.d.ts +34 -0
  747. package/lib/typescript/features/engage/engageMediaSizing.d.ts +23 -0
  748. package/lib/typescript/features/engage/engageMultiStepSheet.d.ts +25 -0
  749. package/lib/typescript/features/engage/engageOutcome.d.ts +38 -0
  750. package/lib/typescript/features/engage/engagePushTokenBridge.d.ts +30 -0
  751. package/lib/typescript/features/engage/engageShakeBridge.d.ts +20 -0
  752. package/lib/typescript/features/engage/engageSignals.d.ts +13 -0
  753. package/lib/typescript/features/engage/engageStoreReviewBridge.d.ts +23 -0
  754. package/lib/typescript/features/engage/engageTestSeenStore.d.ts +46 -0
  755. package/lib/typescript/features/engage/engageThrottle.d.ts +180 -0
  756. package/lib/typescript/features/engage/engageTriggerEngine.d.ts +16 -0
  757. package/lib/typescript/features/engage/engageTypes.d.ts +576 -0
  758. package/lib/typescript/features/engage/engageVariantResolver.d.ts +46 -0
  759. package/lib/typescript/features/engage/engageWindowInsets.d.ts +25 -0
  760. package/lib/typescript/features/engage/gestureTriggerDetector.d.ts +20 -0
  761. package/lib/typescript/features/engage/transcription/TranscriptionProvider.d.ts +51 -0
  762. package/lib/typescript/features/install-referrer/installReferrer.d.ts +39 -0
  763. package/lib/typescript/features/journey/ScaleBunDebugRoot.d.ts +49 -0
  764. package/lib/typescript/features/journey/ScaleBunFlatList.d.ts +20 -0
  765. package/lib/typescript/features/journey/ScaleBunImpression.d.ts +30 -0
  766. package/lib/typescript/features/journey/ScaleBunScrollView.d.ts +25 -0
  767. package/lib/typescript/features/journey/ScaleBunSectionList.d.ts +20 -0
  768. package/lib/typescript/features/journey/autoInstrumentScroll.d.ts +46 -0
  769. package/lib/typescript/features/journey/calibrationContext.d.ts +26 -0
  770. package/lib/typescript/features/journey/gestureBuffer.d.ts +27 -0
  771. package/lib/typescript/features/journey/gestureDetector.d.ts +40 -0
  772. package/lib/typescript/features/journey/impression.d.ts +48 -0
  773. package/lib/typescript/features/journey/interactionProtocol.d.ts +159 -0
  774. package/lib/typescript/features/journey/journeyManager.d.ts +62 -0
  775. package/lib/typescript/features/journey/journeyTypes.d.ts +161 -0
  776. package/lib/typescript/features/journey/nativeScroll.d.ts +47 -0
  777. package/lib/typescript/features/journey/navDetector.d.ts +42 -0
  778. package/lib/typescript/features/journey/screenshotHelper.d.ts +33 -0
  779. package/lib/typescript/features/journey/scrollContext.d.ts +49 -0
  780. package/lib/typescript/features/journey/targetGeometry.d.ts +126 -0
  781. package/lib/typescript/features/journey/targetRegistry.d.ts +28 -0
  782. package/lib/typescript/features/journey/touchTarget.d.ts +174 -0
  783. package/lib/typescript/features/journey/uiState.d.ts +93 -0
  784. package/lib/typescript/features/navigation/AutoScreenDetector.d.ts +196 -0
  785. package/lib/typescript/features/network/NetworkFeature.d.ts +43 -0
  786. package/lib/typescript/features/network/index.d.ts +46 -0
  787. package/lib/typescript/features/network/thirdParty.d.ts +95 -0
  788. package/lib/typescript/features/ota/OtaEventEmitter.d.ts +93 -0
  789. package/lib/typescript/features/ota/OtaOrchestrator.d.ts +287 -0
  790. package/lib/typescript/features/ota/OtaTypes.d.ts +193 -0
  791. package/lib/typescript/features/ota/deviceAttributes.d.ts +18 -0
  792. package/lib/typescript/features/ota/environment.d.ts +99 -0
  793. package/lib/typescript/features/ota/geoCountry.d.ts +14 -0
  794. package/lib/typescript/features/ota/retry.d.ts +53 -0
  795. package/lib/typescript/features/ota/signedDownload.d.ts +81 -0
  796. package/lib/typescript/features/ota/useOtaUpdate.d.ts +72 -0
  797. package/lib/typescript/features/performance/PerformanceFeature.d.ts +132 -0
  798. package/lib/typescript/features/performance/collectors/AppLaunchCollector.d.ts +27 -0
  799. package/lib/typescript/features/performance/collectors/AutoScreenLoadCollector.d.ts +70 -0
  800. package/lib/typescript/features/performance/collectors/CustomTraceCollector.d.ts +35 -0
  801. package/lib/typescript/features/performance/collectors/FrameMetricsCollector.d.ts +74 -0
  802. package/lib/typescript/features/performance/collectors/JsStallCollector.d.ts +45 -0
  803. package/lib/typescript/features/performance/collectors/NetworkPerfCollector.d.ts +23 -0
  804. package/lib/typescript/features/performance/collectors/ScreenLoadCollector.d.ts +30 -0
  805. package/lib/typescript/features/performance/collectors/UiHangCollector.d.ts +21 -0
  806. package/lib/typescript/features/performance/config.d.ts +73 -0
  807. package/lib/typescript/features/performance/getNativePerformanceModule.d.ts +2 -0
  808. package/lib/typescript/features/performance/index.d.ts +10 -0
  809. package/lib/typescript/features/performance/metrics/MetricsEngine.d.ts +69 -0
  810. package/lib/typescript/features/performance/models.d.ts +169 -0
  811. package/lib/typescript/features/performance/transport/PerformanceTransport.d.ts +40 -0
  812. package/lib/typescript/features/profiler/ProfilerFeature.d.ts +92 -0
  813. package/lib/typescript/features/profiler/config.d.ts +85 -0
  814. package/lib/typescript/features/profiler/contracts.d.ts +142 -0
  815. package/lib/typescript/features/profiler/index.d.ts +13 -0
  816. package/lib/typescript/features/profiler/models.d.ts +332 -0
  817. package/lib/typescript/features/profiler/transport/ProfilerTransport.d.ts +30 -0
  818. package/lib/typescript/features/replay/bridge/adapters/bridgeAdapter.d.ts +52 -0
  819. package/lib/typescript/features/replay/bridge/eventEmitter.d.ts +100 -0
  820. package/lib/typescript/features/replay/bridge/nativeModule.d.ts +166 -0
  821. package/lib/typescript/features/replay/bridge/nativeQuota.d.ts +26 -0
  822. package/lib/typescript/features/replay/core/clock/clock.d.ts +16 -0
  823. package/lib/typescript/features/replay/core/config/defaults.d.ts +28 -0
  824. package/lib/typescript/features/replay/core/config/validator.d.ts +13 -0
  825. package/lib/typescript/features/replay/core/env/environmentDetector.d.ts +14 -0
  826. package/lib/typescript/features/replay/core/errors/safeCall.d.ts +12 -0
  827. package/lib/typescript/features/replay/core/ids/sessionId.d.ts +15 -0
  828. package/lib/typescript/features/replay/core/logger/logger.d.ts +15 -0
  829. package/lib/typescript/features/replay/core/privacy/privacyTypes.d.ts +24 -0
  830. package/lib/typescript/features/replay/core/queue/boundedQueue.d.ts +29 -0
  831. package/lib/typescript/features/replay/integrations/alert/alertInstrumentation.d.ts +48 -0
  832. package/lib/typescript/features/replay/integrations/logs/consoleIntegration.d.ts +18 -0
  833. package/lib/typescript/features/replay/integrations/network/networkAdapter.d.ts +31 -0
  834. package/lib/typescript/features/replay/integrations/react-navigation/navigationIntegration.d.ts +25 -0
  835. package/lib/typescript/features/replay/integrations/touch/ReplayRoot.d.ts +26 -0
  836. package/lib/typescript/features/replay/pipeline/batching/batchManager.d.ts +47 -0
  837. package/lib/typescript/features/replay/pipeline/envelope/envelopeBuilder.d.ts +12 -0
  838. package/lib/typescript/features/replay/pipeline/retry/retryPolicy.d.ts +17 -0
  839. package/lib/typescript/features/replay/pipeline/transport/transportTypes.d.ts +40 -0
  840. package/lib/typescript/features/replay/public/api.d.ts +83 -0
  841. package/lib/typescript/features/replay/public/enums.d.ts +73 -0
  842. package/lib/typescript/features/replay/public/types.d.ts +249 -0
  843. package/lib/typescript/features/replay/replay/breadcrumbs/breadcrumbCollector.d.ts +26 -0
  844. package/lib/typescript/features/replay/replay/frames/frameModels.d.ts +23 -0
  845. package/lib/typescript/features/replay/replay/session/sessionOrchestrator.d.ts +53 -0
  846. package/lib/typescript/features/replay/replay/timeline/timelineModels.d.ts +29 -0
  847. package/lib/typescript/features/replay/transport/BackendReplayTransport.d.ts +45 -0
  848. package/lib/typescript/features/replay/transport/CompositeReplayTransport.d.ts +22 -0
  849. package/lib/typescript/features/replay/transport/DesktopReplayTransport.d.ts +35 -0
  850. package/lib/typescript/features/replay/transport/ReplayTransport.d.ts +72 -0
  851. package/lib/typescript/features/session/BackendSessionAdapter.d.ts +528 -0
  852. package/lib/typescript/features/session/DesktopSessionTransport.d.ts +28 -0
  853. package/lib/typescript/features/session/JourneyEventPipeline.d.ts +74 -0
  854. package/lib/typescript/features/session/ReplayCaptureManager.d.ts +391 -0
  855. package/lib/typescript/features/session/ScrollTracker.d.ts +48 -0
  856. package/lib/typescript/features/session/SessionManager.d.ts +414 -0
  857. package/lib/typescript/features/session/SyncDecisionEngine.d.ts +33 -0
  858. package/lib/typescript/features/session/frameLink.d.ts +27 -0
  859. package/lib/typescript/features/session/frameScrollState.d.ts +27 -0
  860. package/lib/typescript/features/session/index.d.ts +23 -0
  861. package/lib/typescript/features/session/nativeCapture.d.ts +18 -0
  862. package/lib/typescript/features/session/outboxFrameCapture.d.ts +20 -0
  863. package/lib/typescript/features/session/sessionTypes.d.ts +362 -0
  864. package/lib/typescript/features/session/viewportPlausibility.d.ts +72 -0
  865. package/lib/typescript/features/skan/skanBridge.d.ts +18 -0
  866. package/lib/typescript/features/skan/skanConversionManager.d.ts +69 -0
  867. package/lib/typescript/index.d.ts +59 -0
  868. package/lib/typescript/integrations/fetch/fetchInterceptor.d.ts +41 -0
  869. package/lib/typescript/integrations/navigation/screenTracker.d.ts +1 -0
  870. package/lib/typescript/integrations/network/bodyCapture.d.ts +101 -0
  871. package/lib/typescript/integrations/xhr/xhrInterceptor.d.ts +46 -0
  872. package/lib/typescript/metro/composeSourceMap.d.ts +26 -0
  873. package/lib/typescript/metro/featureModules.d.ts +49 -0
  874. package/lib/typescript/metro/index.d.ts +99 -0
  875. package/lib/typescript/metro/optionalDependencyStub.d.ts +14 -0
  876. package/lib/typescript/metro/optionalModules.d.ts +20 -0
  877. package/lib/typescript/metro/serializerCompose.d.ts +46 -0
  878. package/lib/typescript/pipeline/dispatcher/dispatcher.d.ts +7 -0
  879. package/lib/typescript/pipeline/envelope/envelope.d.ts +16 -0
  880. package/lib/typescript/pipeline/envelope/serializer.d.ts +7 -0
  881. package/lib/typescript/pipeline/processors/dedupe.d.ts +1 -0
  882. package/lib/typescript/pipeline/processors/enrich.d.ts +3 -0
  883. package/lib/typescript/pipeline/processors/sampling.d.ts +1 -0
  884. package/lib/typescript/pipeline/processors/sanitize.d.ts +3 -0
  885. package/lib/typescript/pipeline/queue/flushQueue.d.ts +12 -0
  886. package/lib/typescript/pipeline/queue/memoryQueue.d.ts +12 -0
  887. package/lib/typescript/pipeline/queue/persistentQueue.d.ts +120 -0
  888. package/lib/typescript/pipeline/queue/queuePolicy.d.ts +1 -0
  889. package/lib/typescript/pipeline/scheduler/flushScheduler.d.ts +9 -0
  890. package/lib/typescript/pipeline/scheduler/retryPolicy.d.ts +5 -0
  891. package/lib/typescript/public/ScaleBunErrorBoundary.d.ts +44 -0
  892. package/lib/typescript/public/ScaleBunFacade.d.ts +800 -0
  893. package/lib/typescript/public/ScaleBunProvider.d.ts +23 -0
  894. package/lib/typescript/public/typedTracker.d.ts +88 -0
  895. package/lib/typescript/public/types.d.ts +316 -0
  896. package/lib/typescript/push/PushManager.d.ts +69 -0
  897. package/lib/typescript/push/adapters/ManualAdapter.d.ts +40 -0
  898. package/lib/typescript/push/adapters/NativeBridgeAdapter.d.ts +37 -0
  899. package/lib/typescript/push/adapters/NoopAdapter.d.ts +21 -0
  900. package/lib/typescript/push/adapters/RNFirebaseMessagingAdapter.d.ts +39 -0
  901. package/lib/typescript/push/adapters/loadMessaging.d.ts +17 -0
  902. package/lib/typescript/push/adapters/loadNotifee.d.ts +15 -0
  903. package/lib/typescript/push/adapters/selectAdapter.d.ts +20 -0
  904. package/lib/typescript/push/detect/capabilities.d.ts +15 -0
  905. package/lib/typescript/push/index.d.ts +10 -0
  906. package/lib/typescript/push/native/nativeNotifications.d.ts +65 -0
  907. package/lib/typescript/push/types.d.ts +143 -0
  908. package/lib/typescript/specs/NativeReplaySdk.d.ts +69 -0
  909. package/lib/typescript/specs/NativeScaleBunCrash.d.ts +58 -0
  910. package/lib/typescript/specs/NativeScaleBunInstallReferrer.d.ts +28 -0
  911. package/lib/typescript/specs/NativeScaleBunOta.d.ts +141 -0
  912. package/lib/typescript/specs/NativeScaleBunPerformance.d.ts +31 -0
  913. package/lib/typescript/specs/NativeScaleBunProfiler.d.ts +38 -0
  914. package/lib/typescript/specs/NativeScaleBunStorage.d.ts +55 -0
  915. package/lib/typescript/storage/StorageBackend.d.ts +131 -0
  916. package/lib/typescript/storage/db/sqlite.d.ts +1 -0
  917. package/lib/typescript/storage/files/fileStore.d.ts +1 -0
  918. package/lib/typescript/transport/auth/sdkSession.d.ts +10 -0
  919. package/lib/typescript/transport/backoff/exponentialJitter.d.ts +5 -0
  920. package/lib/typescript/transport/http/endpoints.d.ts +26 -0
  921. package/lib/typescript/transport/http/httpClient.d.ts +23 -0
  922. package/lib/typescript/transport/rateLimit/retryAfter.d.ts +1 -0
  923. package/lib/typescript/transport/signing/requestSigner.d.ts +1 -0
  924. package/lib/typescript/vendor/protocol/index.d.ts +345 -0
  925. package/lib/typescript/vendor/protocol/internal/validation.d.ts +114 -0
  926. package/lib/typescript/vendor/sdk-contracts/bridge.d.ts +104 -0
  927. package/lib/typescript/vendor/sdk-contracts/config.d.ts +156 -0
  928. package/lib/typescript/vendor/sdk-contracts/events.d.ts +42 -0
  929. package/lib/typescript/vendor/sdk-contracts/features.d.ts +38 -0
  930. package/lib/typescript/vendor/sdk-contracts/index.d.ts +15 -0
  931. package/lib/typescript/vendor/sdk-contracts/platform.d.ts +35 -0
  932. package/lib/typescript/vendor/sdk-contracts/session-boundary.d.ts +42 -0
  933. package/lib/typescript/vendor/sdk-contracts/session.d.ts +157 -0
  934. package/package.json +153 -0
  935. package/react-native.config.js +24 -0
  936. package/scalebun-react-native.podspec +44 -0
  937. package/src/analytics/EventTracker.ts +654 -0
  938. package/src/analytics/automaticEvents.ts +109 -0
  939. package/src/analytics/batching.ts +54 -0
  940. package/src/analytics/eventLane.ts +48 -0
  941. package/src/analytics/revenue.ts +143 -0
  942. package/src/analytics/subscription.ts +145 -0
  943. package/src/bootstrap/FeatureRegistry.ts +81 -0
  944. package/src/bootstrap/SDKBootstrapper.ts +769 -0
  945. package/src/bucketing/fnv1a32.ts +40 -0
  946. package/src/compat/codepush.ts +189 -0
  947. package/src/config/ConfigManager.ts +233 -0
  948. package/src/config/configTypes.ts +62 -0
  949. package/src/config/otaPolicyState.ts +79 -0
  950. package/src/config/quotaState.ts +484 -0
  951. package/src/core/architecture.ts +39 -0
  952. package/src/core/clock/now.ts +6 -0
  953. package/src/core/config/defaults.ts +0 -0
  954. package/src/core/config/schema.ts +455 -0
  955. package/src/core/constants/endpoints.ts +12 -0
  956. package/src/core/constants/protocol.ts +24 -0
  957. package/src/core/constants/timings.ts +25 -0
  958. package/src/core/constants/version.ts +11 -0
  959. package/src/core/context/app.ts +0 -0
  960. package/src/core/context/device.ts +169 -0
  961. package/src/core/context/session.ts +0 -0
  962. package/src/core/context/user.ts +26 -0
  963. package/src/core/contracts/IFeature.ts +53 -0
  964. package/src/core/di/container.ts +26 -0
  965. package/src/core/encoding/base64.ts +46 -0
  966. package/src/core/id/deviceId.ts +51 -0
  967. package/src/core/id/installationId.ts +52 -0
  968. package/src/core/id/sessionId.ts +0 -0
  969. package/src/core/lifecycle/appLifecycle.ts +33 -0
  970. package/src/core/lifecycle/crashSafe.ts +29 -0
  971. package/src/core/logger/errorClassification.ts +108 -0
  972. package/src/core/logger/internalLogger.ts +65 -0
  973. package/src/core/logger/levels.ts +0 -0
  974. package/src/crypto/hmacSha256.ts +106 -0
  975. package/src/debug/bootstrap.ts +436 -0
  976. package/src/debug/commands.ts +597 -0
  977. package/src/debug/configBuilder.ts +56 -0
  978. package/src/debug/exportBridge.ts +155 -0
  979. package/src/debug/hostResolver.ts +34 -0
  980. package/src/debug/index.ts +25 -0
  981. package/src/debug/metrics.ts +29 -0
  982. package/src/debug/perf.ts +212 -0
  983. package/src/debug/perfWiring.ts +119 -0
  984. package/src/debug/protocol.ts +58 -0
  985. package/src/debug/redaction.ts +483 -0
  986. package/src/debug/replayWiring.ts +148 -0
  987. package/src/debug/screenTracking.ts +55 -0
  988. package/src/debug/sessionWiring.ts +59 -0
  989. package/src/debug/stream.ts +561 -0
  990. package/src/debug/transport.ts +440 -0
  991. package/src/features/bugreport/BugReportFeature.ts +128 -0
  992. package/src/features/bugreport/buildPayload.ts +116 -0
  993. package/src/features/bugreport/index.ts +0 -0
  994. package/src/features/crash/CrashFeature.ts +87 -0
  995. package/src/features/crash/CrashReporter.ts +189 -0
  996. package/src/features/crash/NativeCrashFeature.ts +42 -0
  997. package/src/features/crash/capture.ts +48 -0
  998. package/src/features/crash/globalHandler.ts +39 -0
  999. package/src/features/crash/index.ts +8 -0
  1000. package/src/features/crash/nativeCrashBridge.ts +352 -0
  1001. package/src/features/crash/rejectionHandler.ts +196 -0
  1002. package/src/features/crash/scrubCrash.ts +175 -0
  1003. package/src/features/engage/EngageAnchor.tsx +159 -0
  1004. package/src/features/engage/EngageArchetypeRenderers.tsx +3705 -0
  1005. package/src/features/engage/EngageInAppView.tsx +2678 -0
  1006. package/src/features/engage/EngageInlinePlacement.tsx +169 -0
  1007. package/src/features/engage/EngagePromptProvider.tsx +1318 -0
  1008. package/src/features/engage/EngagePromptView.tsx +1400 -0
  1009. package/src/features/engage/EngageTransport.ts +668 -0
  1010. package/src/features/engage/EngageVariantContent.tsx +1483 -0
  1011. package/src/features/engage/__test-support__/reactNativeStub.js +40 -0
  1012. package/src/features/engage/attachmentCapture.ts +45 -0
  1013. package/src/features/engage/captureVoiceAttachment.ts +81 -0
  1014. package/src/features/engage/engageCoachmarkTour.ts +120 -0
  1015. package/src/features/engage/engageGameLogic.ts +347 -0
  1016. package/src/features/engage/engageMediaSizing.ts +76 -0
  1017. package/src/features/engage/engageMultiStepSheet.ts +53 -0
  1018. package/src/features/engage/engageOutcome.ts +157 -0
  1019. package/src/features/engage/engagePushTokenBridge.ts +84 -0
  1020. package/src/features/engage/engageShakeBridge.ts +67 -0
  1021. package/src/features/engage/engageSignals.ts +40 -0
  1022. package/src/features/engage/engageStoreReviewBridge.ts +48 -0
  1023. package/src/features/engage/engageTestSeenStore.ts +95 -0
  1024. package/src/features/engage/engageThrottle.ts +478 -0
  1025. package/src/features/engage/engageTriggerEngine.ts +350 -0
  1026. package/src/features/engage/engageTypes.ts +712 -0
  1027. package/src/features/engage/engageVariantResolver.ts +364 -0
  1028. package/src/features/engage/engageWindowInsets.ts +108 -0
  1029. package/src/features/engage/gestureTriggerDetector.ts +83 -0
  1030. package/src/features/engage/transcription/TranscriptionProvider.ts +68 -0
  1031. package/src/features/install-referrer/installReferrer.ts +112 -0
  1032. package/src/features/journey/ScaleBunDebugRoot.tsx +1045 -0
  1033. package/src/features/journey/ScaleBunFlatList.tsx +39 -0
  1034. package/src/features/journey/ScaleBunImpression.tsx +109 -0
  1035. package/src/features/journey/ScaleBunScrollView.tsx +101 -0
  1036. package/src/features/journey/ScaleBunSectionList.tsx +39 -0
  1037. package/src/features/journey/autoInstrumentScroll.ts +155 -0
  1038. package/src/features/journey/calibrationContext.ts +44 -0
  1039. package/src/features/journey/gestureBuffer.ts +59 -0
  1040. package/src/features/journey/gestureDetector.ts +162 -0
  1041. package/src/features/journey/impression.ts +92 -0
  1042. package/src/features/journey/interactionProtocol.ts +243 -0
  1043. package/src/features/journey/journeyManager.ts +469 -0
  1044. package/src/features/journey/journeyTypes.ts +215 -0
  1045. package/src/features/journey/nativeScroll.ts +94 -0
  1046. package/src/features/journey/navDetector.ts +149 -0
  1047. package/src/features/journey/screenshotHelper.ts +137 -0
  1048. package/src/features/journey/scrollContext.ts +146 -0
  1049. package/src/features/journey/targetGeometry.ts +197 -0
  1050. package/src/features/journey/targetRegistry.ts +43 -0
  1051. package/src/features/journey/touchTarget.ts +339 -0
  1052. package/src/features/journey/uiState.ts +182 -0
  1053. package/src/features/navigation/AutoScreenDetector.ts +617 -0
  1054. package/src/features/network/NetworkFeature.ts +232 -0
  1055. package/src/features/network/index.ts +59 -0
  1056. package/src/features/network/thirdParty.ts +160 -0
  1057. package/src/features/ota/OtaEventEmitter.ts +187 -0
  1058. package/src/features/ota/OtaOrchestrator.ts +1513 -0
  1059. package/src/features/ota/OtaTypes.ts +230 -0
  1060. package/src/features/ota/deviceAttributes.ts +46 -0
  1061. package/src/features/ota/environment.ts +199 -0
  1062. package/src/features/ota/geoCountry.ts +85 -0
  1063. package/src/features/ota/retry.ts +123 -0
  1064. package/src/features/ota/signedDownload.ts +202 -0
  1065. package/src/features/ota/useOtaUpdate.ts +161 -0
  1066. package/src/features/performance/PerformanceFeature.ts +729 -0
  1067. package/src/features/performance/collectors/AppLaunchCollector.ts +131 -0
  1068. package/src/features/performance/collectors/AutoScreenLoadCollector.ts +258 -0
  1069. package/src/features/performance/collectors/CustomTraceCollector.ts +116 -0
  1070. package/src/features/performance/collectors/FrameMetricsCollector.ts +210 -0
  1071. package/src/features/performance/collectors/JsStallCollector.ts +184 -0
  1072. package/src/features/performance/collectors/NetworkPerfCollector.ts +69 -0
  1073. package/src/features/performance/collectors/ScreenLoadCollector.ts +95 -0
  1074. package/src/features/performance/collectors/UiHangCollector.ts +98 -0
  1075. package/src/features/performance/config.ts +136 -0
  1076. package/src/features/performance/getNativePerformanceModule.ts +38 -0
  1077. package/src/features/performance/index.ts +28 -0
  1078. package/src/features/performance/metrics/MetricsEngine.ts +152 -0
  1079. package/src/features/performance/models.ts +235 -0
  1080. package/src/features/performance/transport/PerformanceTransport.ts +161 -0
  1081. package/src/features/profiler/ProfilerFeature.ts +661 -0
  1082. package/src/features/profiler/config.ts +230 -0
  1083. package/src/features/profiler/contracts.ts +176 -0
  1084. package/src/features/profiler/index.ts +45 -0
  1085. package/src/features/profiler/models.ts +430 -0
  1086. package/src/features/profiler/transport/ProfilerTransport.ts +93 -0
  1087. package/src/features/replay/bridge/adapters/bridgeAdapter.ts +235 -0
  1088. package/src/features/replay/bridge/eventEmitter.ts +176 -0
  1089. package/src/features/replay/bridge/nativeModule.ts +252 -0
  1090. package/src/features/replay/bridge/nativeQuota.ts +111 -0
  1091. package/src/features/replay/core/clock/clock.ts +38 -0
  1092. package/src/features/replay/core/config/defaults.ts +66 -0
  1093. package/src/features/replay/core/config/validator.ts +113 -0
  1094. package/src/features/replay/core/env/environmentDetector.ts +21 -0
  1095. package/src/features/replay/core/errors/safeCall.ts +34 -0
  1096. package/src/features/replay/core/ids/sessionId.ts +44 -0
  1097. package/src/features/replay/core/logger/logger.ts +36 -0
  1098. package/src/features/replay/core/privacy/privacyTypes.ts +41 -0
  1099. package/src/features/replay/core/queue/boundedQueue.ts +71 -0
  1100. package/src/features/replay/integrations/alert/alertInstrumentation.ts +277 -0
  1101. package/src/features/replay/integrations/logs/consoleIntegration.ts +136 -0
  1102. package/src/features/replay/integrations/network/networkAdapter.ts +73 -0
  1103. package/src/features/replay/integrations/react-navigation/navigationIntegration.ts +89 -0
  1104. package/src/features/replay/integrations/touch/ReplayRoot.tsx +114 -0
  1105. package/src/features/replay/pipeline/batching/batchManager.ts +133 -0
  1106. package/src/features/replay/pipeline/envelope/envelopeBuilder.ts +66 -0
  1107. package/src/features/replay/pipeline/retry/retryPolicy.ts +62 -0
  1108. package/src/features/replay/pipeline/transport/transportTypes.ts +85 -0
  1109. package/src/features/replay/public/api.ts +364 -0
  1110. package/src/features/replay/public/enums.ts +78 -0
  1111. package/src/features/replay/public/types.ts +297 -0
  1112. package/src/features/replay/replay/breadcrumbs/breadcrumbCollector.ts +115 -0
  1113. package/src/features/replay/replay/frames/frameModels.ts +45 -0
  1114. package/src/features/replay/replay/session/sessionOrchestrator.ts +286 -0
  1115. package/src/features/replay/replay/timeline/timelineModels.ts +129 -0
  1116. package/src/features/replay/transport/BackendReplayTransport.ts +215 -0
  1117. package/src/features/replay/transport/CompositeReplayTransport.ts +82 -0
  1118. package/src/features/replay/transport/DesktopReplayTransport.ts +140 -0
  1119. package/src/features/replay/transport/ReplayTransport.ts +84 -0
  1120. package/src/features/session/BackendSessionAdapter.ts +1977 -0
  1121. package/src/features/session/DesktopSessionTransport.ts +130 -0
  1122. package/src/features/session/JourneyEventPipeline.ts +278 -0
  1123. package/src/features/session/ReplayCaptureManager.ts +1401 -0
  1124. package/src/features/session/ScrollTracker.ts +166 -0
  1125. package/src/features/session/SessionManager.ts +1687 -0
  1126. package/src/features/session/SyncDecisionEngine.ts +117 -0
  1127. package/src/features/session/frameLink.ts +41 -0
  1128. package/src/features/session/frameScrollState.ts +36 -0
  1129. package/src/features/session/index.ts +88 -0
  1130. package/src/features/session/nativeCapture.ts +43 -0
  1131. package/src/features/session/outboxFrameCapture.ts +79 -0
  1132. package/src/features/session/sessionTypes.ts +528 -0
  1133. package/src/features/session/viewportPlausibility.ts +134 -0
  1134. package/src/features/skan/skanBridge.ts +53 -0
  1135. package/src/features/skan/skanConversionManager.ts +173 -0
  1136. package/src/index.ts +206 -0
  1137. package/src/integrations/fetch/fetchInterceptor.ts +201 -0
  1138. package/src/integrations/navigation/screenTracker.ts +0 -0
  1139. package/src/integrations/network/bodyCapture.ts +328 -0
  1140. package/src/integrations/xhr/xhrInterceptor.ts +259 -0
  1141. package/src/metro/composeSourceMap.ts +104 -0
  1142. package/src/metro/featureModules.ts +143 -0
  1143. package/src/metro/index.ts +336 -0
  1144. package/src/metro/optionalDependencyStub.ts +13 -0
  1145. package/src/metro/optionalModules.ts +27 -0
  1146. package/src/metro/serializerCompose.ts +193 -0
  1147. package/src/pipeline/dispatcher/dispatcher.ts +22 -0
  1148. package/src/pipeline/envelope/envelope.ts +31 -0
  1149. package/src/pipeline/envelope/serializer.ts +14 -0
  1150. package/src/pipeline/processors/dedupe.ts +0 -0
  1151. package/src/pipeline/processors/enrich.ts +11 -0
  1152. package/src/pipeline/processors/sampling.ts +0 -0
  1153. package/src/pipeline/processors/sanitize.ts +23 -0
  1154. package/src/pipeline/queue/flushQueue.ts +144 -0
  1155. package/src/pipeline/queue/memoryQueue.ts +31 -0
  1156. package/src/pipeline/queue/persistentQueue.ts +385 -0
  1157. package/src/pipeline/queue/queuePolicy.ts +0 -0
  1158. package/src/pipeline/scheduler/flushScheduler.ts +47 -0
  1159. package/src/pipeline/scheduler/retryPolicy.ts +8 -0
  1160. package/src/public/ScaleBunErrorBoundary.tsx +91 -0
  1161. package/src/public/ScaleBunFacade.ts +2129 -0
  1162. package/src/public/ScaleBunProvider.tsx +91 -0
  1163. package/src/public/typedTracker.ts +123 -0
  1164. package/src/public/types.ts +362 -0
  1165. package/src/push/PushManager.ts +318 -0
  1166. package/src/push/adapters/ManualAdapter.ts +100 -0
  1167. package/src/push/adapters/NativeBridgeAdapter.ts +142 -0
  1168. package/src/push/adapters/NoopAdapter.ts +46 -0
  1169. package/src/push/adapters/RNFirebaseMessagingAdapter.ts +271 -0
  1170. package/src/push/adapters/loadMessaging.ts +24 -0
  1171. package/src/push/adapters/loadNotifee.ts +29 -0
  1172. package/src/push/adapters/selectAdapter.ts +176 -0
  1173. package/src/push/detect/capabilities.ts +124 -0
  1174. package/src/push/index.ts +22 -0
  1175. package/src/push/native/nativeNotifications.ts +207 -0
  1176. package/src/push/types.ts +159 -0
  1177. package/src/specs/NativeReplaySdk.ts +101 -0
  1178. package/src/specs/NativeScaleBunCrash.ts +64 -0
  1179. package/src/specs/NativeScaleBunInstallReferrer.ts +29 -0
  1180. package/src/specs/NativeScaleBunOta.ts +154 -0
  1181. package/src/specs/NativeScaleBunPerformance.ts +34 -0
  1182. package/src/specs/NativeScaleBunProfiler.ts +41 -0
  1183. package/src/specs/NativeScaleBunStorage.ts +59 -0
  1184. package/src/storage/StorageBackend.ts +272 -0
  1185. package/src/storage/db/sqlite.ts +0 -0
  1186. package/src/storage/files/fileStore.ts +0 -0
  1187. package/src/transport/auth/sdkSession.ts +27 -0
  1188. package/src/transport/backoff/exponentialJitter.ts +9 -0
  1189. package/src/transport/http/endpoints.ts +33 -0
  1190. package/src/transport/http/httpClient.ts +73 -0
  1191. package/src/transport/rateLimit/retryAfter.ts +0 -0
  1192. package/src/transport/signing/requestSigner.ts +0 -0
  1193. package/src/vendor/protocol/index.ts +391 -0
  1194. package/src/vendor/protocol/internal/validation.ts +497 -0
  1195. package/src/vendor/sdk-contracts/bridge.ts +162 -0
  1196. package/src/vendor/sdk-contracts/config.ts +192 -0
  1197. package/src/vendor/sdk-contracts/events.ts +50 -0
  1198. package/src/vendor/sdk-contracts/features.ts +42 -0
  1199. package/src/vendor/sdk-contracts/index.ts +98 -0
  1200. package/src/vendor/sdk-contracts/platform.ts +42 -0
  1201. package/src/vendor/sdk-contracts/session-boundary.ts +55 -0
  1202. package/src/vendor/sdk-contracts/session.ts +225 -0
  1203. package/src/vendor/vendor.manifest +10 -0
@@ -0,0 +1,1448 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SessionManager = void 0;
7
+ var _frameLink = require("./frameLink");
8
+ var _internalLogger = require("../../core/logger/internalLogger");
9
+ var _sessionTypes = require("./sessionTypes");
10
+ var _JourneyEventPipeline = require("./JourneyEventPipeline");
11
+ var _ReplayCaptureManager = require("./ReplayCaptureManager");
12
+ var _outboxFrameCapture = require("./outboxFrameCapture");
13
+ var _DesktopSessionTransport = require("./DesktopSessionTransport");
14
+ var _SyncDecisionEngine = require("./SyncDecisionEngine");
15
+ var _ScrollTracker = require("./ScrollTracker");
16
+ var _sessionId = require("../replay/core/ids/sessionId");
17
+ var _bridgeAdapter = require("../replay/bridge/adapters/bridgeAdapter");
18
+ var _redaction = require("../../debug/redaction");
19
+ var _calibrationContext = require("../journey/calibrationContext");
20
+ var _device = require("../../core/context/device");
21
+ var _automaticEvents = require("../../analytics/automaticEvents");
22
+ var _viewportPlausibility = require("./viewportPlausibility");
23
+ var _quotaState = require("../../config/quotaState");
24
+ var _interactionProtocol = require("../journey/interactionProtocol");
25
+ /**
26
+ * ScaleBun SDK — Session Manager
27
+ *
28
+ * Central orchestrator for the unified session system.
29
+ * Manages session lifecycle, wires pipeline + capture + transport + sync.
30
+ *
31
+ * Architecture:
32
+ * - Singleton per debug session
33
+ * - Creates and owns JourneyEventPipeline, ReplayCaptureManager,
34
+ * DesktopSessionTransport, SyncDecisionEngine
35
+ * - Receives events from ScaleBunDebugRoot (nav, interactions), DebugEventStream
36
+ * (network, logs), and breadcrumbs
37
+ * - Coordinates crash anchoring across events AND frames
38
+ * - Auto-timeout via maxDurationMs
39
+ */
40
+
41
+ // ─── Types ──────────────────────────────────────────────────────────────────
42
+
43
+ // ─── Singleton ──────────────────────────────────────────────────────────────
44
+
45
+ let _instance = null;
46
+
47
+ // ─── Session Manager ────────────────────────────────────────────────────────
48
+
49
+ class SessionManager {
50
+ desktopTransport = null;
51
+ scrollTracker = null;
52
+ _backendTransport = null;
53
+ /**
54
+ * Feature #4 (heatmaps): route tap/gesture coords to the always-on analytics
55
+ * lane even when no replay recording is active. Additive, opt-in (default off).
56
+ */
57
+ _captureInteractionHeatmap = false;
58
+ session = null;
59
+ active = false;
60
+ timeoutTimer = null;
61
+ crashAnchors = [];
62
+ /** Tracks loading-start timestamps per screen for duration computation */
63
+ loadingStartTimes = new Map();
64
+ /**
65
+ * Always-tracked current screen name.
66
+ * Updated by onScreenChange even when session is inactive, so that when
67
+ * startSession is called we know what screen the user is currently on and
68
+ * can emit the initial SCREEN_VIEW + navigation capture immediately.
69
+ * This is read-only metadata — does NOT produce events or frames while inactive.
70
+ */
71
+ _lastKnownScreen = null;
72
+ /** When the current screen was entered — the basis for SCREEN_EXIT's measured dwellMs. */
73
+ _screenEnteredAt = null;
74
+
75
+ /**
76
+ * Last screenshot-base dimensions reported by the native interaction tracker.
77
+ * Stored in JS-coordinate units (dp on Android, pt on iOS) — both are the same
78
+ * unit RN uses for pageX/pageY, so JS-fallback taps can divide directly without
79
+ * additional conversion. This is the EXACT base the native screenshot is captured
80
+ * in, and avoids using Dimensions.get('window') (which excludes system insets
81
+ * differently across devices and pushes markers ~10% off vertically).
82
+ */
83
+ _lastNativeViewportJsUnits = null;
84
+
85
+ /**
86
+ * Exact-duplicate gesture suppression (QA: one physical tap recorded 2–3×).
87
+ *
88
+ * Measured in production data: the native tracker re-emitted the SAME tap — identical
89
+ * gestureType and identical coordinates to the SUB-PIXEL (e.g. x=466.962890625) — at
90
+ * 160–240ms gaps, sometimes twice. A human re-tap cannot reproduce a sub-pixel float
91
+ * exactly, so exact coordinate equality within the window is a safe discriminator: real
92
+ * double-taps land on at least slightly different pixels and pass through untouched.
93
+ * The pipeline's own 100ms dedup was too narrow for these; this window covers what was
94
+ * actually observed with margin. Sits at the ONE entry point every gesture source funnels
95
+ * through, so recording and analytics lanes are protected equally.
96
+ */
97
+ _lastGestureSig = null;
98
+ _lastGestureTs = 0;
99
+ static GESTURE_DEDUP_WINDOW_MS = 400;
100
+ /** Memoized native file-outbox frame adapter (gated by the backend transport). */
101
+ _outboxFrameCapture = null;
102
+ /** Unsubscribe from quotaState (released in resetInstance). */
103
+ _quotaUnsub = null;
104
+ /** True while frame capture is paused by a `frames` quota block inside an active session. */
105
+ _framesQuotaPaused = false;
106
+ /**
107
+ * Whether capture has run at all in the CURRENT session. Decides start() vs resume() when a
108
+ * frames block lifts: resume() continues the session's sequence, which is only right if this
109
+ * session already produced frames; a session that began blocked gets a clean start().
110
+ */
111
+ _captureStartedThisSession = false;
112
+ constructor(debugTransport, nativeCapture, managerConfig) {
113
+ this._rawTransport = debugTransport;
114
+ this._nativeCapture = nativeCapture;
115
+
116
+ // Merge config with defaults
117
+ this.config = {
118
+ ..._sessionTypes.DEFAULT_SESSION_REPLAY_CONFIG,
119
+ ...managerConfig?.sessionReplay,
120
+ privacyPolicy: {
121
+ ..._sessionTypes.DEFAULT_SESSION_REPLAY_CONFIG.privacyPolicy,
122
+ ...managerConfig?.sessionReplay?.privacyPolicy
123
+ }
124
+ };
125
+
126
+ // Create subsystems
127
+ this.desktopTransport = debugTransport ? new _DesktopSessionTransport.DesktopSessionTransport(debugTransport) : null;
128
+ this.pipeline = new _JourneyEventPipeline.JourneyEventPipeline('', {
129
+ maxEventCount: this.config.maxEventCount
130
+ });
131
+ this.captureManager = new _ReplayCaptureManager.ReplayCaptureManager('', this.config, nativeCapture, this._getOutboxFrameCapture());
132
+ this._captureInteractionHeatmap = managerConfig?.captureInteractionHeatmap === true;
133
+ this.syncEngine = new _SyncDecisionEngine.SyncDecisionEngine(managerConfig?.syncPolicy);
134
+
135
+ // Wire pipeline → transport (desktop + optional backend)
136
+ this.pipeline.setEmitCallback(event => {
137
+ this.desktopTransport?.sendEvent(event);
138
+ this._backendTransport?.sendEvent(event);
139
+ });
140
+
141
+ // Wire capture → transport (desktop + optional backend)
142
+ this.captureManager.setFrameEmitCallback((frame, imageData) => {
143
+ this.desktopTransport?.sendFrame(frame, imageData);
144
+ this._backendTransport?.sendFrame(frame, imageData);
145
+ });
146
+ this._wireLoadingIntervals();
147
+
148
+ // Per-feature quota (contract v1): a `frames` block stops capture NOW (not just upload), and
149
+ // its end resumes capture in the SAME session starting from a fresh keyframe.
150
+ this._quotaUnsub = _quotaState.quotaState.subscribe((feature, blocked) => {
151
+ if (feature === 'frames') this._onFramesQuota(blocked);
152
+ });
153
+ }
154
+
155
+ /**
156
+ * Stop or resume frame capture for a `frames` quota block.
157
+ *
158
+ * Stopping goes through `captureManager.stop()` — every pending capture timer is cancelled and
159
+ * the generation bump discards captures already in flight. The adapter purges what was queued.
160
+ * The session itself keeps running: events, network and errors are governed by their own quotas.
161
+ */
162
+ _onFramesQuota(blocked) {
163
+ try {
164
+ if (blocked) {
165
+ if (this.active && !this._framesQuotaPaused) {
166
+ this.captureManager.stop('quota_pause');
167
+ this._framesQuotaPaused = true;
168
+ _internalLogger.logger.warn('[SessionManager] Replay frames quota exceeded — frame capture stopped');
169
+ }
170
+ return;
171
+ }
172
+ if (!this._framesQuotaPaused) return;
173
+ this._framesQuotaPaused = false;
174
+ if (!this.active) return;
175
+ if (this._captureStartedThisSession) {
176
+ this.captureManager.resume();
177
+ } else {
178
+ this.captureManager.start(); // fresh per-session state: sequence 0, keyframe first
179
+ this._captureStartedThisSession = true;
180
+ }
181
+ // A keyframe right away: the frames before the pause were discarded, so without one the
182
+ // replay would show nothing until the next navigation/interaction capture.
183
+ this.captureManager.captureManual('manual').catch(() => {});
184
+ __DEV__ && _internalLogger.logger.info('[SessionManager] Replay frames quota lifted — capture resumed with a keyframe');
185
+ } catch (err) {
186
+ _internalLogger.logger.warn('[SessionManager] frames quota transition failed:', err);
187
+ }
188
+ }
189
+
190
+ /**
191
+ * A wait the capture manager sat through becomes a pair of journey events.
192
+ *
193
+ * The frame it eventually takes shows the LOADED screen, which leaves the span between the
194
+ * tap and that frame unaccounted for — and the player resolves an unaccounted playhead to the
195
+ * previous frame, so it would show the screen the visitor had already left. These two events
196
+ * are what lets the timeline say "this screen was loading, for this long" instead, at roughly
197
+ * 1 KB against the ~56 KB a second screenshot would cost.
198
+ *
199
+ * `reason` rides on the payload rather than becoming a third event type: `timeout` and
200
+ * `network_idle` are the same interval with different endings, and a consumer that does not
201
+ * know about the distinction should still see the band.
202
+ */
203
+ _wireLoadingIntervals() {
204
+ this.captureManager.setLoadingIntervalCallback((phase, screen, detail) => {
205
+ if (phase === 'start') {
206
+ this.emitEvent('LOADING_STARTED', {
207
+ screen,
208
+ payload: {
209
+ screen,
210
+ source: 'replay-hold'
211
+ },
212
+ source: 'sdk'
213
+ });
214
+ return;
215
+ }
216
+ this.emitEvent('LOADING_COMPLETED', {
217
+ screen,
218
+ payload: {
219
+ screen,
220
+ durationMs: detail.durationMs,
221
+ reason: detail.reason,
222
+ source: 'replay-hold'
223
+ },
224
+ source: 'sdk'
225
+ });
226
+ });
227
+ }
228
+
229
+ // ─── Singleton Access ───────────────────────────────────────────────
230
+
231
+ static getInstance(debugTransport, nativeCapture, config) {
232
+ if (!_instance) {
233
+ _instance = new SessionManager(debugTransport, nativeCapture, config);
234
+ }
235
+ return _instance;
236
+ }
237
+ static getExistingInstance() {
238
+ return _instance;
239
+ }
240
+ static resetInstance() {
241
+ if (_instance) {
242
+ _instance.endSession();
243
+ _instance._quotaUnsub?.();
244
+ _instance._quotaUnsub = null;
245
+ }
246
+ _instance = null;
247
+ }
248
+
249
+ /**
250
+ * Attach a backend transport for uploading replay data to the backend API.
251
+ * This is additive — the existing desktop transport remains active if present.
252
+ */
253
+ setBackendTransport(transport) {
254
+ this._backendTransport = transport;
255
+ // A session whose START the backend refused for quota has no row and never will: end the
256
+ // recording instead of capturing into a transport that drops everything for it.
257
+ transport.setSessionRefusedHandler?.(sessionId => {
258
+ if (this.active && this.currentSessionId === sessionId) this.endSession();
259
+ });
260
+ __DEV__ && _internalLogger.logger.info('[SessionManager] Backend transport attached (replay → backend upload enabled)');
261
+ }
262
+
263
+ /** Expose the backend transport so features can queue network/errors/performance. */
264
+ getBackendTransport() {
265
+ return this._backendTransport;
266
+ }
267
+
268
+ /**
269
+ * Memoized native file-outbox frame adapter. Always injected into the capture
270
+ * manager; its readiness gate (backed by the backend transport) resolves false
271
+ * when the outbox flags are off / the binary is old, so capture transparently
272
+ * falls back to the legacy `captureScreenshot` path. The closure reads the
273
+ * backend transport lazily at capture time (it attaches after construction).
274
+ */
275
+ _getOutboxFrameCapture() {
276
+ if (!this._outboxFrameCapture) {
277
+ this._outboxFrameCapture = (0, _outboxFrameCapture.makeOutboxFrameCapture)(() => this._backendTransport?.ensureNativeOutboxReady() ?? Promise.resolve(false));
278
+ }
279
+ return this._outboxFrameCapture;
280
+ }
281
+
282
+ /**
283
+ * Attach a desktop transport dynamically.
284
+ * Called when debug mode connects after SDK initialization.
285
+ */
286
+ setDesktopTransport(debugTransport) {
287
+ this.desktopTransport = new _DesktopSessionTransport.DesktopSessionTransport(debugTransport);
288
+ __DEV__ && _internalLogger.logger.info('[SessionManager] Desktop transport attached');
289
+ }
290
+
291
+ // ─── Session Lifecycle ──────────────────────────────────────────────
292
+
293
+ get isActive() {
294
+ return this.active;
295
+ }
296
+ get currentSessionId() {
297
+ return this.session?.sessionId ?? null;
298
+ }
299
+ get currentSessionMetadata() {
300
+ return this.session?.metadata ?? null;
301
+ }
302
+
303
+ /**
304
+ * The active RECORDING session ID (`ses-xxx`), or null when no recording
305
+ * is in progress.
306
+ *
307
+ * This is the canonical field that DebugEventStream stamps into every
308
+ * outgoing event's `data.recordingSessionId`. It is the single source of
309
+ * truth for correlating network and performance events with the session
310
+ * that was active when they were captured.
311
+ *
312
+ * Distinct from the TRANSPORT session ID (`debug-xxx`) which lives on
313
+ * the wire envelope's top-level `sessionId` field and never changes.
314
+ */
315
+ get recordingSessionId() {
316
+ return this.active ? this.session?.sessionId ?? null : null;
317
+ }
318
+
319
+ /**
320
+ * Update the native capture function at runtime.
321
+ * Called by ScaleBunDebugRoot once the root View ref is ready for ViewShot.
322
+ * Also updates the active session's capture manager if one exists.
323
+ */
324
+ setNativeCapture(captureFn) {
325
+ this._nativeCapture = captureFn;
326
+ // Hot-swap into active capture manager if session is running
327
+ if (this.active && this.captureManager) {
328
+ this.captureManager.nativeCapture = captureFn;
329
+ __DEV__ && _internalLogger.logger.info('[SessionManager] Capture function updated (hot-swap)');
330
+ }
331
+ }
332
+
333
+ /**
334
+ * Start a new session. Idempotent — no-op if already active.
335
+ */
336
+ startSession(metadata) {
337
+ try {
338
+ if (this.active) {
339
+ __DEV__ && _internalLogger.logger.debug('[SessionManager] Session already active, skipping start');
340
+ return;
341
+ }
342
+
343
+ // Quota (contract v1): a `sessions` block stops NEW sessions. Adopting an analytics
344
+ // session that is already open is not a new session, so that path stays allowed; minting
345
+ // a fresh recording id to post a new INGESTION_START is not.
346
+ if (this._backendTransport && !this._backendTransport.analyticsSessionId && _quotaState.quotaState.isBlocked('sessions')) {
347
+ _internalLogger.logger.warn('[SessionManager] Session not started — sessions quota exceeded');
348
+ return;
349
+ }
350
+
351
+ // One-row merge: adopt the always-on analytics ingestion id as this
352
+ // recording session's id when the backend (SaaS) lane has one open.
353
+ // This threads the analytics id through the pipeline + capture manager
354
+ // below, so every frame/event body carries it AND it becomes
355
+ // currentSessionId at sendSessionStart — keeping endpoint id == body id
356
+ // while attaching frames/journey to the single analytics row (no second
357
+ // INGESTION_START). Legacy/no-clientKey mode has no analytics id → mint
358
+ // a fresh recording id and post to /replay/... as before.
359
+ const sessionId = this._backendTransport?.analyticsSessionId ?? generateSessionId();
360
+
361
+ // Create fresh subsystems for this session
362
+ this.pipeline = new _JourneyEventPipeline.JourneyEventPipeline(sessionId, {
363
+ maxEventCount: this.config.maxEventCount
364
+ });
365
+ this.pipeline.setEmitCallback(event => {
366
+ this.desktopTransport?.sendEvent(event);
367
+ this._backendTransport?.sendEvent(event);
368
+ });
369
+ this.captureManager = new _ReplayCaptureManager.ReplayCaptureManager(sessionId, this.config, this._nativeCapture, this._getOutboxFrameCapture());
370
+ this.captureManager.setFrameEmitCallback((frame, imageData) => {
371
+ this.desktopTransport?.sendFrame(frame, imageData);
372
+ this._backendTransport?.sendFrame(frame, imageData);
373
+ });
374
+
375
+ // A NEW capture manager starts with no callbacks. Frame emission is re-wired above;
376
+ // loading intervals have to be re-wired here for the same reason, or every session
377
+ // after the first records frames and silently stops recording the waits between them.
378
+ this._wireLoadingIntervals();
379
+
380
+ // Create scroll tracker — wired to emit events + trigger capture on settle
381
+ this.scrollTracker = new _ScrollTracker.ScrollTracker(scrollMeta => {
382
+ if (!this.active) return;
383
+
384
+ // Synthesize representative coordinates for the scroll.
385
+ // ScrollTracker only knows content deltas — it has no absolute touch
386
+ // point — but the dashboard CorrelationEngine DROPS any interaction
387
+ // without x/y, and the replay overlay draws scroll/swipe as an arrow
388
+ // that needs normalizedEnd coords. Without this, ScaleBunScrollView scrolls
389
+ // were invisible AND uncounted. Anchor the gesture at screen center and
390
+ // extend by the finger displacement (opposite the content offset delta),
391
+ // matching the finger-path convention native swipes already use.
392
+ const vw = this.session?.metadata?.screenWidth ?? 0;
393
+ const vh = this.session?.metadata?.screenHeight ?? 0;
394
+ const coords = {};
395
+ if (vw > 0 && vh > 0) {
396
+ const cx = vw / 2;
397
+ const cy = vh / 2;
398
+ const ex = Math.max(0, Math.min(vw, cx - scrollMeta.totalDeltaX));
399
+ const ey = Math.max(0, Math.min(vh, cy - scrollMeta.totalDeltaY));
400
+ coords.x = cx;
401
+ coords.y = cy;
402
+ coords.endX = ex;
403
+ coords.endY = ey;
404
+ coords.normalizedX = cx / vw;
405
+ coords.normalizedY = cy / vh;
406
+ coords.normalizedEndX = ex / vw;
407
+ coords.normalizedEndY = ey / vh;
408
+ coords.viewportWidth = vw;
409
+ coords.viewportHeight = vh;
410
+ coords.normalizedPrecomputed = true;
411
+ }
412
+
413
+ // Emit gesture:scroll event.
414
+ // emitEvent() triggers captureManager.onScrollSettle() internally
415
+ // for USER_ACTION events with gestureType='scroll' — no explicit call needed.
416
+ this.emitEvent('USER_ACTION', {
417
+ subtype: 'gesture:scroll',
418
+ payload: {
419
+ gestureType: 'scroll',
420
+ totalDeltaX: scrollMeta.totalDeltaX,
421
+ totalDeltaY: scrollMeta.totalDeltaY,
422
+ dominantDirection: scrollMeta.dominantDirection,
423
+ direction: scrollMeta.dominantDirection,
424
+ durationMs: scrollMeta.durationMs,
425
+ startTs: scrollMeta.startTs,
426
+ endTs: scrollMeta.endTs,
427
+ confidence: 'high',
428
+ ...coords
429
+ },
430
+ source: 'user'
431
+ });
432
+ });
433
+ this.crashAnchors = [];
434
+ this.loadingStartTimes.clear();
435
+
436
+ // Build session object
437
+ this.session = {
438
+ sessionId,
439
+ deviceId: this._rawTransport?.deviceId ?? 'unknown',
440
+ startedAt: Date.now(),
441
+ status: 'active',
442
+ metadata: {
443
+ // The real Platform.OS. This used to be a ternary whose else-branch was 'android'
444
+ // and whose catch was ALSO 'android' — so a macOS session, a Windows session, and
445
+ // a failure to load react-native at all were reported identically, as Android.
446
+ // Enriched by native device info when the bridge answers.
447
+ platform: (0, _device.resolvePlatformOS)(),
448
+ buildType: __DEV__ ? 'debug' : 'release',
449
+ ...metadata,
450
+ // Capture window dp dims here so emitEvent() can normalize coords
451
+ // without re-querying Dimensions on every gesture event.
452
+ ...(() => {
453
+ if (metadata?.screenWidth && metadata?.screenHeight) return {};
454
+ try {
455
+ const {
456
+ Dimensions
457
+ } = require('react-native');
458
+ const dims = Dimensions.get('window');
459
+ if (dims.width > 0 && dims.height > 0) {
460
+ return {
461
+ screenWidth: dims.width,
462
+ screenHeight: dims.height
463
+ };
464
+ }
465
+ } catch {/* no-throw */}
466
+ return {};
467
+ })()
468
+ },
469
+ transportState: 'local',
470
+ syncState: 'pending-evaluation',
471
+ artifactIndex: {
472
+ frameRefs: [],
473
+ eventRefs: [],
474
+ networkRefs: [],
475
+ logRefs: [],
476
+ crashAnchors: []
477
+ }
478
+ };
479
+ this.active = true;
480
+
481
+ // Enrich the live session metadata with native device info (appVersion,
482
+ // deviceModel, osVersion, …) so synchronous consumers — e.g. the engage
483
+ // response builder reading `currentSessionMetadata.appVersion` — see real
484
+ // values rather than the platform-only subset known at create time. The
485
+ // session-start metadata above is the fallback when the bridge is
486
+ // unavailable (old native binary). Fire-and-forget, never throws.
487
+ Promise.resolve().then(() => _bridgeAdapter.bridgeAdapter.getDeviceInfo()).then(info => {
488
+ const s = this.session;
489
+ if (!info || !s) return;
490
+ const m = s.metadata;
491
+ s.metadata = {
492
+ ...m,
493
+ appVersion: info.appVersion ?? m.appVersion,
494
+ appName: info.appName ?? m.appName,
495
+ bundleId: info.bundleId ?? m.bundleId,
496
+ osVersion: info.osVersion ?? m.osVersion,
497
+ deviceModel: info.deviceModel ?? m.deviceModel
498
+ };
499
+ }).catch(() => {
500
+ /* no-throw: metadata-only fallback */
501
+ });
502
+
503
+ // Notify transport (desktop + optional backend)
504
+ this.desktopTransport?.sendSessionStart(this.session);
505
+ this._backendTransport?.sendSessionStart(this.session);
506
+
507
+ // Emit SESSION_STARTED event
508
+ this.pipeline.emit('SESSION_STARTED', {
509
+ payload: {
510
+ sessionId
511
+ },
512
+ source: 'system'
513
+ });
514
+
515
+ // Start capture manager — unless the `frames` quota is spent, in which case the session
516
+ // runs without frame capture and resumes it (with a keyframe) when the block lifts.
517
+ if (_quotaState.quotaState.isBlocked('frames')) {
518
+ this._framesQuotaPaused = true;
519
+ this._captureStartedThisSession = false;
520
+ _internalLogger.logger.warn('[SessionManager] Replay frames quota exceeded — session started without frame capture');
521
+ } else {
522
+ this._framesQuotaPaused = false;
523
+ this._captureStartedThisSession = true;
524
+ this.captureManager.start();
525
+ }
526
+
527
+ // Set timeout
528
+ if (this.config.maxDurationMs > 0) {
529
+ this.timeoutTimer = setTimeout(() => {
530
+ __DEV__ && _internalLogger.logger.debug('[SessionManager] Session timeout reached');
531
+ this.endSession('timeout');
532
+ }, this.config.maxDurationMs);
533
+ }
534
+ __DEV__ && _internalLogger.logger.info(`[SessionManager] Session started: ${sessionId}`);
535
+
536
+ // ── Replay initial screen ──────────────────────────────────────
537
+ // If the user was already on a screen before pressing Record
538
+ // (typical: app mounted → screen hook fired → screen tracked),
539
+ // emit the initial SCREEN_VIEW now so the session captures the
540
+ // starting screen and triggers the first navigation frame.
541
+ if (this._lastKnownScreen) {
542
+ this.emitEvent('SCREEN_VIEW', {
543
+ screen: this._lastKnownScreen,
544
+ subtype: this._lastKnownScreen,
545
+ source: 'sdk'
546
+ });
547
+ }
548
+ } catch (err) {
549
+ _internalLogger.logger.error('[SessionManager] Failed to start session:', err);
550
+ }
551
+ }
552
+
553
+ /**
554
+ * End the current session.
555
+ */
556
+ endSession(reason = 'ended') {
557
+ // Fully idempotent — safe to call multiple times
558
+ if (!this.active) {
559
+ return;
560
+ }
561
+
562
+ // Disable collection FIRST to prevent any re-entrant emission during teardown
563
+ this.active = false;
564
+
565
+ // Guard: session must exist (should always be true if active was true)
566
+ if (!this.session) return;
567
+ try {
568
+ // Clear timeout
569
+ if (this.timeoutTimer) {
570
+ clearTimeout(this.timeoutTimer);
571
+ this.timeoutTimer = null;
572
+ }
573
+
574
+ // Dispose scroll tracker — cancels pending settle timer
575
+ if (this.scrollTracker) {
576
+ this.scrollTracker.dispose();
577
+ this.scrollTracker = null;
578
+ }
579
+
580
+ // Clear loading state
581
+ this.loadingStartTimes.clear();
582
+
583
+ // Emit SESSION_ENDED event
584
+ this.pipeline.emit('SESSION_ENDED', {
585
+ payload: {
586
+ reason
587
+ },
588
+ source: 'system'
589
+ });
590
+
591
+ // Stop capture — this cancels ALL pending timers and increments generation
592
+ this.captureManager.stop();
593
+
594
+ // Build final artifact index
595
+ const eventRefs = this.pipeline.buildEventRefs();
596
+ this.session.artifactIndex = {
597
+ ...eventRefs,
598
+ frameRefs: this.captureManager.getFrameRefs(),
599
+ crashAnchors: this.crashAnchors
600
+ };
601
+
602
+ // Finalize session
603
+ this.session.endedAt = Date.now();
604
+ this.session.status = reason === 'timeout' ? 'timeout' : 'ended';
605
+
606
+ // Run sync evaluation
607
+ const hasCrash = this.crashAnchors.length > 0;
608
+ const hasError = this.pipeline.getEvents().some(e => e.type === 'ERROR_CAPTURED');
609
+ const candidate = _SyncDecisionEngine.SyncDecisionEngine.buildCandidate(this.session.sessionId, this.session.metadata, this.pipeline.count, this.captureManager.count, this.session.endedAt - this.session.startedAt, hasCrash, hasError);
610
+ const decision = this.syncEngine.evaluate(candidate);
611
+ this.session.syncState = decision.shouldSync ? 'eligible' : 'ineligible';
612
+
613
+ // Notify transport (desktop + optional backend)
614
+ this.desktopTransport?.sendSessionEnd(this.session);
615
+ this._backendTransport?.sendSessionEnd(this.session);
616
+
617
+ // Clean up
618
+ this.pipeline.clear();
619
+ this.captureManager.clear();
620
+ // (this.active already set to false above)
621
+
622
+ __DEV__ && _internalLogger.logger.info(`[SessionManager] Session ended: ${this.session.sessionId} ` + `(${reason}, sync=${decision.shouldSync}, priority=${decision.priority})`);
623
+ } catch (err) {
624
+ _internalLogger.logger.error('[SessionManager] Failed to end session:', err);
625
+ // active is already false — no further cleanup needed
626
+ }
627
+ }
628
+
629
+ // ─── Event Emission ─────────────────────────────────────────────────
630
+
631
+ /**
632
+ * Resolve the dp-space base used to normalize JS-fallback tap coordinates.
633
+ *
634
+ * The screenshot is captured by native in the content-view at its physical
635
+ * pixel size. Normalized coords must divide by that SAME region (converted
636
+ * to dp, since pageX/pageY are dp). Using Dimensions.get('window') (or
637
+ * session.metadata, which is seeded from it) excludes system insets and is
638
+ * ~10% smaller than the content-view — pushing markers off. Preference order:
639
+ * native content-view (px→dp) → session metadata → payload → Dimensions.
640
+ */
641
+ _resolveNormalizationBaseDp(p) {
642
+ // Native screenshot-base size in JS-coordinate units (dp on Android, pt on iOS).
643
+ // This is the EXACT region the native screenshot was captured in, so JS-fallback
644
+ // taps (pageX/pageY in dp/pt) divide directly into the same coord space the
645
+ // marker overlay uses on the dashboard. Highest priority — session metadata
646
+ // and Dimensions.get('window') report the app window which excludes system
647
+ // insets differently across devices and pushes markers off vertically.
648
+ if (this._lastNativeViewportJsUnits) {
649
+ return {
650
+ width: this._lastNativeViewportJsUnits.width,
651
+ height: this._lastNativeViewportJsUnits.height,
652
+ space: this._lastNativeViewportJsUnits.space
653
+ };
654
+ }
655
+ const mw = this.session?.metadata?.screenWidth;
656
+ const mh = this.session?.metadata?.screenHeight;
657
+ if (mw && mh) return {
658
+ width: mw,
659
+ height: mh,
660
+ space: 'session-metadata-dp'
661
+ };
662
+ if (typeof p.viewportWidth === 'number' && p.viewportWidth > 0 && typeof p.viewportHeight === 'number' && p.viewportHeight > 0) {
663
+ return {
664
+ width: p.viewportWidth,
665
+ height: p.viewportHeight,
666
+ space: 'payload-viewport-dp'
667
+ };
668
+ }
669
+ try {
670
+ const {
671
+ Dimensions
672
+ } = require('react-native');
673
+ const dims = Dimensions.get('window');
674
+ if (dims.width > 0 && dims.height > 0) {
675
+ return {
676
+ width: dims.width,
677
+ height: dims.height,
678
+ space: 'root-view-dp'
679
+ };
680
+ }
681
+ } catch {/* no-throw */}
682
+ return null;
683
+ }
684
+
685
+ /**
686
+ * Inject/resolve normalized tap coordinates into a USER_ACTION payload, in place.
687
+ *
688
+ * Mutates `p` to carry normalizedX/Y (+ end coords for swipes/scrolls) so the
689
+ * heatmap can overlay them across viewport sizes. Returns true when the source
690
+ * already provided high-confidence / pre-computed normalized coords (native or
691
+ * JS-root-measured), false when this method JS-estimated them.
692
+ *
693
+ * Extracted from emitEvent so BOTH the replay-recording lane AND the always-on
694
+ * analytics lane (Feature #4) normalize identically — keeping the tap payload
695
+ * keys byte-for-byte the same on both routes.
696
+ */
697
+ _normalizeInteractionPayload(p) {
698
+ // If native tracker already provided high-confidence normalized coords,
699
+ // OR the JS path measured the root-view rect and precomputed normalized
700
+ // coords against it, do not overwrite them with JS estimation.
701
+ const hasNormalizedXY = typeof p.normalizedX === 'number' && typeof p.normalizedY === 'number';
702
+ const alreadyNormalized = hasNormalizedXY && (p.confidence === 'high' || p.normalizedPrecomputed === true);
703
+ if (alreadyNormalized) {
704
+ // Cache the native screenshot base in JS-coordinate units (dp/pt)
705
+ // so subsequent JS-fallback taps normalize against the same region
706
+ // the screenshot was captured from. Android sends px (suffix -px),
707
+ // iOS sends pt (suffix -pt). Both are converted to the unit RN
708
+ // pageX/pageY use, so JS taps divide directly with no extra math.
709
+ const cs = typeof p.coordinateSpace === 'string' ? p.coordinateSpace : '';
710
+
711
+ /**
712
+ * TRUST, BUT CHECK. `confidence: 'high'` means the NATIVE layer measured it — not that
713
+ * the number is right. One production device reports a content view of 288x448 px while
714
+ * telling us its layout width is 434.7dp, an implied density of 0.663 that no screen
715
+ * has. Cached unchecked, that wrong base then normalised every tap in the session and
716
+ * became the screenshot's coordinate space too.
717
+ *
718
+ * `windowWidth` and `density` are attached here so the check has both sides of the
719
+ * invariant and so the BACKEND can re-derive the same verdict from the stored payload —
720
+ * see `viewportPlausibility.ts` for the rule and the 56-device measurement behind it.
721
+ */
722
+ let density = 0;
723
+ let windowWidth = 0;
724
+ try {
725
+ const {
726
+ PixelRatio,
727
+ Dimensions
728
+ } = require('react-native');
729
+ density = PixelRatio.get();
730
+ windowWidth = Dimensions.get('window').width;
731
+ } catch {/* no-throw */}
732
+ const check = (0, _viewportPlausibility.checkViewport)({
733
+ viewportWidth: typeof p.viewportWidth === 'number' ? p.viewportWidth : null,
734
+ viewportHeight: typeof p.viewportHeight === 'number' ? p.viewportHeight : null,
735
+ windowWidth: windowWidth > 0 ? windowWidth : null,
736
+ coordinateSpace: cs,
737
+ density: density > 0 ? density : null
738
+ });
739
+ p.viewportCheck = check.verdict;
740
+ if (check.reason) p.viewportCheckReason = check.reason;
741
+ if (check.impliedDensity != null) p.impliedDensity = check.impliedDensity;
742
+ if (typeof p.viewportWidth === 'number' && p.viewportWidth > 0 && typeof p.viewportHeight === 'number' && p.viewportHeight > 0 && check.verdict !== 'implausible') {
743
+ if (cs.endsWith('-px')) {
744
+ if (density > 0) {
745
+ this._lastNativeViewportJsUnits = {
746
+ width: p.viewportWidth / density,
747
+ height: p.viewportHeight / density,
748
+ space: 'native-content-view-dp'
749
+ };
750
+ }
751
+ } else if (cs.endsWith('-pt')) {
752
+ // iOS already in pt — same unit as RN pageX/pageY
753
+ this._lastNativeViewportJsUnits = {
754
+ width: p.viewportWidth,
755
+ height: p.viewportHeight,
756
+ space: 'native-window-pt'
757
+ };
758
+ }
759
+ } else if (check.verdict === 'implausible') {
760
+ /**
761
+ * The native base is unusable, so fall back to the window and RE-NORMALISE.
762
+ *
763
+ * The coordinates already on the payload were divided by the bad base, so leaving
764
+ * them would keep every tap in the wrong place — the point of rejecting the base is
765
+ * to stop using it, including for the numbers already computed from it. The
766
+ * original is kept under `rejectedViewportW/H` so the device stays diagnosable
767
+ * from stored data instead of needing the handset.
768
+ */
769
+ p.rejectedViewportWidth = p.viewportWidth;
770
+ p.rejectedViewportHeight = p.viewportHeight;
771
+ this._lastNativeViewportJsUnits = null;
772
+
773
+ /**
774
+ * The window, taken DIRECTLY — not via `_resolveNormalizationBaseDp`.
775
+ *
776
+ * That helper would walk its priority list and land straight back on the rejected
777
+ * number: its third branch reads `p.viewportWidth` off this very payload, and its
778
+ * second reads `session.metadata.screenWidth`, which on a device that misreports
779
+ * its content view has no reason to be any more trustworthy. Rejecting a source and
780
+ * then re-selecting it through a helper is how a fix becomes a no-op.
781
+ *
782
+ * `Dimensions.get('window')` is the measurement the invariant just CONFIRMED is
783
+ * sound — on the failing device its 434.7dp is exactly right for a 1440px screen —
784
+ * so it is the one source that has earned being the fallback here.
785
+ */
786
+ let winW = 0;
787
+ let winH = 0;
788
+ try {
789
+ const {
790
+ Dimensions
791
+ } = require('react-native');
792
+ const d = Dimensions.get('window');
793
+ winW = d.width;
794
+ winH = d.height;
795
+ } catch {/* no-throw */}
796
+ const rx = typeof p.x === 'number' ? p.x : undefined;
797
+ const ry = typeof p.y === 'number' ? p.y : undefined;
798
+ if (winW > 0 && winH > 0) {
799
+ // `x`/`y` arrived in the REJECTED space (px), so they have to be converted into
800
+ // the window's unit before dividing, or the normalisation is wrong a second time.
801
+ const rejW = typeof p.rejectedViewportWidth === 'number' ? p.rejectedViewportWidth : 0;
802
+ const rejH = typeof p.rejectedViewportHeight === 'number' ? p.rejectedViewportHeight : 0;
803
+ if (rx !== undefined && ry !== undefined && rejW > 0 && rejH > 0) {
804
+ // Scale-free: the tap's POSITION within the rejected frame is still the best
805
+ // estimate of where the finger was, even though the frame's absolute size was
806
+ // nonsense. Re-express it against the window instead of re-dividing raw px.
807
+ const nx = Math.max(0, Math.min(1, rx / rejW));
808
+ const ny = Math.max(0, Math.min(1, ry / rejH));
809
+ p.normalizedX = nx;
810
+ p.normalizedY = ny;
811
+ p.x = nx * winW;
812
+ p.y = ny * winH;
813
+ }
814
+ p.viewportWidth = winW;
815
+ p.viewportHeight = winH;
816
+ p.coordinateSpace = 'window-fallback-dp';
817
+ p.confidence = 'derived';
818
+ }
819
+ }
820
+ } else {
821
+ // Resolve the normalization base (in dp). Priority:
822
+ // 1. session metadata screen size
823
+ // 2. native content-view size (px → dp via PixelRatio) — matches screenshot
824
+ // 3. payload viewport
825
+ // 4. Dimensions.get('window') — last resort (excludes insets, ~10% off)
826
+ const base = this._resolveNormalizationBaseDp(p);
827
+ const x = typeof p.x === 'number' ? p.x : undefined;
828
+ const y = typeof p.y === 'number' ? p.y : undefined;
829
+ if (x !== undefined && y !== undefined && base) {
830
+ p.normalizedX = Math.max(0, Math.min(1, x / base.width));
831
+ p.normalizedY = Math.max(0, Math.min(1, y / base.height));
832
+ p.viewportWidth = base.width;
833
+ p.viewportHeight = base.height;
834
+ p.coordinateSpace = base.space;
835
+ }
836
+ const endX = typeof p.endX === 'number' ? p.endX : undefined;
837
+ const endY = typeof p.endY === 'number' ? p.endY : undefined;
838
+ if (endX !== undefined && endY !== undefined && base) {
839
+ p.normalizedEndX = Math.max(0, Math.min(1, endX / base.width));
840
+ p.normalizedEndY = Math.max(0, Math.min(1, endY / base.height));
841
+ }
842
+ }
843
+ return alreadyNormalized;
844
+ }
845
+
846
+ /**
847
+ * Feature #4 (heatmaps) — additive analytics emission.
848
+ *
849
+ * Routes a tap/gesture to the always-on ANALYTICS lane (BackendSessionAdapter
850
+ * .trackEvent) so coords are captured even when no replay recording is active.
851
+ *
852
+ * Strictly additive and isolated:
853
+ * - Only runs when `_captureInteractionHeatmap` is ON (opt-in flag) AND a
854
+ * backend analytics transport is attached AND no recording is active
855
+ * (when active, the recording lane already emits the SAME USER_ACTION —
856
+ * emitting here too would duplicate it).
857
+ * - Reuses the EXACT recording payload shape (USER_ACTION + the same keys:
858
+ * normalizedX, normalizedY, gestureType, screen, …) so the backend
859
+ * aggregate reads them identically (no protocol/schema change).
860
+ * - Normalizes via the same _normalizeInteractionPayload used by recording.
861
+ * - Respects redaction: payload is passed through redactBody so any caller-
862
+ * injected sensitive keys (e.g. a label) are stripped before transport.
863
+ * - Never throws.
864
+ */
865
+ _emitInteractionToAnalytics(gestureType, payload, occurredAt, screenName) {
866
+ if (!this._captureInteractionHeatmap) return false;
867
+ if (this.active) return false; // recording lane already carries this tap
868
+ const adapter = this._backendTransport;
869
+ if (!adapter) return false;
870
+ try {
871
+ // Normalize coords in place (same logic as the recording lane).
872
+ this._normalizeInteractionPayload(payload);
873
+
874
+ // Respect redaction before handing to transport. redactBody returns a
875
+ // new object and strips known-sensitive keys; coords/gesture survive.
876
+ const safePayload = (0, _redaction.redactBody)(payload);
877
+
878
+ /**
879
+ * NO `frameId` HERE, and it is not an oversight.
880
+ *
881
+ * This method is guarded by `if (this.active) return;` — it runs ONLY when no replay
882
+ * recording is active, which is precisely when no screenshots are being captured.
883
+ * There is no frame on screen to point at, so an analytics-lane tap can never be
884
+ * attributed to a visual state.
885
+ *
886
+ * That makes it a permanent property of this lane rather than a gap to close later,
887
+ * and the dashboard has to account for it: these taps live in the heatmap grid
888
+ * alongside recorded ones, so a state filter necessarily covers a subset of the
889
+ * traffic. `heat:screen-coverage` reports that subset's size per app for exactly this
890
+ * reason.
891
+ */
892
+ const event = {
893
+ eventId: (0, _sessionId.generateEventId)(),
894
+ // sessionId is (re)stamped by the analytics lane at flush time.
895
+ sessionId: adapter.analyticsSessionId ?? '',
896
+ ts: occurredAt,
897
+ type: 'USER_ACTION',
898
+ subtype: `gesture:${gestureType}`,
899
+ screen: screenName ?? this._lastKnownScreen ?? undefined,
900
+ payload: safePayload,
901
+ source: 'user'
902
+ };
903
+ adapter.trackEvent(event);
904
+ return true;
905
+ } catch (err) {
906
+ _internalLogger.logger.error('[SessionManager] heatmap analytics emit failed:', err);
907
+ return false;
908
+ }
909
+ }
910
+
911
+ /**
912
+ * Emit a canonical event into the session pipeline.
913
+ * This is the primary entry point for all event sources.
914
+ */
915
+ emitEvent(type, opts) {
916
+ if (!this.active) return;
917
+ try {
918
+ // Pre-process USER_ACTION events to inject normalized coordinates for heatmap readiness
919
+ if (type === 'USER_ACTION' && opts?.payload) {
920
+ const p = opts.payload;
921
+ const alreadyNormalized = this._normalizeInteractionPayload(p);
922
+ __DEV__ && _internalLogger.logger.debug(`[TapAccuracy] sink platform=${p.platform ?? '?'} space=${p.coordinateSpace ?? '?'} ` + `source=${alreadyNormalized ? p.confidence === 'high' ? 'native-high' : 'js-precomputed' : 'js-estimated'} ` + `norm=(${p.normalizedX},${p.normalizedY}) base=(${p.viewportWidth}x${p.viewportHeight})`);
923
+
924
+ // ─── Diagnostic: merge calibration expected target (if a calibration
925
+ // screen stamped it within the TTL) and emit ONE unified [TapDiag]
926
+ // JSON object per gesture. Observability only — no math runs here.
927
+ const cal = (0, _calibrationContext.consumeCalibrationTarget)();
928
+ if (cal) {
929
+ p.expectedTargetId = cal.targetId;
930
+ p.expectedNX = cal.expectedNX;
931
+ p.expectedNY = cal.expectedNY;
932
+ }
933
+ try {
934
+ const meta = this.session?.metadata;
935
+ const diag = {
936
+ tag: 'TapDiag',
937
+ side: 'sdk',
938
+ platform: p.platform ?? null,
939
+ coordinateSource: alreadyNormalized ? p.confidence === 'high' ? 'native-high' : 'js-precomputed' : 'js-estimated',
940
+ coordinateSpace: p.coordinateSpace ?? null,
941
+ targetId: p.expectedTargetId ?? p.target ?? null,
942
+ expectedNX: p.expectedNX ?? null,
943
+ expectedNY: p.expectedNY ?? null,
944
+ rawX: p.x ?? null,
945
+ rawY: p.y ?? null,
946
+ pageX: p.pageX ?? null,
947
+ pageY: p.pageY ?? null,
948
+ locationX: p.locationX ?? null,
949
+ locationY: p.locationY ?? null,
950
+ normalizedX: p.normalizedX ?? null,
951
+ normalizedY: p.normalizedY ?? null,
952
+ viewportWidth: p.viewportWidth ?? null,
953
+ viewportHeight: p.viewportHeight ?? null,
954
+ rootViewWidth: p.rootViewWidth ?? null,
955
+ rootViewHeight: p.rootViewHeight ?? null,
956
+ rootViewLeft: p.rootViewLeft ?? null,
957
+ rootViewTop: p.rootViewTop ?? null,
958
+ screenWidth: p.screenWidth ?? meta?.screenWidth ?? null,
959
+ screenHeight: p.screenHeight ?? meta?.screenHeight ?? null,
960
+ windowWidth: p.windowWidth ?? null,
961
+ windowHeight: p.windowHeight ?? null,
962
+ statusBarHeight: p.statusBarHeight ?? null,
963
+ safeAreaTop: p.safeAreaTop ?? null,
964
+ timestamp: Date.now(),
965
+ confidence: p.confidence ?? null,
966
+ source: p.source ?? null
967
+ };
968
+ // Dev-only diagnostic echo. Must NOT emit in release: the console
969
+ // capture integration (captureConsoleLogs) would otherwise forward
970
+ // one [TapDiag] line per tap into the customer-facing Logs lane and
971
+ // bury their own logs. Sibling [TapAccuracy] log above is __DEV__-gated
972
+ // for the same reason; the heatmap/replay data flows through the
973
+ // interaction pipeline, not this echo, so gating it loses nothing.
974
+ // eslint-disable-next-line no-console
975
+ if (__DEV__) console.log('[TapDiag]', JSON.stringify(diag));
976
+ } catch {/* no-throw */}
977
+ }
978
+
979
+ /**
980
+ * Which frame was on screen when this happened.
981
+ *
982
+ * Resolved BEFORE `pipeline.emit`, and deliberately before the capture triggers
983
+ * below: those capture the frame that shows the RESULT of the interaction, and a tap
984
+ * belongs to the state it was made IN, not the one it produced. Reading after them
985
+ * would attribute every tap to its own consequence.
986
+ *
987
+ * USER_ACTION only. A SCREEN_VIEW's frame is the screen being left, which is
988
+ * misleading rather than useful, and no consumer asks for it.
989
+ *
990
+ * `currentKeyframe` returns null unless the frame is from this same screen and still
991
+ * fresh — see its contract. Null is the common, correct answer and stays absent on
992
+ * the event rather than becoming a default.
993
+ */
994
+ /**
995
+ * The keyframe is LINKED only when it can show this tap: a tap made after the list was
996
+ * scrolled is not a tap on the picture taken before it (frameLink.ts). The verdict and the
997
+ * frame's age ride on the payload, so a missing or unverified link is visible, not silent.
998
+ */
999
+ let framedOpts = opts;
1000
+ if (type === 'USER_ACTION') {
1001
+ const kf = this.captureManager?.currentKeyframe(opts?.screen ?? this._lastKnownScreen ?? undefined);
1002
+ const link = (0, _frameLink.frameLinkVerdict)(kf, opts?.payload?.['scroll_context']);
1003
+ const at = typeof opts?.timestamp === 'number' ? opts.timestamp : Date.now();
1004
+ framedOpts = {
1005
+ ...opts,
1006
+ frameId: kf && (link === 'linked' || link === 'unverified') ? kf.frameId : undefined,
1007
+ payload: {
1008
+ ...(opts?.payload ?? {}),
1009
+ frame_link: link,
1010
+ ...(kf ? {
1011
+ frame_age_ms: Math.max(0, at - kf.capturedAt)
1012
+ } : {})
1013
+ }
1014
+ };
1015
+ }
1016
+ const event = this.pipeline.emit(type, framedOpts);
1017
+
1018
+ // Trigger capture on screen view or interaction
1019
+ if (event) {
1020
+ if (type === 'SCREEN_VIEW' && opts?.screen) {
1021
+ this.captureManager.onScreenChange(opts.screen);
1022
+ } else if (type === 'USER_ACTION') {
1023
+ // Extract interaction coordinates from the gesture payload
1024
+ // so the captured frame carries tap location metadata.
1025
+ const p = opts?.payload;
1026
+ const x = typeof p?.x === 'number' ? p.x : undefined;
1027
+ const y = typeof p?.y === 'number' ? p.y : undefined;
1028
+ const gestureType = typeof p?.gestureType === 'string' ? p.gestureType : undefined;
1029
+
1030
+ // Scroll gestures use onScrollSettle (which debounces into a single
1031
+ // capture). Using onInteraction for scroll would produce a DUPLICATE
1032
+ // screenshot alongside the ScrollTracker's onScrollSettle call.
1033
+ if (gestureType === 'scroll') {
1034
+ this.captureManager.onScrollSettle(opts?.screen ?? this._lastKnownScreen ?? undefined);
1035
+ } else {
1036
+ let interactionPoint;
1037
+ if (x !== undefined && y !== undefined && gestureType) {
1038
+ interactionPoint = {
1039
+ x,
1040
+ y,
1041
+ normalizedX: typeof p?.normalizedX === 'number' ? p.normalizedX : undefined,
1042
+ normalizedY: typeof p?.normalizedY === 'number' ? p.normalizedY : undefined,
1043
+ screenWidth: this.session?.metadata?.screenWidth ?? 0,
1044
+ screenHeight: this.session?.metadata?.screenHeight ?? 0,
1045
+ viewportWidth: typeof p?.viewportWidth === 'number' ? p.viewportWidth : undefined,
1046
+ viewportHeight: typeof p?.viewportHeight === 'number' ? p.viewportHeight : undefined,
1047
+ gestureType,
1048
+ endX: typeof p?.endX === 'number' ? p.endX : undefined,
1049
+ endY: typeof p?.endY === 'number' ? p.endY : undefined,
1050
+ normalizedEndX: typeof p?.normalizedEndX === 'number' ? p.normalizedEndX : undefined,
1051
+ normalizedEndY: typeof p?.normalizedEndY === 'number' ? p.normalizedEndY : undefined,
1052
+ durationMs: typeof p?.durationMs === 'number' ? p.durationMs : undefined,
1053
+ direction: typeof p?.direction === 'string' ? p.direction : undefined
1054
+ };
1055
+ }
1056
+ this.captureManager.onInteraction(interactionPoint);
1057
+ }
1058
+ }
1059
+ }
1060
+ } catch (err) {
1061
+ _internalLogger.logger.error('[SessionManager] emitEvent failed:', err);
1062
+ }
1063
+ }
1064
+
1065
+ /**
1066
+ * Anchor a crash in the session context.
1067
+ * Protects nearby events and frames from eviction.
1068
+ */
1069
+ anchorCrash(crashEventId) {
1070
+ if (!this.active) return null;
1071
+ try {
1072
+ // Anchor events
1073
+ const anchor = this.pipeline.anchorCrash(crashEventId);
1074
+
1075
+ // Anchor frames (protect frames near the crash timestamp)
1076
+ const crashEvent = this.pipeline.getEvents().find(e => e.eventId === crashEventId);
1077
+ if (crashEvent) {
1078
+ const protectedFrameIds = this.captureManager.protectFramesNearCrash(crashEvent.ts);
1079
+ anchor.nearbyFrameIds = protectedFrameIds;
1080
+ }
1081
+
1082
+ // Capture an error-context frame
1083
+ this.captureManager.captureManual('error-context').catch(() => {});
1084
+ this.crashAnchors.push(anchor);
1085
+ __DEV__ && _internalLogger.logger.debug(`[SessionManager] Crash anchored: ${crashEventId}, ` + `protected ${anchor.nearbyEventIds.length} events, ` + `${anchor.nearbyFrameIds.length} frames`);
1086
+ return anchor;
1087
+ } catch (err) {
1088
+ _internalLogger.logger.error('[SessionManager] anchorCrash failed:', err);
1089
+ return null;
1090
+ }
1091
+ }
1092
+
1093
+ // ─── Navigation / Screen Integration ────────────────────────────────
1094
+
1095
+ /**
1096
+ * Notify of a screen change. Called by ScaleBunDebugRoot via NavDetector.
1097
+ */
1098
+ /** The screen currently on top, or null before the first navigation is observed. */
1099
+ getLastKnownScreen() {
1100
+ return this._lastKnownScreen;
1101
+ }
1102
+ onScreenChange(screenName) {
1103
+ // Always track the current screen — even when inactive.
1104
+ // This allows startSession to emit the initial SCREEN_VIEW for
1105
+ // the screen that was already mounted before Record was pressed.
1106
+ const previous = this._lastKnownScreen;
1107
+ const enteredAt = this._screenEnteredAt;
1108
+ this._lastKnownScreen = screenName;
1109
+ this._screenEnteredAt = Date.now();
1110
+ if (!this.active) return; // Defense-in-depth: no emission when recording is OFF
1111
+
1112
+ // SCREEN_EXIT for the screen being left, carrying its dwell time.
1113
+ //
1114
+ // The exit was previously detectable ONLY inside the Engage trigger engine and never became an
1115
+ // event, so time-on-screen had to be inferred from the gap to the NEXT SCREEN_VIEW — which is
1116
+ // wrong whenever the app backgrounds in between, and impossible for the last screen of a
1117
+ // session. Emitting it here makes dwell a measured value rather than a derived guess.
1118
+ if (previous && previous !== screenName && enteredAt != null) {
1119
+ this.emitEvent('SCREEN_EXIT', {
1120
+ screen: previous,
1121
+ subtype: previous,
1122
+ source: 'sdk',
1123
+ payload: {
1124
+ dwellMs: Math.max(0, Date.now() - enteredAt),
1125
+ to: screenName
1126
+ }
1127
+ });
1128
+ }
1129
+ this.emitEvent('SCREEN_VIEW', {
1130
+ screen: screenName,
1131
+ subtype: screenName,
1132
+ source: 'sdk',
1133
+ ...(previous && previous !== screenName ? {
1134
+ payload: {
1135
+ from: previous
1136
+ }
1137
+ } : {})
1138
+ });
1139
+ }
1140
+
1141
+ /**
1142
+ * Notify of a user interaction. Called by ScaleBunDebugRoot touch handlers.
1143
+ * Also triggers frame capture for desktop-initiated recordings.
1144
+ */
1145
+ onUserAction(subtype, payload, context) {
1146
+ if (!this.active) return; // Defense-in-depth: no emission when recording is OFF
1147
+ this.emitEvent('USER_ACTION', {
1148
+ subtype,
1149
+ screen: context?.screen ?? this._lastKnownScreen ?? undefined,
1150
+ payload,
1151
+ source: 'user',
1152
+ timestamp: context?.timestamp
1153
+ });
1154
+ // NOTE: Do NOT call captureManager.onInteraction() here.
1155
+ // emitEvent() already triggers onInteraction() for USER_ACTION events (line ~405).
1156
+ // Calling it again here caused DUPLICATE frame captures per gesture.
1157
+ }
1158
+
1159
+ /**
1160
+ * Detailed gesture detection — called by ScaleBunDebugRoot touch handlers.
1161
+ * Emits a USER_ACTION event with gesture-specific subtype and payload.
1162
+ */
1163
+ onGestureDetected(gestureType, details) {
1164
+ // Exact-duplicate suppression — see _lastGestureSig. Signature is the gesture type plus
1165
+ // raw coordinates verbatim; String() keeps undefined coords distinct from 0 (a payload
1166
+ // with no coords never collides with a real origin tap).
1167
+ const suppliedInteractionId = details?.interactionId;
1168
+ const dedupSig = suppliedInteractionId ? `id:${suppliedInteractionId}` : `${gestureType}|${String(details?.x)}|${String(details?.y)}|${String(details?.endX)}|${String(details?.endY)}`;
1169
+ const nowTs = Date.now();
1170
+ if (dedupSig === this._lastGestureSig && nowTs - this._lastGestureTs <= SessionManager.GESTURE_DEDUP_WINDOW_MS) {
1171
+ this._lastGestureTs = nowTs; // a burst of 3 stays suppressed even if gaps chain past the window
1172
+ return;
1173
+ }
1174
+ this._lastGestureSig = dedupSig;
1175
+ this._lastGestureTs = nowTs;
1176
+
1177
+ // Build the canonical gesture payload ONCE so the recording lane and the
1178
+ // (additive) analytics lane carry byte-identical keys (normalizedX/Y,
1179
+ // gestureType, etc.). Same object shape that was previously inlined.
1180
+ const interactionId = suppliedInteractionId ?? (0, _interactionProtocol.generateInteractionId)();
1181
+ const occurredAt = details?.occurredAt ?? Date.now();
1182
+ const stateStatus = details?.stateStatus ?? (details?.ui ? 'captured_nonempty' : 'not_captured');
1183
+ const payload = {
1184
+ interaction_id: interactionId,
1185
+ interaction_protocol: details?.interactionProtocol ?? _interactionProtocol.INTERACTION_PROTOCOL_VERSION,
1186
+ state_status: stateStatus,
1187
+ ui: details?.ui,
1188
+ target_id: details?.targetId,
1189
+ /**
1190
+ * RN-6 — shipped with the row so the join is auditable instead of assumed.
1191
+ *
1192
+ * Without it, an interaction with no `target_id` is ambiguous in the worst way:
1193
+ * it could mean the control genuinely had no identity, or that the correlation
1194
+ * refused and the identity exists but could not be attributed. Those are
1195
+ * different defects with different owners, and the accounting lane cannot give
1196
+ * an honest unplaceable REASON without knowing which.
1197
+ *
1198
+ * Undefined on the JS-fallback path (no native event, so nothing was joined),
1199
+ * which is itself the correct answer there rather than a fabricated 'exact'.
1200
+ */
1201
+ correlation: details?.correlation,
1202
+ correlation_delta_ms: details?.correlationDeltaMs,
1203
+ correlation_runner_up_delta_ms: details?.correlationRunnerUpDeltaMs,
1204
+ /**
1205
+ * RN-1/RN-2 — stored alongside `target_id` so a reader can tell an authored
1206
+ * identifier from a structural inference. 'path' means the app authored no testID
1207
+ * and the identity was derived from component names, which is useful but will
1208
+ * change under refactoring; a dashboard that presents the two identically invites
1209
+ * someone to trust a key that is about to move.
1210
+ */
1211
+ target_source: details?.targetSource,
1212
+ /**
1213
+ * RN-8 — stored so "13.8% of interactions have a screen" becomes answerable.
1214
+ * 'none' means the app instrumented nothing the SDK could see; 'manual' means a
1215
+ * <ScaleBunScreen> beacon; 'navigation' means the React Navigation hook. Three
1216
+ * different owners behind one number that today has none.
1217
+ */
1218
+ screen_source: details?.screenSource,
1219
+ /**
1220
+ * RN-13 — what makes "the heat is on this control" checkable instead of assumed.
1221
+ * Absent when the control could not be measured synchronously, which is a fact worth
1222
+ * storing: an unmeasurable control and a mis-placed tap are different findings.
1223
+ */
1224
+ target_rect: details?.targetRect,
1225
+ /**
1226
+ * RN-3 — the backend already reads scrollX/scrollY off the payload into the fact
1227
+ * table's own columns (it has done since the web SDK, which sends `sx`/`sy`), so
1228
+ * these need no migration. Mobile simply never sent them.
1229
+ *
1230
+ * `scroll_source` says whether an offset was available at all: 'none' means the app
1231
+ * uses a plain <ScrollView> rather than the SDK's wrapper, which is a coverage gap in
1232
+ * the integration and not a tap at the top of a list.
1233
+ */
1234
+ scrollX: details?.scrollX,
1235
+ scrollY: details?.scrollY,
1236
+ scroll_source: details?.scrollSource,
1237
+ /**
1238
+ * Every scroll container under the finger at touch-down, innermost first, in the
1239
+ * capture view's pixel space (native probe). The single scrollX/Y above is the
1240
+ * innermost; the chain is what lets a nested list be placed without guessing.
1241
+ */
1242
+ scroll_context: details?.scrollContext,
1243
+ pixel_density: details?.pixelDensity,
1244
+ heatmap_schema_version: details?.heatmapSchemaVersion,
1245
+ /**
1246
+ * RN-4 — what stops a recycled native view merging two different rows into one
1247
+ * hotspot. The key is the app's own keyExtractor output, so it is stable across
1248
+ * scrolling and across sessions; the index is carried so a recycled slot (same index,
1249
+ * different key) can be proven rather than inferred.
1250
+ */
1251
+ item_key: details?.itemKey,
1252
+ item_index: details?.itemIndex,
1253
+ /**
1254
+ * RN-15 — where in the control, not just which control. Turns "they tapped Add to
1255
+ * Cart" into "they tapped its left edge", which is what tells you whether a hit area
1256
+ * is right. Outside 0..1 is a hitSlop tap and is kept as such.
1257
+ */
1258
+ local_u: details?.localU,
1259
+ local_v: details?.localV,
1260
+ gestureType,
1261
+ x: details?.x,
1262
+ y: details?.y,
1263
+ endX: details?.endX,
1264
+ endY: details?.endY,
1265
+ duration: details?.duration ?? details?.durationMs,
1266
+ durationMs: details?.durationMs ?? details?.duration,
1267
+ direction: details?.direction,
1268
+ target: details?.target,
1269
+ viewportWidth: details?.viewportWidth,
1270
+ viewportHeight: details?.viewportHeight,
1271
+ pageX: details?.pageX,
1272
+ pageY: details?.pageY,
1273
+ locationX: details?.locationX,
1274
+ locationY: details?.locationY,
1275
+ // Native / JS-precomputed coords — passed through without overwriting
1276
+ normalizedX: details?.normalizedX,
1277
+ normalizedY: details?.normalizedY,
1278
+ normalizedEndX: details?.normalizedEndX,
1279
+ normalizedEndY: details?.normalizedEndY,
1280
+ confidence: details?.confidence,
1281
+ coordinateSpace: details?.coordinateSpace,
1282
+ source: details?.source,
1283
+ normalizedPrecomputed: details?.normalizedPrecomputed,
1284
+ statusBarHeight: details?.statusBarHeight,
1285
+ safeAreaTop: details?.safeAreaTop,
1286
+ rootViewTop: details?.rootViewTop,
1287
+ rootViewLeft: details?.rootViewLeft,
1288
+ rootViewWidth: details?.rootViewWidth,
1289
+ rootViewHeight: details?.rootViewHeight,
1290
+ windowWidth: details?.windowWidth,
1291
+ windowHeight: details?.windowHeight,
1292
+ screenshotCropTop: details?.screenshotCropTop,
1293
+ screenWidth: details?.screenWidth,
1294
+ screenHeight: details?.screenHeight,
1295
+ platform: details?.platform
1296
+ };
1297
+
1298
+ // ── Feature #4 (heatmaps): additive analytics emission ──
1299
+ // When NOT recording, route the tap to the always-on analytics lane so
1300
+ // heatmaps still get coords (opt-in via captureInteractionHeatmap). No-op
1301
+ // when the flag is OFF, no backend transport is attached, or recording is
1302
+ // active (the recording path below already carries this tap). Uses a fresh
1303
+ // payload clone so analytics normalization never mutates the recording one.
1304
+ const analyticsReplayCarrier = this._emitInteractionToAnalytics(gestureType, {
1305
+ ...payload
1306
+ }, occurredAt, details?.screenName);
1307
+ const replayCarrier = !!this._backendTransport && (this.active || analyticsReplayCarrier);
1308
+ if (details?.emitAutomaticAnalytics) {
1309
+ try {
1310
+ const safePayload = (0, _redaction.redactBody)(payload);
1311
+ (0, _automaticEvents.emitAutomaticEvent)('element_interacted', (0, _interactionProtocol.automaticInteractionProperties)(safePayload, details?.screenName ?? this._lastKnownScreen ?? undefined, replayCarrier), occurredAt);
1312
+ } catch {/* automatic projection must never affect interaction capture */}
1313
+ }
1314
+ if (!this.active) return; // Defense-in-depth: no emission when recording is OFF
1315
+ // The subtype becomes `ReplayEvent.label`, which is what the Events explorer GROUPS BY. Naming
1316
+ // the tapped control here is what splits taps per control instead of collapsing every tap in the
1317
+ // app into one `gesture:tap` row. Falls back to the bare gesture when nothing identified the
1318
+ // target, so behaviour is unchanged for taps that cannot be resolved.
1319
+ //
1320
+ // ⚠️ `gestureType` also travels in the payload, and the backend's `resolveGesture` reads THAT
1321
+ // first — so enriching the label cannot change heatmap gesture classification.
1322
+ const target = typeof details?.target === 'string' ? details.target.trim() : '';
1323
+ this.onUserAction(target ? `gesture:${gestureType} · ${target}` : `gesture:${gestureType}`, payload, {
1324
+ screen: details?.screenName,
1325
+ timestamp: occurredAt
1326
+ });
1327
+ }
1328
+
1329
+ /**
1330
+ * Manual frame capture — triggered by Desktop "Capture Step" button.
1331
+ */
1332
+ async captureManualFrame() {
1333
+ if (!this.active || !this.captureManager) return null; // No capture when recording is OFF
1334
+ const frame = await this.captureManager.captureManual('manual');
1335
+ return frame ? {
1336
+ frameId: frame.frameId
1337
+ } : null;
1338
+ }
1339
+
1340
+ /**
1341
+ * Notify of app lifecycle change.
1342
+ */
1343
+ onLifecycleChange(state) {
1344
+ this.emitEvent(state === 'foreground' ? 'APP_FOREGROUND' : 'APP_BACKGROUND', {
1345
+ source: 'system'
1346
+ });
1347
+ }
1348
+
1349
+ // ─── Scroll Integration ─────────────────────────────────────────────
1350
+
1351
+ /**
1352
+ * Notify of a scroll event from a scrollable surface (ScaleBunScrollView).
1353
+ * Delegates to ScrollTracker for accumulation and settle detection.
1354
+ */
1355
+ onScrollEvent(contentOffsetX, contentOffsetY) {
1356
+ if (!this.active) return;
1357
+ this.scrollTracker?.onScrollEvent(contentOffsetX, contentOffsetY);
1358
+ }
1359
+
1360
+ // ─── Loading State Integration ──────────────────────────────────────
1361
+
1362
+ /**
1363
+ * Notify that a screen has started loading.
1364
+ * Explicit instrumentation — NOT auto-called on screen entry.
1365
+ * Call from app code: ScaleBun.markLoadingStarted('ScreenName')
1366
+ */
1367
+ onLoadingStarted(screenName) {
1368
+ if (!this.active) return;
1369
+ this.loadingStartTimes.set(screenName, Date.now());
1370
+ this.emitEvent('LOADING_STARTED', {
1371
+ screen: screenName,
1372
+ subtype: screenName,
1373
+ payload: {
1374
+ screen: screenName
1375
+ },
1376
+ source: 'sdk'
1377
+ });
1378
+ }
1379
+
1380
+ /**
1381
+ * Notify that a screen has finished loading.
1382
+ * Explicit instrumentation — call from app code.
1383
+ * Triggers a 'screen_loaded' frame capture for the settled state.
1384
+ */
1385
+ onLoadingCompleted(screenName) {
1386
+ if (!this.active) return;
1387
+ const startTime = this.loadingStartTimes.get(screenName);
1388
+ const durationMs = startTime ? Date.now() - startTime : undefined;
1389
+ this.loadingStartTimes.delete(screenName);
1390
+ this.emitEvent('LOADING_COMPLETED', {
1391
+ screen: screenName,
1392
+ subtype: screenName,
1393
+ payload: {
1394
+ screen: screenName,
1395
+ durationMs
1396
+ },
1397
+ source: 'sdk'
1398
+ });
1399
+
1400
+ // Capture the settled loaded screen
1401
+ this.captureManager.onLoadingEnd(screenName);
1402
+ }
1403
+
1404
+ /**
1405
+ * App network activity, forwarded to replay capture so a frame can wait for the screen's
1406
+ * data instead of photographing the wait. Called by NetworkFeature, which has already
1407
+ * excluded this SDK's own uploads and third-party beacons.
1408
+ *
1409
+ * Deliberately NOT gated on `this.active`: the counter must stay balanced across a session
1410
+ * boundary. Dropping the `end` of a request whose `start` was counted would leave replay
1411
+ * believing the app is permanently loading, and a session can start or stop mid-request.
1412
+ * The capture manager ignores the signal when it is not capturing anyway.
1413
+ */
1414
+ onNetworkActivity(phase) {
1415
+ try {
1416
+ this.captureManager.onNetworkActivity(phase);
1417
+ } catch {
1418
+ // Advisory signal — it must never take down a network request.
1419
+ }
1420
+ }
1421
+
1422
+ // ─── Sync Policy ────────────────────────────────────────────────────
1423
+
1424
+ /**
1425
+ * Override the sync policy. SDK-owned — native only provides metadata.
1426
+ */
1427
+ setSyncPolicy(policy) {
1428
+ this.syncEngine.setPolicy(policy);
1429
+ }
1430
+
1431
+ /**
1432
+ * Provide native-gathered sync metadata for the current session.
1433
+ * Does NOT make the sync decision — that stays in SDK's SyncDecisionEngine.
1434
+ */
1435
+ setNativeSyncMetadata(metadata) {
1436
+ // Stored for use at session end evaluation
1437
+ if (this.session) {
1438
+ this.session._nativeSyncMetadata = metadata;
1439
+ }
1440
+ }
1441
+ }
1442
+
1443
+ // ─── Helpers ────────────────────────────────────────────────────────────────
1444
+ exports.SessionManager = SessionManager;
1445
+ function generateSessionId() {
1446
+ return `ses-${Date.now().toString(36)}-${Math.random().toString(36).substring(2, 8)}`;
1447
+ }
1448
+ //# sourceMappingURL=SessionManager.js.map