@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.
- package/android/src/main/java/com/scalebun/rn/ota/BsPatch.kt +182 -0
- package/android/src/main/java/com/scalebun/rn/ota/ScaleBunOtaModule.kt +88 -13
- package/android/src/oldarch/java/com/scalebun/rn/crash/ScaleBunCrashSpec.kt +16 -0
- package/bin/scalebun.js +55 -3
- package/dist/scalebun.full.js +190 -110
- package/dist/scalebun.full.js.map +1 -1
- package/dist/scalebun.slim.js +188 -109
- package/dist/scalebun.slim.js.map +1 -1
- package/ios/Ota/BsPatch.swift +180 -0
- package/ios/Ota/OtaSlotManager.swift +59 -2
- package/ios/Ota/ScaleBunOtaModule.swift +89 -10
- package/lib/commonjs/analytics/EventTracker.js +26 -4
- package/lib/commonjs/analytics/EventTracker.js.map +1 -1
- package/lib/commonjs/analytics/eventLane.js +23 -0
- package/lib/commonjs/analytics/eventLane.js.map +1 -1
- package/lib/commonjs/core/constants/version.js +1 -1
- package/lib/commonjs/core/context/device.js +18 -0
- package/lib/commonjs/core/context/device.js.map +1 -1
- package/lib/commonjs/core/id/installationId.js +55 -0
- package/lib/commonjs/core/id/installationId.js.map +1 -0
- package/lib/commonjs/debug/bootstrap.js +14 -1
- package/lib/commonjs/debug/bootstrap.js.map +1 -1
- package/lib/commonjs/debug/transport.js +2 -1
- package/lib/commonjs/debug/transport.js.map +1 -1
- package/lib/commonjs/features/journey/journeyManager.js +2 -1
- package/lib/commonjs/features/journey/journeyManager.js.map +1 -1
- package/lib/commonjs/features/ota/OtaOrchestrator.js +2 -30
- package/lib/commonjs/features/ota/OtaOrchestrator.js.map +1 -1
- package/lib/commonjs/features/performance/collectors/FrameMetricsCollector.js +27 -3
- package/lib/commonjs/features/performance/collectors/FrameMetricsCollector.js.map +1 -1
- package/lib/commonjs/features/performance/collectors/JsStallCollector.js +20 -1
- package/lib/commonjs/features/performance/collectors/JsStallCollector.js.map +1 -1
- package/lib/commonjs/features/session/BackendSessionAdapter.js +8 -0
- package/lib/commonjs/features/session/BackendSessionAdapter.js.map +1 -1
- package/lib/commonjs/public/ScaleBunFacade.js +10 -2
- package/lib/commonjs/public/ScaleBunFacade.js.map +1 -1
- package/lib/module/analytics/EventTracker.js +26 -4
- package/lib/module/analytics/EventTracker.js.map +1 -1
- package/lib/module/analytics/eventLane.js +22 -0
- package/lib/module/analytics/eventLane.js.map +1 -1
- package/lib/module/core/constants/version.js +1 -1
- package/lib/module/core/context/device.js +17 -0
- package/lib/module/core/context/device.js.map +1 -1
- package/lib/module/core/id/installationId.js +50 -0
- package/lib/module/core/id/installationId.js.map +1 -0
- package/lib/module/debug/bootstrap.js +14 -1
- package/lib/module/debug/bootstrap.js.map +1 -1
- package/lib/module/debug/transport.js +2 -1
- package/lib/module/debug/transport.js.map +1 -1
- package/lib/module/features/journey/journeyManager.js +2 -1
- package/lib/module/features/journey/journeyManager.js.map +1 -1
- package/lib/module/features/ota/OtaOrchestrator.js +1 -29
- package/lib/module/features/ota/OtaOrchestrator.js.map +1 -1
- package/lib/module/features/performance/collectors/FrameMetricsCollector.js +27 -3
- package/lib/module/features/performance/collectors/FrameMetricsCollector.js.map +1 -1
- package/lib/module/features/performance/collectors/JsStallCollector.js +20 -1
- package/lib/module/features/performance/collectors/JsStallCollector.js.map +1 -1
- package/lib/module/features/session/BackendSessionAdapter.js +8 -0
- package/lib/module/features/session/BackendSessionAdapter.js.map +1 -1
- package/lib/module/public/ScaleBunFacade.js +12 -4
- package/lib/module/public/ScaleBunFacade.js.map +1 -1
- package/lib/typescript/analytics/EventTracker.d.ts.map +1 -1
- package/lib/typescript/analytics/eventLane.d.ts +2 -0
- package/lib/typescript/analytics/eventLane.d.ts.map +1 -1
- package/lib/typescript/core/constants/version.d.ts +1 -1
- package/lib/typescript/core/context/device.d.ts +13 -0
- package/lib/typescript/core/context/device.d.ts.map +1 -1
- package/lib/typescript/core/id/installationId.d.ts +20 -0
- package/lib/typescript/core/id/installationId.d.ts.map +1 -0
- package/lib/typescript/debug/bootstrap.d.ts +18 -0
- package/lib/typescript/debug/bootstrap.d.ts.map +1 -1
- package/lib/typescript/debug/transport.d.ts.map +1 -1
- package/lib/typescript/features/journey/journeyManager.d.ts.map +1 -1
- package/lib/typescript/features/ota/OtaOrchestrator.d.ts.map +1 -1
- package/lib/typescript/features/performance/collectors/FrameMetricsCollector.d.ts +14 -0
- package/lib/typescript/features/performance/collectors/FrameMetricsCollector.d.ts.map +1 -1
- package/lib/typescript/features/performance/collectors/JsStallCollector.d.ts +5 -0
- package/lib/typescript/features/performance/collectors/JsStallCollector.d.ts.map +1 -1
- package/lib/typescript/features/session/BackendSessionAdapter.d.ts.map +1 -1
- package/lib/typescript/public/ScaleBunFacade.d.ts.map +1 -1
- package/lib/typescript/public/types.d.ts +1 -1
- package/lib/typescript/public/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/analytics/EventTracker.ts +26 -4
- package/src/analytics/eventLane.ts +22 -0
- package/src/core/constants/version.ts +1 -1
- package/src/core/context/device.ts +17 -0
- package/src/core/id/installationId.ts +52 -0
- package/src/debug/bootstrap.ts +38 -1
- package/src/debug/transport.ts +2 -1
- package/src/features/journey/journeyManager.ts +2 -1
- package/src/features/ota/OtaOrchestrator.ts +1 -30
- package/src/features/performance/collectors/FrameMetricsCollector.ts +32 -3
- package/src/features/performance/collectors/JsStallCollector.ts +20 -1
- package/src/features/session/BackendSessionAdapter.ts +8 -0
- package/src/public/ScaleBunFacade.ts +12 -4
- 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
|
-
///
|
|
125
|
+
/// Binary-patch staging (S7-NAT-1).
|
|
125
126
|
///
|
|
126
|
-
///
|
|
127
|
-
///
|
|
128
|
-
///
|
|
129
|
-
///
|
|
130
|
-
///
|
|
131
|
-
///
|
|
132
|
-
///
|
|
133
|
-
///
|
|
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
|
-
|
|
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:
|
|
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
|
-
//
|
|
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 ??
|
|
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 ??
|
|
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":"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","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":"
|
|
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.
|
|
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":"
|
|
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":";;;;;;;;;;;;AAoBA,IAAAA,QAAA,GAAAC,OAAA;AApBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAgBA,SAASC,UAAUA,CAAA,EAAsB;EACrC,IAAI;IACA,OAAQD,OAAO,CAAC,cAAc,CAAC,CAA+BE,QAAQ,IAAI,IAAI;EAClF,CAAC,CAAC,MAAM;IACJ,OAAO,IAAI;EACf;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,iBAAiBA,CAAA,EAAe;EAC5C,MAAMC,EAAE,GAAGH,UAAU,CAAC,CAAC,EAAEI,EAAE;EAC3B,QAAQD,EAAE;IACN,KAAK,KAAK;IACV,KAAK,SAAS;IACd,KAAK,SAAS;IACd,KAAK,OAAO;IACZ,KAAK,KAAK;MACN,OAAOA,EAAE;IACb;MACI;MACA;MACA,OAAQA,EAAE,IAAmB,SAAS;EAC9C;AACJ;;AAEA;AACA;AACA;AACA;AACO,SAASE,eAAeA,CAAA,EAA6B;EACxD,MAAMF,EAAE,GAAGD,iBAAiB,CAAC,CAAC;EAC9B,OAAOC,EAAE,KAAK,KAAK,IAAIA,EAAE,KAAK,SAAS,GAAGA,EAAE,GAAG,IAAI;AACvD;;AAEA;AACO,MAAMG,qBAAqB,GAAAC,OAAA,CAAAD,qBAAA,GAAG,CACjC,aAAa,EACb,aAAa,EACb,YAAY,EACZ,cAAc,EACd,cAAc,CACR;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASE,mBAAmBA,CAAA,EAA2B;EAC1D,MAAMC,QAAQ,GAAGT,UAAU,CAAC,CAAC;EAC7B,MAAMU,GAA2B,GAAG;IAChCC,WAAW,EAAEC,oBAAW;IACxBC,WAAW,EAAEX,iBAAiB,CAAC;EACnC,CAAC;EACD,IAAI,CAACO,QAAQ,EAAE,OAAOC,GAAG;EAEzB,MAAMI,CAAC,GAAGL,QAAQ,CAACM,SAAS,IAAI,CAAC,CAAC;EAClC;EACA;EACA,MAAMC,SAAS,GAAGF,CAAC,CAACG,OAAO,IAAIH,CAAC,CAACE,SAAS,KAAKP,QAAQ,CAACS,OAAO,IAAI,IAAI,GAAGC,MAAM,CAACV,QAAQ,CAACS,OAAO,CAAC,GAAGE,SAAS,CAAC;EAC/G,IAAIJ,SAAS,EAAEN,GAAG,CAACW,UAAU,GAAGF,MAAM,CAACH,SAAS,CAAC;EACjD,IAAIF,CAAC,CAACQ,KAAK,EAAEZ,GAAG,CAACa,YAAY,GAAGJ,MAAM,CAACL,CAAC,CAACQ,KAAK,CAAC;EAC/C,IAAIR,CAAC,CAACU,YAAY,EAAEd,GAAG,CAACe,YAAY,GAAGN,MAAM,CAACL,CAAC,CAACU,YAAY,CAAC,CAAC,KACzD,IAAIV,CAAC,CAACY,KAAK,EAAEhB,GAAG,CAACe,YAAY,GAAGN,MAAM,CAACL,CAAC,CAACY,KAAK,CAAC;EACpD,OAAOhB,GAAG;AACd;;AAEA;AACO,SAASiB,mBAAmBA,CAACC,IAI5B,EAA0B;EAC9B,MAAMlB,GAA2B,GAAG,CAAC,CAAC;EACtC,IAAI,CAACkB,IAAI,EAAE,OAAOlB,GAAG;EACrB,IAAIkB,IAAI,CAACZ,SAAS,EAAEN,GAAG,CAACW,UAAU,GAAGO,IAAI,CAACZ,SAAS;EACnD,IAAIY,IAAI,CAACC,WAAW,EAAEnB,GAAG,CAACa,YAAY,GAAGK,IAAI,CAACC,WAAW;EACzD,OAAOnB,GAAG;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASoB,kBAAkBA,CAC9BC,UAA+C,EAC/CC,QAAgC,GAAGxB,mBAAmB,CAAC,CAAC,EACjC;EACvB,OAAO;IAAE,IAAIuB,UAAU,IAAI,CAAC,CAAC,CAAC;IAAE,GAAGC;EAAS,CAAC;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,oBAAoBA,CAAA,EAA+C;EAC/E,MAAM9B,EAAE,GAAGD,iBAAiB,CAAC,CAAC;EAC9B,OAAOC,EAAE,KAAK,KAAK,IAAIA,EAAE,KAAK,SAAS,IAAIA,EAAE,KAAK,KAAK,GAAGA,EAAE,GAAG,cAAc;AACjF","ignoreList":[]}
|