@scalebun/react-native 1.3.3 → 1.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 (97) hide show
  1. package/android/src/main/java/com/scalebun/rn/ota/BsPatch.kt +182 -0
  2. package/android/src/main/java/com/scalebun/rn/ota/ScaleBunOtaModule.kt +88 -13
  3. package/android/src/oldarch/java/com/scalebun/rn/crash/ScaleBunCrashSpec.kt +16 -0
  4. package/bin/scalebun.js +55 -3
  5. package/dist/scalebun.full.js +190 -110
  6. package/dist/scalebun.full.js.map +1 -1
  7. package/dist/scalebun.slim.js +188 -109
  8. package/dist/scalebun.slim.js.map +1 -1
  9. package/ios/Ota/BsPatch.swift +180 -0
  10. package/ios/Ota/OtaSlotManager.swift +59 -2
  11. package/ios/Ota/ScaleBunOtaModule.swift +89 -10
  12. package/lib/commonjs/analytics/EventTracker.js +26 -4
  13. package/lib/commonjs/analytics/EventTracker.js.map +1 -1
  14. package/lib/commonjs/analytics/eventLane.js +23 -0
  15. package/lib/commonjs/analytics/eventLane.js.map +1 -1
  16. package/lib/commonjs/core/constants/version.js +1 -1
  17. package/lib/commonjs/core/context/device.js +18 -0
  18. package/lib/commonjs/core/context/device.js.map +1 -1
  19. package/lib/commonjs/core/id/installationId.js +55 -0
  20. package/lib/commonjs/core/id/installationId.js.map +1 -0
  21. package/lib/commonjs/debug/bootstrap.js +14 -1
  22. package/lib/commonjs/debug/bootstrap.js.map +1 -1
  23. package/lib/commonjs/debug/transport.js +2 -1
  24. package/lib/commonjs/debug/transport.js.map +1 -1
  25. package/lib/commonjs/features/journey/journeyManager.js +2 -1
  26. package/lib/commonjs/features/journey/journeyManager.js.map +1 -1
  27. package/lib/commonjs/features/ota/OtaOrchestrator.js +2 -30
  28. package/lib/commonjs/features/ota/OtaOrchestrator.js.map +1 -1
  29. package/lib/commonjs/features/performance/collectors/FrameMetricsCollector.js +27 -3
  30. package/lib/commonjs/features/performance/collectors/FrameMetricsCollector.js.map +1 -1
  31. package/lib/commonjs/features/performance/collectors/JsStallCollector.js +20 -1
  32. package/lib/commonjs/features/performance/collectors/JsStallCollector.js.map +1 -1
  33. package/lib/commonjs/features/session/BackendSessionAdapter.js +8 -0
  34. package/lib/commonjs/features/session/BackendSessionAdapter.js.map +1 -1
  35. package/lib/commonjs/public/ScaleBunFacade.js +10 -2
  36. package/lib/commonjs/public/ScaleBunFacade.js.map +1 -1
  37. package/lib/module/analytics/EventTracker.js +26 -4
  38. package/lib/module/analytics/EventTracker.js.map +1 -1
  39. package/lib/module/analytics/eventLane.js +22 -0
  40. package/lib/module/analytics/eventLane.js.map +1 -1
  41. package/lib/module/core/constants/version.js +1 -1
  42. package/lib/module/core/context/device.js +17 -0
  43. package/lib/module/core/context/device.js.map +1 -1
  44. package/lib/module/core/id/installationId.js +50 -0
  45. package/lib/module/core/id/installationId.js.map +1 -0
  46. package/lib/module/debug/bootstrap.js +14 -1
  47. package/lib/module/debug/bootstrap.js.map +1 -1
  48. package/lib/module/debug/transport.js +2 -1
  49. package/lib/module/debug/transport.js.map +1 -1
  50. package/lib/module/features/journey/journeyManager.js +2 -1
  51. package/lib/module/features/journey/journeyManager.js.map +1 -1
  52. package/lib/module/features/ota/OtaOrchestrator.js +1 -29
  53. package/lib/module/features/ota/OtaOrchestrator.js.map +1 -1
  54. package/lib/module/features/performance/collectors/FrameMetricsCollector.js +27 -3
  55. package/lib/module/features/performance/collectors/FrameMetricsCollector.js.map +1 -1
  56. package/lib/module/features/performance/collectors/JsStallCollector.js +20 -1
  57. package/lib/module/features/performance/collectors/JsStallCollector.js.map +1 -1
  58. package/lib/module/features/session/BackendSessionAdapter.js +8 -0
  59. package/lib/module/features/session/BackendSessionAdapter.js.map +1 -1
  60. package/lib/module/public/ScaleBunFacade.js +12 -4
  61. package/lib/module/public/ScaleBunFacade.js.map +1 -1
  62. package/lib/typescript/analytics/EventTracker.d.ts.map +1 -1
  63. package/lib/typescript/analytics/eventLane.d.ts +2 -0
  64. package/lib/typescript/analytics/eventLane.d.ts.map +1 -1
  65. package/lib/typescript/core/constants/version.d.ts +1 -1
  66. package/lib/typescript/core/context/device.d.ts +13 -0
  67. package/lib/typescript/core/context/device.d.ts.map +1 -1
  68. package/lib/typescript/core/id/installationId.d.ts +20 -0
  69. package/lib/typescript/core/id/installationId.d.ts.map +1 -0
  70. package/lib/typescript/debug/bootstrap.d.ts +18 -0
  71. package/lib/typescript/debug/bootstrap.d.ts.map +1 -1
  72. package/lib/typescript/debug/transport.d.ts.map +1 -1
  73. package/lib/typescript/features/journey/journeyManager.d.ts.map +1 -1
  74. package/lib/typescript/features/ota/OtaOrchestrator.d.ts.map +1 -1
  75. package/lib/typescript/features/performance/collectors/FrameMetricsCollector.d.ts +14 -0
  76. package/lib/typescript/features/performance/collectors/FrameMetricsCollector.d.ts.map +1 -1
  77. package/lib/typescript/features/performance/collectors/JsStallCollector.d.ts +5 -0
  78. package/lib/typescript/features/performance/collectors/JsStallCollector.d.ts.map +1 -1
  79. package/lib/typescript/features/session/BackendSessionAdapter.d.ts.map +1 -1
  80. package/lib/typescript/public/ScaleBunFacade.d.ts.map +1 -1
  81. package/lib/typescript/public/types.d.ts +1 -1
  82. package/lib/typescript/public/types.d.ts.map +1 -1
  83. package/package.json +3 -2
  84. package/src/analytics/EventTracker.ts +26 -4
  85. package/src/analytics/eventLane.ts +22 -0
  86. package/src/core/constants/version.ts +1 -1
  87. package/src/core/context/device.ts +17 -0
  88. package/src/core/id/installationId.ts +52 -0
  89. package/src/debug/bootstrap.ts +38 -1
  90. package/src/debug/transport.ts +2 -1
  91. package/src/features/journey/journeyManager.ts +2 -1
  92. package/src/features/ota/OtaOrchestrator.ts +1 -30
  93. package/src/features/performance/collectors/FrameMetricsCollector.ts +32 -3
  94. package/src/features/performance/collectors/JsStallCollector.ts +20 -1
  95. package/src/features/session/BackendSessionAdapter.ts +8 -0
  96. package/src/public/ScaleBunFacade.ts +12 -4
  97. package/src/public/types.ts +1 -1
@@ -0,0 +1,180 @@
1
+ import Foundation
2
+ import Compression
3
+
4
+ /// bspatch — reconstructs a bundle from a previous bundle plus a delta.
5
+ ///
6
+ /// WHAT WAS WRONG. `stagePatch` resolved `false` unconditionally on both
7
+ /// platforms, so the whole delta pipeline was decorative: the server generated
8
+ /// patches, the check response advertised them, the orchestrator asked for
9
+ /// them, and the device always fell back to a full download.
10
+ ///
11
+ /// FORMAT (produced by the backend's `bsdiff.ts`; all integers little-endian):
12
+ ///
13
+ /// 0 8 magic "SBDIFF01"
14
+ /// 8 4 target size — the exact number of bytes this must produce
15
+ /// 12 4 deflated control-block length
16
+ /// 16 4 inflated control-block length
17
+ /// 20 4 deflated diff-block length
18
+ /// 24 4 inflated diff-block length
19
+ /// 28 4 deflated extra-block length
20
+ /// 32 4 inflated extra-block length
21
+ /// 36 . deflate(control) ++ deflate(diff) ++ deflate(extra)
22
+ ///
23
+ /// Control is a run of (addLen, extraLen, seek) Int32 triples. `addLen` bytes
24
+ /// are read from the diff block and added, bytewise mod 256, to the source at
25
+ /// the current read cursor; `extraLen` bytes are copied verbatim from the extra
26
+ /// block; then the source cursor moves by the signed `seek`.
27
+ ///
28
+ /// WHY COMPRESSION_ZLIB. Apple's `COMPRESSION_ZLIB` is raw DEFLATE (RFC 1951)
29
+ /// with no zlib wrapper, which is exactly what Node's `deflateRawSync` writes
30
+ /// and what Android's `Inflater(nowrap: true)` reads. No third-party dependency
31
+ /// on any platform. `compression_decode_buffer` needs the output size up front,
32
+ /// which is why the inflated lengths ride in the header.
33
+ ///
34
+ /// EVERY FIELD HERE IS UNTRUSTED. The patch arrives over the network, so a
35
+ /// malformed or hostile one must fail cleanly rather than read out of bounds.
36
+ /// Each run is bounds-checked against all four buffers before use, and the
37
+ /// caller still verifies the SHA-256 of the result before anything is promoted.
38
+ enum BsPatch {
39
+
40
+ enum PatchError: Error, CustomStringConvertible {
41
+ case malformed(String)
42
+
43
+ var description: String {
44
+ switch self {
45
+ case .malformed(let why): return why
46
+ }
47
+ }
48
+ }
49
+
50
+ private static let magic = "SBDIFF01"
51
+ private static let headerBytes = 36
52
+
53
+ /// Refuse absurd allocations from a corrupt header (bundles are single-digit MB).
54
+ private static let maxTargetBytes = 256 * 1024 * 1024
55
+
56
+ private static func u32(_ b: [UInt8], _ off: Int) -> UInt32 {
57
+ UInt32(b[off]) | (UInt32(b[off + 1]) << 8) | (UInt32(b[off + 2]) << 16) | (UInt32(b[off + 3]) << 24)
58
+ }
59
+
60
+ private static func i32(_ b: [UInt8], _ off: Int) -> Int32 {
61
+ Int32(bitPattern: u32(b, off))
62
+ }
63
+
64
+ /// Raw DEFLATE decode into an exactly-sized buffer.
65
+ private static func inflateRaw(_ src: [UInt8], _ offset: Int, _ length: Int, _ rawSize: Int) throws -> [UInt8] {
66
+ if rawSize == 0 { return [] }
67
+ var out = [UInt8](repeating: 0, count: rawSize)
68
+ let produced: Int = out.withUnsafeMutableBufferPointer { dst in
69
+ src.withUnsafeBufferPointer { s in
70
+ compression_decode_buffer(
71
+ dst.baseAddress!, rawSize,
72
+ s.baseAddress!.advanced(by: offset), length,
73
+ nil, COMPRESSION_ZLIB
74
+ )
75
+ }
76
+ }
77
+ // Zero means failure; anything other than the declared size means the
78
+ // stream disagrees with the header, which is corruption either way.
79
+ guard produced == rawSize else {
80
+ throw PatchError.malformed("compressed block decoded to \(produced) bytes, declared \(rawSize)")
81
+ }
82
+ return out
83
+ }
84
+
85
+ /// Apply `patch` to `source`, returning the reconstructed bundle.
86
+ ///
87
+ /// Throws `PatchError.malformed` if the patch is malformed, truncated, or
88
+ /// inconsistent with `source`. Callers treat this as "fall back to a full
89
+ /// download", never as a fatal error.
90
+ static func apply(source: [UInt8], patch: [UInt8]) throws -> [UInt8] {
91
+ guard patch.count >= headerBytes else {
92
+ throw PatchError.malformed("patch too short")
93
+ }
94
+ let gotMagic = String(bytes: patch[0..<8], encoding: .isoLatin1) ?? ""
95
+ guard gotMagic == magic else {
96
+ throw PatchError.malformed("bad patch magic '\(gotMagic)'")
97
+ }
98
+
99
+ let targetSize64 = Int(u32(patch, 8))
100
+ let cLen = Int(u32(patch, 12))
101
+ let cRaw = Int(u32(patch, 16))
102
+ let dLen = Int(u32(patch, 20))
103
+ let dRaw = Int(u32(patch, 24))
104
+ let eLen = Int(u32(patch, 28))
105
+ let eRaw = Int(u32(patch, 32))
106
+
107
+ guard targetSize64 <= maxTargetBytes,
108
+ cRaw <= maxTargetBytes, dRaw <= maxTargetBytes, eRaw <= maxTargetBytes else {
109
+ throw PatchError.malformed("declared size is implausible")
110
+ }
111
+ guard headerBytes + cLen + dLen + eLen == patch.count else {
112
+ throw PatchError.malformed("block lengths do not match patch size")
113
+ }
114
+ let targetSize = targetSize64
115
+
116
+ var off = headerBytes
117
+ let control = try inflateRaw(patch, off, cLen, cRaw); off += cLen
118
+ let diff = try inflateRaw(patch, off, dLen, dRaw); off += dLen
119
+ let extra = try inflateRaw(patch, off, eLen, eRaw)
120
+
121
+ guard control.count % 12 == 0 else {
122
+ throw PatchError.malformed("control block is not a whole number of triples")
123
+ }
124
+
125
+ var out = [UInt8](repeating: 0, count: targetSize)
126
+ var newpos = 0
127
+ var oldpos = 0
128
+ var dpos = 0
129
+ var epos = 0
130
+
131
+ var c = 0
132
+ while c < control.count {
133
+ let addLen = Int(i32(control, c))
134
+ let extraLen = Int(i32(control, c + 4))
135
+ let seek = Int(i32(control, c + 8))
136
+ c += 12
137
+
138
+ guard addLen >= 0, extraLen >= 0 else {
139
+ throw PatchError.malformed("negative run length")
140
+ }
141
+ guard newpos + addLen <= targetSize else {
142
+ throw PatchError.malformed("add run overruns target")
143
+ }
144
+ guard dpos + addLen <= diff.count else {
145
+ throw PatchError.malformed("add run overruns diff block")
146
+ }
147
+ guard oldpos >= 0, oldpos + addLen <= source.count else {
148
+ throw PatchError.malformed("add run overruns source")
149
+ }
150
+
151
+ if addLen > 0 {
152
+ for i in 0..<addLen {
153
+ out[newpos + i] = diff[dpos + i] &+ source[oldpos + i]
154
+ }
155
+ }
156
+ newpos += addLen
157
+ oldpos += addLen
158
+ dpos += addLen
159
+
160
+ guard newpos + extraLen <= targetSize else {
161
+ throw PatchError.malformed("extra run overruns target")
162
+ }
163
+ guard epos + extraLen <= extra.count else {
164
+ throw PatchError.malformed("extra run overruns extra block")
165
+ }
166
+ if extraLen > 0 {
167
+ out.replaceSubrange(newpos..<(newpos + extraLen), with: extra[epos..<(epos + extraLen)])
168
+ }
169
+ newpos += extraLen
170
+ epos += extraLen
171
+
172
+ oldpos += seek
173
+ }
174
+
175
+ guard newpos == targetSize else {
176
+ throw PatchError.malformed("patch produced \(newpos) bytes, declared \(targetSize)")
177
+ }
178
+ return out
179
+ }
180
+ }
@@ -19,6 +19,12 @@ class OtaSlotManager {
19
19
  private static let bundleFilename = "bundle.jsbundle"
20
20
  private static let metaFilename = "meta.json"
21
21
  private static let bootMarkerFilename = "boot_marker"
22
+ private static let revertRecordFilename = "revert_record"
23
+
24
+ /// Launches a new bundle gets to call markHealthy() before it is reverted.
25
+ /// Matches the Android limit — the two platforms must agree or the same bad
26
+ /// release behaves differently depending on the phone.
27
+ private static let maxBootAttempts = 2
22
28
 
23
29
  private let otaRoot: URL
24
30
 
@@ -34,6 +40,7 @@ class OtaSlotManager {
34
40
  private var nextSlot: URL { otaRoot.appendingPathComponent("next") }
35
41
  private var previousSlot: URL { otaRoot.appendingPathComponent("previous") }
36
42
  private var bootMarkerFile: URL { otaRoot.appendingPathComponent(OtaSlotManager.bootMarkerFilename) }
43
+ private var revertRecordFile: URL { otaRoot.appendingPathComponent(OtaSlotManager.revertRecordFilename) }
37
44
 
38
45
  // MARK: - Public API
39
46
 
@@ -137,9 +144,21 @@ class OtaSlotManager {
137
144
  }
138
145
 
139
146
  /// Revert to previous slot.
140
- func revert() -> Bool {
147
+ func revert(reason: String = "boot_guard") -> Bool {
141
148
  let fm = FileManager.default
142
149
 
150
+ // Leave a record so slotStateJSON can tell JS a revert happened. Without
151
+ // it `bootGuardReverted` was read by the orchestrator and written by
152
+ // nobody on iOS, so an auto-rollback that DID occur reported nothing —
153
+ // the dashboard counted zero rollbacks while devices were reverting.
154
+ let record: [String: Any] = [
155
+ "reason": reason,
156
+ "at": Int(Date().timeIntervalSince1970 * 1000),
157
+ ]
158
+ if let data = try? JSONSerialization.data(withJSONObject: record) {
159
+ try? data.write(to: revertRecordFile, options: .atomic)
160
+ }
161
+
143
162
  do {
144
163
  if !fm.fileExists(atPath: previousSlot.path) {
145
164
  NSLog("[ScaleBunOta] No previous/ to revert to — clearing current/")
@@ -203,7 +222,31 @@ class OtaSlotManager {
203
222
  NSLog("[ScaleBunOta] Boot guard cannot verify this bundle — marker or meta has no sha256. Leaving it in place.")
204
223
  } else if currentId != markerId {
205
224
  NSLog("[ScaleBunOta] Boot marker sha256 mismatch — reverting")
206
- _ = revert()
225
+ _ = revert(reason: "hash_mismatch")
226
+ } else {
227
+ // ── Crash-loop revert ────────────────────────────────────────
228
+ // Matching hashes mean the bundle is INTACT, which says nothing
229
+ // about whether it RUNS. A bundle that throws at JS init installs
230
+ // cleanly, matches on every boot, and never reaches markHealthy()
231
+ // — so a hash-only guard let it crash-loop forever, bricking the
232
+ // app until reinstall. iOS had no counter at all, so this was the
233
+ // outcome on every iPhone.
234
+ //
235
+ // The marker doubles as a boot-attempt counter: each launch that
236
+ // still finds it increments it, and reaching the limit means the
237
+ // bundle has had its chances and never became healthy.
238
+ var marker = markerJson
239
+ let attempts = (marker["bootAttempts"] as? Int ?? 0) + 1
240
+ if attempts >= OtaSlotManager.maxBootAttempts {
241
+ NSLog("[ScaleBunOta] Bundle failed to become healthy in \(attempts) launch(es) — reverting")
242
+ _ = revert(reason: "boot_crash_guard")
243
+ return
244
+ }
245
+ marker["bootAttempts"] = attempts
246
+ if let data = try? JSONSerialization.data(withJSONObject: marker) {
247
+ try? data.write(to: bootMarkerFile, options: .atomic)
248
+ }
249
+ NSLog("[ScaleBunOta] Boot guard: attempt \(attempts)/\(OtaSlotManager.maxBootAttempts) for this bundle")
207
250
  }
208
251
  } catch {
209
252
  NSLog("[ScaleBunOta] checkBootGuard() failed — reverting: \(error)")
@@ -220,6 +263,20 @@ class OtaSlotManager {
220
263
  state["next"] = readMeta(slot: nextSlot) as Any
221
264
  state["previous"] = readMeta(slot: previousSlot) as Any
222
265
 
266
+ // Consume-on-read: the orchestrator turns this into exactly one
267
+ // AUTO_ROLLBACK event. Leaving it would re-report the same rollback on
268
+ // every launch.
269
+ let fm = FileManager.default
270
+ if fm.fileExists(atPath: revertRecordFile.path) {
271
+ if let data = try? Data(contentsOf: revertRecordFile),
272
+ let rec = try? JSONSerialization.jsonObject(with: data) as? [String: Any] {
273
+ state["bootGuardReverted"] = true
274
+ state["bootGuardRevertReason"] = rec["reason"] as? String ?? "boot_guard"
275
+ state["bootGuardRevertedAt"] = rec["at"] as? Int ?? 0
276
+ }
277
+ try? fm.removeItem(at: revertRecordFile)
278
+ }
279
+
223
280
  guard let data = try? JSONSerialization.data(withJSONObject: state),
224
281
  let json = String(data: data, encoding: .utf8) else {
225
282
  return "{\"current\":null,\"next\":null,\"previous\":null,\"bootMarkerPresent\":false}"
@@ -1,5 +1,6 @@
1
1
  import Foundation
2
2
  import React
3
+ import CommonCrypto
3
4
 
4
5
  /**
5
6
  * React Native bridge for OTA bundle management (`ScaleBunOta`) on iOS.
@@ -121,22 +122,100 @@ class ScaleBunOtaModule: NSObject, RCTBridgeModule {
121
122
  }
122
123
 
123
124
  @objc(stagePatch:patchSha256:expectedSha256:resolve:reject:)
124
- /// Sprint 7 scaffold — binary patching is NOT implemented on iOS.
125
+ /// Binary-patch staging (S7-NAT-1).
125
126
  ///
126
- /// This stub exists because the codegen spec (NativeScaleBunOta.ts) declares
127
- /// `stagePatch`, so on the New Architecture the generated JSI class
128
- /// dispatches the call to this selector whether or not it exists — a missing
129
- /// implementation surfaces as an "unrecognized selector" exception on every
130
- /// patch attempt. The identical gap broke the Android build at the start of
131
- /// this effort (Kotlin fails at compile; ObjC fails at runtime, which is
132
- /// worse because it ships). Resolving `false` routes the orchestrator to its
133
- /// full-bundle fallback, exactly like Android.
127
+ /// Downloads a delta, reconstructs the full bundle from the currently
128
+ /// installed one, and hands the result to the ordinary staging path — so a
129
+ /// patched bundle passes exactly the same SHA-256 and slot-promotion checks
130
+ /// as a fully downloaded one. `expectedSha256` is the hash of the COMPLETE
131
+ /// bundle, which is what makes a bad patch unable to install: reconstruct
132
+ /// the wrong bytes and staging rejects them.
133
+ ///
134
+ /// Resolves `false` never rejects — for every "cannot patch" case, because
135
+ /// `src/specs/NativeScaleBunOta.ts` defines false as "patching unavailable,
136
+ /// fall back to a full download". The update still lands, just larger.
134
137
  func stagePatch(_ patchUrl: NSString,
135
138
  patchSha256: NSString,
136
139
  expectedSha256: NSString,
137
140
  resolve: @escaping RCTPromiseResolveBlock,
138
141
  reject: @escaping RCTPromiseRejectBlock) {
139
- resolve(false)
142
+ // Patching is relative to the bundle already on disk. With no OTA bundle
143
+ // installed the source would be the app's built-in bundle, which the
144
+ // server did not diff against — so a full download is the correct path.
145
+ guard let currentURL = ScaleBunOtaModule.slotManager.currentBundleURL(),
146
+ let sourceData = try? Data(contentsOf: currentURL) else {
147
+ NSLog("[ScaleBunOta] stagePatch: no current OTA bundle to patch — full download")
148
+ resolve(false)
149
+ return
150
+ }
151
+
152
+ let temp = FileManager.default.temporaryDirectory
153
+ .appendingPathComponent("scalebun_ota_patch_\(UUID().uuidString)")
154
+ defer { try? FileManager.default.removeItem(at: temp) }
155
+
156
+ guard BundleDownloader.download(urlString: patchUrl as String, destination: temp),
157
+ let patchData = try? Data(contentsOf: temp) else {
158
+ resolve(false)
159
+ return
160
+ }
161
+
162
+ // Verify the patch against its own hash before parsing it. Cheap, and it
163
+ // keeps obviously-corrupt input away from the parser.
164
+ guard let actualPatchSha = ScaleBunOtaModule.sha256Hex(patchData),
165
+ actualPatchSha.caseInsensitiveCompare(patchSha256 as String) == .orderedSame else {
166
+ NSLog("[ScaleBunOta] stagePatch: patch hash mismatch — full download")
167
+ resolve(false)
168
+ return
169
+ }
170
+
171
+ let rebuilt: [UInt8]
172
+ do {
173
+ rebuilt = try BsPatch.apply(source: [UInt8](sourceData), patch: [UInt8](patchData))
174
+ } catch {
175
+ NSLog("[ScaleBunOta] stagePatch: \(error) — full download")
176
+ resolve(false)
177
+ return
178
+ }
179
+
180
+ let rebuiltURL = FileManager.default.temporaryDirectory
181
+ .appendingPathComponent("scalebun_ota_rebuilt_\(UUID().uuidString)")
182
+ defer { try? FileManager.default.removeItem(at: rebuiltURL) }
183
+
184
+ do {
185
+ try Data(rebuilt).write(to: rebuiltURL)
186
+ } catch {
187
+ NSLog("[ScaleBunOta] stagePatch: could not write rebuilt bundle — full download")
188
+ resolve(false)
189
+ return
190
+ }
191
+
192
+ let meta: [String: Any] = [
193
+ "sha256": expectedSha256 as String,
194
+ "installedAt": Int(Date().timeIntervalSince1970 * 1000),
195
+ "patched": true
196
+ ]
197
+
198
+ // The slot manager re-hashes and compares against the full-bundle hash;
199
+ // a mis-applied patch cannot get past this.
200
+ let success = ScaleBunOtaModule.slotManager.stage(
201
+ sourcePath: rebuiltURL.path,
202
+ expectedSha256: expectedSha256 as String,
203
+ meta: meta
204
+ )
205
+ if !success {
206
+ NSLog("[ScaleBunOta] stagePatch: rebuilt bundle failed verification — full download")
207
+ }
208
+ resolve(success)
209
+ }
210
+
211
+ /// Hex SHA-256 of in-memory bytes. The slot manager has a file-based twin;
212
+ /// this one avoids a round-trip through disk for the downloaded patch.
213
+ private static func sha256Hex(_ data: Data) -> String? {
214
+ var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
215
+ data.withUnsafeBytes { buf in
216
+ _ = CC_SHA256(buf.baseAddress, CC_LONG(data.count), &digest)
217
+ }
218
+ return digest.map { String(format: "%02x", $0) }.joined()
140
219
  }
141
220
 
142
221
  @objc(applyUpdate:reject:)
@@ -5,7 +5,9 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.K_INSTALLATION_ID = exports.EventTracker = void 0;
7
7
  var _StorageBackend = require("../storage/StorageBackend");
8
+ var _device = require("../core/context/device");
8
9
  var _deviceId = require("../core/id/deviceId");
10
+ var _version = require("../core/constants/version");
9
11
  var _internalLogger = require("../core/logger/internalLogger");
10
12
  var _nativeCrashBridge = require("../features/crash/nativeCrashBridge");
11
13
  var _hmacSha = require("../crypto/hmacSha256");
@@ -72,7 +74,7 @@ class EventTracker {
72
74
  constructor(config) {
73
75
  this.storage = (0, _StorageBackend.createStorageBackend)();
74
76
  this.cfg = {
75
- platform: 'react_native',
77
+ platform: (0, _device.resolveEventPlatform)(),
76
78
  flushIntervalMs: DEFAULT_FLUSH_MS,
77
79
  batchSize: DEFAULT_BATCH,
78
80
  autoLifecycleEvents: true,
@@ -268,7 +270,27 @@ class EventTracker {
268
270
  const effectiveBatch = (0, _batching.clampBatchSize)(this.cfg.batchSize, DEFAULT_BATCH);
269
271
  const batch = this.queue.slice(0, effectiveBatch);
270
272
  try {
271
- // Sign the exact bytes we send so the backend can tamper-detect the payload.
273
+ // WHAT THIS SIGNATURE IS, AND WHAT IT IS NOT.
274
+ //
275
+ // This used to be described as letting "the backend tamper-detect
276
+ // the payload", which overstates it to the point of being wrong.
277
+ // The HMAC key is `clientKey` — the same value sent beside it in
278
+ // `x-scalebun-client-key`, and a value that ships inside every
279
+ // installed app, extractable by anyone who unzips an APK. A MAC
280
+ // whose key travels with the message and is public by construction
281
+ // proves nothing about who sent it: anyone can compute a valid one.
282
+ //
283
+ // What it DOES buy is integrity in transit against non-adversarial
284
+ // corruption, and a cheap filter for junk traffic. Treat `clientKey`
285
+ // as a publishable identifier (like a Stripe publishable key), never
286
+ // as a trust boundary. Authenticity that actually holds has to come
287
+ // from something the client cannot forge — server-side rate limits
288
+ // and anomaly detection per key, short-lived device tokens, or
289
+ // platform attestation (Play Integrity / App Attest).
290
+ //
291
+ // Contrast with OTA bundle signing (features/ota/signature.ts),
292
+ // which is asymmetric: the private half never leaves the publisher,
293
+ // so a valid signature there IS proof of origin.
272
294
  const payload = JSON.stringify({
273
295
  events: batch
274
296
  });
@@ -334,7 +356,7 @@ class EventTracker {
334
356
  event_name: eventName,
335
357
  event_time: Date.now(),
336
358
  app_id: this.cfg.appId,
337
- platform: this.cfg.platform ?? 'react_native',
359
+ platform: this.cfg.platform ?? (0, _device.resolveEventPlatform)(),
338
360
  installation_id: this.installationId,
339
361
  anonymous_id: this.anonymousId,
340
362
  session_id: canonicalSessionId || this.sessionId,
@@ -345,7 +367,7 @@ class EventTracker {
345
367
  ...(properties ?? {})
346
368
  },
347
369
  context: {
348
- sdk_version: ctx.sdk_version ?? '0.1.0',
370
+ sdk_version: ctx.sdk_version ?? _version.SDK_VERSION,
349
371
  ...ctx
350
372
  }
351
373
  };
@@ -1 +1 @@
1
- {"version":3,"names":["_StorageBackend","require","_deviceId","_internalLogger","_nativeCrashBridge","_hmacSha","_batching","_automaticEvents","SDK_SIGNING_VERSION","K_INSTALLATION_ID","exports","K_ANONYMOUS_ID","K_FIRST_OPEN","K_APP_VERSION","K_QUEUE","K_CLICK_ID","DEFAULT_FLUSH_MS","DEFAULT_BATCH","MAX_QUEUE","MAX_BACKOFF_MS","uuid","replace","c","r","Math","random","v","toString","EventTracker","identifiers","stamps","queue","timer","flushing","failureCount","started","automaticEventsUnsubscribe","constructor","config","storage","createStorageBackend","cfg","platform","flushIntervalMs","batchSize","autoLifecycleEvents","automaticEventTracking","installationId","loadOrCreate","anonymousId","sessionId","publishSessionToNative","loadQueue","loadClickId","getInstallationId","start","subscribeAutomaticEvents","event","track","name","properties","isFirstOpen","get","set","maybeAppUpdate","scheduleFlush","current","appVersion","previous","previous_version","current_version","newSession","setNativeActiveSession","identify","userId","traits","clearIdentity","undefined","setIdentifiers","ids","stamp","key","value","setAttributionClickId","clickId","click_id","eventName","enqueue","buildEnvelope","onEvent","err","logger","warn","message","trackPurchase","input","revenue","currency","transactionId","rest","env","transaction_id","flush","length","effectiveBatch","clampBatchSize","batch","slice","payload","JSON","stringify","events","idempotencyKey","batchIdempotencyKey","map","e","event_id","res","fetch","apiBaseUrl","method","headers","clientKey","hmacSha256Hex","body","ok","splice","persistQueue","status","stop","clearTimeout","ctx","context","canonicalSessionId","sessionIdProvider","event_name","event_time","Date","now","app_id","appId","installation_id","anonymous_id","session_id","device_id","getDeviceId","sdk_version","user_id","app_version","osVersion","os_version","country","Object","keys","push","catch","base","backlogRemaining","MAX_BATCH_EVENTS","delay","min","pow","setTimeout","existing","id","raw","parsed","parse","Array","isArray","cid"],"sourceRoot":"../../../src","sources":["analytics/EventTracker.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_StorageBackend","require","_device","_deviceId","_version","_internalLogger","_nativeCrashBridge","_hmacSha","_batching","_automaticEvents","SDK_SIGNING_VERSION","K_INSTALLATION_ID","exports","K_ANONYMOUS_ID","K_FIRST_OPEN","K_APP_VERSION","K_QUEUE","K_CLICK_ID","DEFAULT_FLUSH_MS","DEFAULT_BATCH","MAX_QUEUE","MAX_BACKOFF_MS","uuid","replace","c","r","Math","random","v","toString","EventTracker","identifiers","stamps","queue","timer","flushing","failureCount","started","automaticEventsUnsubscribe","constructor","config","storage","createStorageBackend","cfg","platform","resolveEventPlatform","flushIntervalMs","batchSize","autoLifecycleEvents","automaticEventTracking","installationId","loadOrCreate","anonymousId","sessionId","publishSessionToNative","loadQueue","loadClickId","getInstallationId","start","subscribeAutomaticEvents","event","track","name","properties","isFirstOpen","get","set","maybeAppUpdate","scheduleFlush","current","appVersion","previous","previous_version","current_version","newSession","setNativeActiveSession","identify","userId","traits","clearIdentity","undefined","setIdentifiers","ids","stamp","key","value","setAttributionClickId","clickId","click_id","eventName","enqueue","buildEnvelope","onEvent","err","logger","warn","message","trackPurchase","input","revenue","currency","transactionId","rest","env","transaction_id","flush","length","effectiveBatch","clampBatchSize","batch","slice","payload","JSON","stringify","events","idempotencyKey","batchIdempotencyKey","map","e","event_id","res","fetch","apiBaseUrl","method","headers","clientKey","hmacSha256Hex","body","ok","splice","persistQueue","status","stop","clearTimeout","ctx","context","canonicalSessionId","sessionIdProvider","event_name","event_time","Date","now","app_id","appId","installation_id","anonymous_id","session_id","device_id","getDeviceId","sdk_version","SDK_VERSION","user_id","app_version","osVersion","os_version","country","Object","keys","push","catch","base","backlogRemaining","MAX_BATCH_EVENTS","delay","min","pow","setTimeout","existing","id","raw","parsed","parse","Array","isArray","cid"],"sourceRoot":"../../../src","sources":["analytics/EventTracker.ts"],"mappings":";;;;;;AAoBA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AACA,IAAAK,kBAAA,GAAAL,OAAA;AACA,IAAAM,QAAA,GAAAN,OAAA;AACA,IAAAO,SAAA,GAAAP,OAAA;AACA,IAAAQ,gBAAA,GAAAR,OAAA;AA5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA;AACA;AACA,MAAMS,mBAAmB,GAAG,GAAG;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAAG,0BAA0B;AAC3D,MAAME,cAAc,GAAG,uBAAuB;AAC9C,MAAMC,YAAY,GAAG,0BAA0B;AAC/C;AACA,MAAMC,aAAa,GAAG,2BAA2B;AACjD,MAAMC,OAAO,GAAG,yBAAyB;AACzC,MAAMC,UAAU,GAAG,+BAA+B;AAElD,MAAMC,gBAAgB,GAAG,IAAI;AAC7B,MAAMC,aAAa,GAAG,EAAE;AACxB,MAAMC,SAAS,GAAG,IAAI;AACtB,MAAMC,cAAc,GAAG,MAAM;AAkE7B,SAASC,IAAIA,CAAA,EAAW;EACpB,OAAO,sCAAsC,CAACC,OAAO,CAAC,OAAO,EAAGC,CAAC,IAAK;IAClE,MAAMC,CAAC,GAAIC,IAAI,CAACC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAI,CAAC;IAClC,MAAMC,CAAC,GAAGJ,CAAC,KAAK,GAAG,GAAGC,CAAC,GAAIA,CAAC,GAAG,GAAG,GAAI,GAAG;IACzC,OAAOG,CAAC,CAACC,QAAQ,CAAC,EAAE,CAAC;EACzB,CAAC,CAAC;AACN;AAEO,MAAMC,YAAY,CAAC;EAOdC,WAAW,GAAkB,CAAC,CAAC;EAC/BC,MAAM,GAAwB,CAAC,CAAC;EAChCC,KAAK,GAAe,EAAE;EACtBC,KAAK,GAAQ,IAAI;EACjBC,QAAQ,GAAG,KAAK;EAChBC,YAAY,GAAG,CAAC;EAChBC,OAAO,GAAG,KAAK;EACfC,0BAA0B,GAAwB,IAAI;EAE9DC,WAAWA,CAACC,MAA0B,EAAE;IACpC,IAAI,CAACC,OAAO,GAAG,IAAAC,oCAAoB,EAAC,CAAC;IACrC,IAAI,CAACC,GAAG,GAAG;MACPC,QAAQ,EAAE,IAAAC,4BAAoB,EAAC,CAAC;MAChCC,eAAe,EAAE5B,gBAAgB;MACjC6B,SAAS,EAAE5B,aAAa;MACxB6B,mBAAmB,EAAE,IAAI;MACzBC,sBAAsB,EAAE,KAAK;MAC7B,GAAGT;IACP,CAAC;IACD,IAAI,CAACU,cAAc,GAAG,IAAI,CAACC,YAAY,CAACxC,iBAAiB,CAAC;IAC1D,IAAI,CAACyC,WAAW,GAAG,IAAI,CAACD,YAAY,CAACtC,cAAc,CAAC;IACpD,IAAI,CAACwC,SAAS,GAAG,QAAQ/B,IAAI,CAAC,CAAC,EAAE;IACjC;IACA;IACA,IAAI,CAACgC,sBAAsB,CAAC,CAAC;IAC7B,IAAI,CAACC,SAAS,CAAC,CAAC;IAChB,IAAI,CAACC,WAAW,CAAC,CAAC;EACtB;;EAEA;EACOC,iBAAiBA,CAAA,EAAW;IAC/B,OAAO,IAAI,CAACP,cAAc;EAC9B;;EAEA;;EAEAQ,KAAKA,CAAA,EAAS;IACV,IAAI,IAAI,CAACrB,OAAO,EAAE;IAClB,IAAI,CAACA,OAAO,GAAG,IAAI;IACnB,IAAI,IAAI,CAACM,GAAG,CAACM,sBAAsB,EAAE;MACjC,IAAI,CAACX,0BAA0B,GAAG,IAAAqB,yCAAwB,EAAEC,KAAK,IAAK;QAClE,IAAI,CAACC,KAAK,CAACD,KAAK,CAACE,IAAI,EAAEF,KAAK,CAACG,UAAU,CAAC;MAC5C,CAAC,CAAC;IACN;IACA,IAAI,IAAI,CAACpB,GAAG,CAACK,mBAAmB,EAAE;MAC9B;MACA;MACA,MAAMgB,WAAW,GAAG,IAAI,CAACvB,OAAO,CAACwB,GAAG,CAACnD,YAAY,CAAC,KAAK,GAAG;MAC1D,IAAIkD,WAAW,EAAE;QACb,IAAI,CAACH,KAAK,CAAC,YAAY,CAAC;QACxB,IAAI,CAACpB,OAAO,CAACyB,GAAG,CAACpD,YAAY,EAAE,GAAG,CAAC;MACvC;MACA;MACA;MACA;MACA;MACA,IAAI,CAACqD,cAAc,CAACH,WAAW,CAAC;MAChC,IAAI,CAACH,KAAK,CAAC,eAAe,CAAC;MAC3B,IAAI,CAACA,KAAK,CAAC,UAAU,CAAC;IAC1B;IACA,IAAI,CAACO,aAAa,CAAC,CAAC;EACxB;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACYD,cAAcA,CAACH,WAAoB,EAAQ;IAC/C,MAAMK,OAAO,GAAG,IAAI,CAAC1B,GAAG,CAAC2B,UAAU;IACnC,IAAI,CAACD,OAAO,EAAE,OAAO,CAAC;IACtB,IAAIE,QAAuB,GAAG,IAAI;IAClC,IAAI;MACAA,QAAQ,GAAG,IAAI,CAAC9B,OAAO,CAACwB,GAAG,CAAClD,aAAa,CAAC,IAAI,IAAI;IACtD,CAAC,CAAC,MAAM;MACJ,OAAO,CAAC;IACZ;IACA,IAAI;MACA,IAAI,CAAC0B,OAAO,CAACyB,GAAG,CAACnD,aAAa,EAAEsD,OAAO,CAAC;IAC5C,CAAC,CAAC,MAAM;MACJ;IAAA;IAEJ,IAAIL,WAAW,IAAI,CAACO,QAAQ,IAAIA,QAAQ,KAAKF,OAAO,EAAE;IACtD,IAAI,CAACR,KAAK,CAAC,YAAY,EAAE;MAAEW,gBAAgB,EAAED,QAAQ;MAAEE,eAAe,EAAEJ;IAAQ,CAAC,CAAC;EACtF;;EAEA;EACAK,UAAUA,CAAA,EAAS;IACf,IAAI,CAACrB,SAAS,GAAG,QAAQ/B,IAAI,CAAC,CAAC,EAAE;IACjC,IAAI,CAACgC,sBAAsB,CAAC,CAAC;IAC7B,IAAI,CAACO,KAAK,CAAC,eAAe,CAAC;EAC/B;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACYP,sBAAsBA,CAAA,EAAS;IACnC,KAAK,IAAAqB,yCAAsB,EAAC,IAAI,CAACtB,SAAS,CAAC;EAC/C;;EAEA;;EAEAuB,QAAQA,CAACC,MAAc,EAAEC,MAA4B,EAAQ;IACzD,IAAI,CAACD,MAAM,GAAGA,MAAM;IACpB;IACA;IACA,IAAI,CAAChB,KAAK,CAAC,OAAO,EAAEiB,MAAM,IAAI,CAAC,CAAC,CAAC;EACrC;;EAEA;EACAC,aAAaA,CAAA,EAAS;IAClB,IAAI,CAACF,MAAM,GAAGG,SAAS;EAC3B;;EAEA;EACAC,cAAcA,CAACC,GAAkB,EAAQ;IACrC,IAAI,CAACnD,WAAW,GAAG;MAAE,GAAG,IAAI,CAACA,WAAW;MAAE,GAAGmD;IAAI,CAAC;EACtD;;EAEA;AACJ;AACA;AACA;AACA;EACIC,KAAKA,CAACC,GAAW,EAAEC,KAAU,EAAQ;IACjC,IAAI,CAACrD,MAAM,CAACoD,GAAG,CAAC,GAAGC,KAAK;EAC5B;;EAEA;AACJ;AACA;AACA;AACA;AACA;EACIC,qBAAqBA,CAACC,OAAe,EAAQ;IACzC,IAAI,CAACA,OAAO,EAAE;IACd,IAAI,CAACxD,WAAW,GAAG;MAAE,GAAG,IAAI,CAACA,WAAW;MAAEyD,QAAQ,EAAED;IAAQ,CAAC;IAC7D,IAAI;MAAE,IAAI,CAAC9C,OAAO,CAACyB,GAAG,CAACjD,UAAU,EAAEsE,OAAO,CAAC;IAAE,CAAC,CAAC,MAAM,CAAE;EAC3D;;EAEA;;EAEA1B,KAAKA,CAAC4B,SAAiB,EAAE1B,UAAgC,EAAQ;IAC7D,IAAI;MACA,IAAI,CAAC2B,OAAO,CAAC,IAAI,CAACC,aAAa,CAACF,SAAS,EAAE1B,UAAU,CAAC,CAAC;MACvD,IAAI;QAAE,IAAI,CAACpB,GAAG,CAACiD,OAAO,GAAGH,SAAS,CAAC;MAAE,CAAC,CAAC,MAAM,CAAE;IACnD,CAAC,CAAC,OAAOI,GAAG,EAAE;MACVC,sBAAM,CAACC,IAAI,CAAC,mCAAoCF,GAAG,EAAYG,OAAO,EAAE,CAAC;IAC7E;EACJ;EAEAC,aAAaA,CAACC,KAAqF,EAAQ;IACvG,MAAM;MAAEC,OAAO;MAAEC,QAAQ;MAAEC,aAAa;MAAE,GAAGC;IAAK,CAAC,GAAGJ,KAAK;IAC3D,IAAI;MACA,MAAMK,GAAG,GAAG,IAAI,CAACZ,aAAa,CAAC,UAAU,EAAE;QAAE,GAAGW,IAAI;QAAEE,cAAc,EAAEH;MAAc,CAAC,CAAC;MACtFE,GAAG,CAACJ,OAAO,GAAGA,OAAO;MACrBI,GAAG,CAACH,QAAQ,GAAGA,QAAQ;MACvB,IAAI,CAACV,OAAO,CAACa,GAAG,CAAC;MACjB,IAAI;QAAE,IAAI,CAAC5D,GAAG,CAACiD,OAAO,GAAG,UAAU,EAAEO,OAAO,CAAC;MAAE,CAAC,CAAC,MAAM,CAAE;IAC7D,CAAC,CAAC,OAAON,GAAG,EAAE;MACVC,sBAAM,CAACC,IAAI,CAAC,2CAA4CF,GAAG,EAAYG,OAAO,EAAE,CAAC;IACrF;EACJ;;EAEA;;EAEA,MAAMS,KAAKA,CAAA,EAAkB;IACzB,IAAI,IAAI,CAACtE,QAAQ,IAAI,IAAI,CAACF,KAAK,CAACyE,MAAM,KAAK,CAAC,EAAE;IAC9C,IAAI,CAACvE,QAAQ,GAAG,IAAI;IACpB;IACA;IACA;IACA,MAAMwE,cAAc,GAAG,IAAAC,wBAAc,EAAC,IAAI,CAACjE,GAAG,CAACI,SAAS,EAAE5B,aAAa,CAAC;IACxE,MAAM0F,KAAK,GAAG,IAAI,CAAC5E,KAAK,CAAC6E,KAAK,CAAC,CAAC,EAAEH,cAAc,CAAC;IACjD,IAAI;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA,MAAMI,OAAO,GAAGC,IAAI,CAACC,SAAS,CAAC;QAAEC,MAAM,EAAEL;MAAM,CAAC,CAAC;MACjD;MACA;MACA;MACA,MAAMM,cAAc,GAAG,IAAAC,6BAAmB,EAACP,KAAK,CAACQ,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,CAAC;MACxE,MAAMC,GAAG,GAAG,MAAMC,KAAK,CAAC,GAAG,IAAI,CAAC9E,GAAG,CAAC+E,UAAU,QAAQ,EAAE;QACpDC,MAAM,EAAE,MAAM;QACdC,OAAO,EAAE;UACL,cAAc,EAAE,kBAAkB;UAClC,uBAAuB,EAAE,IAAI,CAACjF,GAAG,CAACkF,SAAS;UAC3C,sBAAsB,EAAE,IAAAC,sBAAa,EAAC,IAAI,CAACnF,GAAG,CAACkF,SAAS,EAAEd,OAAO,CAAC;UAClE,wBAAwB,EAAErG,mBAAmB;UAC7C,iBAAiB,EAAEyG;QACvB,CAAC;QACDY,IAAI,EAAEhB;MACV,CAAC,CAAC;MACF,IAAIS,GAAG,CAACQ,EAAE,EAAE;QACR;QACA,IAAI,CAAC/F,KAAK,CAACgG,MAAM,CAAC,CAAC,EAAEpB,KAAK,CAACH,MAAM,CAAC;QAClC,IAAI,CAACwB,YAAY,CAAC,CAAC;QACnB,IAAI,CAAC9F,YAAY,GAAG,CAAC;MACzB,CAAC,MAAM,IAAIoF,GAAG,CAACW,MAAM,IAAI,GAAG,IAAIX,GAAG,CAACW,MAAM,GAAG,GAAG,IAAIX,GAAG,CAACW,MAAM,KAAK,GAAG,EAAE;QACpE;QACArC,sBAAM,CAACC,IAAI,CAAC,qCAAqCyB,GAAG,CAACW,MAAM,eAAetB,KAAK,CAACH,MAAM,EAAE,CAAC;QACzF,IAAI,CAACzE,KAAK,CAACgG,MAAM,CAAC,CAAC,EAAEpB,KAAK,CAACH,MAAM,CAAC;QAClC,IAAI,CAACwB,YAAY,CAAC,CAAC;QACnB,IAAI,CAAC9F,YAAY,GAAG,CAAC;MACzB,CAAC,MAAM;QACH,IAAI,CAACA,YAAY,EAAE;MACvB;IACJ,CAAC,CAAC,MAAM;MACJ;MACA,IAAI,CAACA,YAAY,EAAE;IACvB,CAAC,SAAS;MACN,IAAI,CAACD,QAAQ,GAAG,KAAK;MACrB,IAAI,CAACiC,aAAa,CAAC,CAAC;IACxB;EACJ;EAEAgE,IAAIA,CAAA,EAAS;IACT,IAAI,CAAC9F,0BAA0B,GAAG,CAAC;IACnC,IAAI,CAACA,0BAA0B,GAAG,IAAI;IACtC,IAAI,IAAI,CAACJ,KAAK,EAAE;MACZmG,YAAY,CAAC,IAAI,CAACnG,KAAK,CAAC;MACxB,IAAI,CAACA,KAAK,GAAG,IAAI;IACrB;IACA,IAAI,CAACgG,YAAY,CAAC,CAAC;EACvB;;EAEA;;EAEQvC,aAAaA,CAACF,SAAiB,EAAE1B,UAAgC,EAAY;IACjF,MAAMuE,GAAG,GAAG,IAAI,CAAC3F,GAAG,CAAC4F,OAAO,IAAI,CAAC,CAAC;IAClC,IAAIC,kBAA6C;IACjD,IAAI;MACAA,kBAAkB,GAAG,IAAI,CAAC7F,GAAG,CAAC8F,iBAAiB,GAAG,CAAC;IACvD,CAAC,CAAC,MAAM;MACJD,kBAAkB,GAAG,IAAI;IAC7B;IACA,MAAMjC,GAAa,GAAG;MAClBgB,QAAQ,EAAEjG,IAAI,CAAC,CAAC;MAChBoH,UAAU,EAAEjD,SAAS;MACrBkD,UAAU,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC;MACtBC,MAAM,EAAE,IAAI,CAACnG,GAAG,CAACoG,KAAK;MACtBnG,QAAQ,EAAE,IAAI,CAACD,GAAG,CAACC,QAAQ,IAAI,IAAAC,4BAAoB,EAAC,CAAC;MACrDmG,eAAe,EAAE,IAAI,CAAC9F,cAAc;MACpC+F,YAAY,EAAE,IAAI,CAAC7F,WAAW;MAC9B8F,UAAU,EAAEV,kBAAkB,IAAI,IAAI,CAACnF,SAAS;MAChD8F,SAAS,EAAE,IAAAC,qBAAW,EAAC,CAAC;MACxB;MACArF,UAAU,EAAE;QAAE,GAAG,IAAI,CAAC/B,MAAM;QAAE,IAAI+B,UAAU,IAAI,CAAC,CAAC;MAAE,CAAC;MACrDwE,OAAO,EAAE;QAAEc,WAAW,EAAEf,GAAG,CAACe,WAAW,IAAIC,oBAAW;QAAE,GAAGhB;MAAI;IACnE,CAAC;IACD,IAAI,IAAI,CAACzD,MAAM,EAAE0B,GAAG,CAACgD,OAAO,GAAG,IAAI,CAAC1E,MAAM;IAC1C,IAAI,IAAI,CAAClC,GAAG,CAAC2B,UAAU,EAAEiC,GAAG,CAACiD,WAAW,GAAG,IAAI,CAAC7G,GAAG,CAAC2B,UAAU;IAC9D,IAAI,IAAI,CAAC3B,GAAG,CAAC8G,SAAS,EAAElD,GAAG,CAACmD,UAAU,GAAG,IAAI,CAAC/G,GAAG,CAAC8G,SAAS;IAC3D,IAAI,IAAI,CAAC9G,GAAG,CAACgH,OAAO,EAAEpD,GAAG,CAACoD,OAAO,GAAG,IAAI,CAAChH,GAAG,CAACgH,OAAO;IACpD,IAAIC,MAAM,CAACC,IAAI,CAAC,IAAI,CAAC9H,WAAW,CAAC,CAAC2E,MAAM,GAAG,CAAC,EAAEH,GAAG,CAACxE,WAAW,GAAG,IAAI,CAACA,WAAW;IAChF,OAAOwE,GAAG;EACd;EAEQb,OAAOA,CAACa,GAAa,EAAQ;IACjC,IAAI,CAACtE,KAAK,CAAC6H,IAAI,CAACvD,GAAG,CAAC;IACpB,IAAI,IAAI,CAACtE,KAAK,CAACyE,MAAM,GAAGtF,SAAS,EAAE;MAC/B,IAAI,CAACa,KAAK,CAACgG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAChG,KAAK,CAACyE,MAAM,GAAGtF,SAAS,CAAC,CAAC,CAAC;IACzD;IACA,IAAI,CAAC8G,YAAY,CAAC,CAAC;IACnB;IACA,IAAI,IAAI,CAACjG,KAAK,CAACyE,MAAM,KAAK,IAAI,CAAC/D,GAAG,CAACI,SAAS,IAAI5B,aAAa,CAAC,EAAE;MAC5D,IAAI,CAACsF,KAAK,CAAC,CAAC,CAACsD,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,CAAC,MAAM,IAAI,IAAI,CAAC1H,OAAO,EAAE;MACrB;MACA;MACA;MACA,IAAI,CAAC+B,aAAa,CAAC,CAAC;IACxB;EACJ;EAEQA,aAAaA,CAAA,EAAS;IAC1B,IAAI,IAAI,CAAClC,KAAK,EAAEmG,YAAY,CAAC,IAAI,CAACnG,KAAK,CAAC;IACxC,MAAM8H,IAAI,GAAG,IAAI,CAACrH,GAAG,CAACG,eAAe,IAAI5B,gBAAgB;IACzD;IACA;IACA,MAAM+I,gBAAgB,GAAG,IAAI,CAAC7H,YAAY,KAAK,CAAC,IAAI,IAAI,CAACH,KAAK,CAACyE,MAAM,GAAGwD,0BAAgB;IACxF,MAAMC,KAAK,GACP,IAAI,CAAC/H,YAAY,GAAG,CAAC,GACfV,IAAI,CAAC0I,GAAG,CAACJ,IAAI,GAAGtI,IAAI,CAAC2I,GAAG,CAAC,CAAC,EAAE,IAAI,CAACjI,YAAY,CAAC,EAAEf,cAAc,CAAC,GAAGK,IAAI,CAACC,MAAM,CAAC,CAAC,GAAG,GAAG,GACrFsI,gBAAgB,GACZ,CAAC,GACDD,IAAI;IAClB,IAAI,CAAC9H,KAAK,GAAGoI,UAAU,CAAC,MAAM;MAC1B,IAAI,CAAC7D,KAAK,CAAC,CAAC,CAACsD,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,CAAC,EAAEI,KAAK,CAAC;EACb;EAEQhH,YAAYA,CAACiC,GAAW,EAAU;IACtC,IAAI;MACA,MAAMmF,QAAQ,GAAG,IAAI,CAAC9H,OAAO,CAACwB,GAAG,CAACmB,GAAG,CAAC;MACtC,IAAImF,QAAQ,EAAE,OAAOA,QAAQ;IACjC,CAAC,CAAC,MAAM;MACJ;IAAA;IAEJ,MAAMC,EAAE,GAAGlJ,IAAI,CAAC,CAAC;IACjB,IAAI;MACA,IAAI,CAACmB,OAAO,CAACyB,GAAG,CAACkB,GAAG,EAAEoF,EAAE,CAAC;IAC7B,CAAC,CAAC,MAAM;MACJ;IAAA;IAEJ,OAAOA,EAAE;EACb;EAEQtC,YAAYA,CAAA,EAAS;IACzB,IAAI;MACA,IAAI,CAACzF,OAAO,CAACyB,GAAG,CAAClD,OAAO,EAAEgG,IAAI,CAACC,SAAS,CAAC,IAAI,CAAChF,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,MAAM;MACJ;IAAA;EAER;EAEQsB,SAASA,CAAA,EAAS;IACtB,IAAI;MACA,MAAMkH,GAAG,GAAG,IAAI,CAAChI,OAAO,CAACwB,GAAG,CAACjD,OAAO,CAAC;MACrC,IAAIyJ,GAAG,EAAE;QACL,MAAMC,MAAM,GAAG1D,IAAI,CAAC2D,KAAK,CAACF,GAAG,CAAC;QAC9B,IAAIG,KAAK,CAACC,OAAO,CAACH,MAAM,CAAC,EAAE,IAAI,CAACzI,KAAK,GAAGyI,MAAM,CAAC5D,KAAK,CAAC,CAAC1F,SAAS,CAAC;MACpE;IACJ,CAAC,CAAC,MAAM;MACJ,IAAI,CAACa,KAAK,GAAG,EAAE;IACnB;EACJ;EAEQuB,WAAWA,CAAA,EAAS;IACxB,IAAI;MACA,MAAMsH,GAAG,GAAG,IAAI,CAACrI,OAAO,CAACwB,GAAG,CAAChD,UAAU,CAAC;MACxC,IAAI6J,GAAG,EAAE,IAAI,CAAC/I,WAAW,CAACyD,QAAQ,GAAGsF,GAAG;IAC5C,CAAC,CAAC,MAAM;MACJ;IAAA;EAER;;EAEA;;EAEA,IAAI5F,GAAGA,CAAA,EAAG;IACN,OAAO;MACHhC,cAAc,EAAE,IAAI,CAACA,cAAc;MACnCE,WAAW,EAAE,IAAI,CAACA,WAAW;MAC7BC,SAAS,EAAE,IAAI,CAACA,SAAS;MACzBwB,MAAM,EAAE,IAAI,CAACA;IACjB,CAAC;EACL;AACJ;AAACjE,OAAA,CAAAkB,YAAA,GAAAA,YAAA","ignoreList":[]}
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.isSessionLaneEvent = isSessionLaneEvent;
7
+ exports.isUploadedSessionEvent = isUploadedSessionEvent;
7
8
  exports.resolveEventLane = resolveEventLane;
8
9
  /**
9
10
  * ScaleBun SDK — event lane routing.
@@ -29,4 +30,26 @@ function isSessionLaneEvent(name) {
29
30
  function resolveEventLane(name) {
30
31
  return isSessionLaneEvent(name) ? 'session' : 'analytics';
31
32
  }
33
+
34
+ /**
35
+ * Signals that stay IN-PROCESS: they fan out to the engage trigger engine, the perf collectors and
36
+ * the desktop debug stream, but are NOT uploaded as session events — because each one already has
37
+ * its own dedicated ingestion lane carrying strictly more data.
38
+ *
39
+ * `$network_request` is the founding member: NetworkFeature writes every request to the
40
+ * `network_requests` table via reportNetworkRequest (method/status/timing/sizes/headers), and ALSO
41
+ * tracked it — which uploaded a second copy as a USER_ACTION session event that nothing reads. The
42
+ * dashboard's inspector explicitly filters that echo out as noise, the heatmap route catalog
43
+ * documents it as pollution, and measured sessions carried ~15% of their event volume in it.
44
+ * (`$perf_event` was the same pattern, removed at its emit site — d81e0ab.)
45
+ *
46
+ * Rule for adding here: the signal must have a dedicated lane that every consumer reads. A signal
47
+ * whose ONLY record is the session event stream must never be added.
48
+ */
49
+ const INTERNAL_ONLY_SIGNALS = new Set(['$network_request']);
50
+
51
+ /** Should this tracked event be uploaded to the session-events lane at all? */
52
+ function isUploadedSessionEvent(name) {
53
+ return !INTERNAL_ONLY_SIGNALS.has(name);
54
+ }
32
55
  //# sourceMappingURL=eventLane.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["isSessionLaneEvent","name","startsWith","resolveEventLane"],"sourceRoot":"../../../src","sources":["analytics/eventLane.ts"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACO,SAASA,kBAAkBA,CAACC,IAAY,EAAW;EACtD,OAAOA,IAAI,CAACC,UAAU,CAAC,GAAG,CAAC;AAC/B;;AAEA;AACO,SAASC,gBAAgBA,CAACF,IAAY,EAAa;EACtD,OAAOD,kBAAkB,CAACC,IAAI,CAAC,GAAG,SAAS,GAAG,WAAW;AAC7D","ignoreList":[]}
1
+ {"version":3,"names":["isSessionLaneEvent","name","startsWith","resolveEventLane","INTERNAL_ONLY_SIGNALS","Set","isUploadedSessionEvent","has"],"sourceRoot":"../../../src","sources":["analytics/eventLane.ts"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACO,SAASA,kBAAkBA,CAACC,IAAY,EAAW;EACtD,OAAOA,IAAI,CAACC,UAAU,CAAC,GAAG,CAAC;AAC/B;;AAEA;AACO,SAASC,gBAAgBA,CAACF,IAAY,EAAa;EACtD,OAAOD,kBAAkB,CAACC,IAAI,CAAC,GAAG,SAAS,GAAG,WAAW;AAC7D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMG,qBAAqB,GAAG,IAAIC,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC;;AAE3D;AACO,SAASC,sBAAsBA,CAACL,IAAY,EAAW;EAC1D,OAAO,CAACG,qBAAqB,CAACG,GAAG,CAACN,IAAI,CAAC;AAC3C","ignoreList":[]}
@@ -9,5 +9,5 @@ exports.SDK_VERSION = void 0;
9
9
  * can attribute telemetry to the SDK build that produced it.
10
10
  * Keep in sync with package.json "version".
11
11
  */
12
- const SDK_VERSION = exports.SDK_VERSION = '1.3.3';
12
+ const SDK_VERSION = exports.SDK_VERSION = '1.5.0';
13
13
  //# sourceMappingURL=version.js.map
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.DETECTED_CONTEXT_KEYS = void 0;
7
7
  exports.mergeDeviceContext = mergeDeviceContext;
8
8
  exports.nativeDeviceContext = nativeDeviceContext;
9
+ exports.resolveEventPlatform = resolveEventPlatform;
9
10
  exports.resolveMobileOS = resolveMobileOS;
10
11
  exports.resolvePlatformOS = resolvePlatformOS;
11
12
  exports.staticDeviceContext = staticDeviceContext;
@@ -129,4 +130,21 @@ function mergeDeviceContext(configured, detected = staticDeviceContext()) {
129
130
  ...detected
130
131
  };
131
132
  }
133
+
134
+ /**
135
+ * The analytics envelope lane's platform value, AUTO-DETECTED.
136
+ *
137
+ * The init config's `platform` field was documented as "Default: react_native" — so every
138
+ * integration that did not hand-write `platform: 'ios' | 'android'` stamped the literal
139
+ * `react_native` on all its analytics events, and the dashboard's platform filters (which split
140
+ * ios/android) silently excluded them. Asking the developer for a value the runtime knows is an
141
+ * integration tax with a failure mode; `Platform.OS` answers it exactly.
142
+ *
143
+ * `react_native` remains only for the genuinely-unknown case (RN unloadable, or an OS the wire
144
+ * enum does not carry) — an honest "RN, platform untold" rather than a confident wrong answer.
145
+ */
146
+ function resolveEventPlatform() {
147
+ const os = resolvePlatformOS();
148
+ return os === 'ios' || os === 'android' || os === 'web' ? os : 'react_native';
149
+ }
132
150
  //# sourceMappingURL=device.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_version","require","rnPlatform","Platform","resolvePlatformOS","os","OS","resolveMobileOS","DETECTED_CONTEXT_KEYS","exports","staticDeviceContext","platform","out","sdk_version","SDK_VERSION","platform_os","c","constants","osVersion","Release","Version","String","undefined","os_version","Model","device_model","Manufacturer","manufacturer","Brand","nativeDeviceContext","info","deviceModel","mergeDeviceContext","configured","detected"],"sourceRoot":"../../../../src","sources":["core/context/device.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_version","require","rnPlatform","Platform","resolvePlatformOS","os","OS","resolveMobileOS","DETECTED_CONTEXT_KEYS","exports","staticDeviceContext","platform","out","sdk_version","SDK_VERSION","platform_os","c","constants","osVersion","Release","Version","String","undefined","os_version","Model","device_model","Manufacturer","manufacturer","Brand","nativeDeviceContext","info","deviceModel","mergeDeviceContext","configured","detected","resolveEventPlatform"],"sourceRoot":"../../../../src","sources":["core/context/device.ts"],"mappings":"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","ignoreList":[]}