Files
fuelboard/FuelBoard/BundledDumpProvider.swift
T
FuelBoard Contributor 366e21a1b4 P0: live provider chain — GitHub mirror primary, relay fallback, bundled dump last resort + app telemetry beacon
- MirrorFuelProvider: fetches CURRENT prices from raw.githubusercontent
  (latest.json pointer → history/<day>.json full dump), app-group day-cache
  so the ~2.8 MB dump is re-downloaded only when the mirror pushes a new day
- LiveChainProvider: full path (app refresh) GitHub → relay; focused path
  (background alert checks) relay-first so alerts never pull the full dump
  over mobile data; records which leg served for About + telemetry
- FuelBeacon: fire-and-forget X-Client app ping to the relay's existing
  widget-diag route (zero relay changes) — attribution + cadence on-LAN,
  silent skip off-LAN is the reachability datum; /stats app-hit spike =
  GitHub path failing
- Bundled dump: FuelBoardDump dataset (real 2026-08-15 snapshot, 8,022
  stations) + BundledDumpProvider + scripts/refresh_bundled_dump.sh —
  no-network last resort replaces the demo sample set
- ContentView: About meta from the chain; catch falls back cached → bundled
  → sample
- 89 tests (6 new: chain order x4, cache decision, beacon URL); Release
  build green; beacon route verified against the live relay (204 + logged)
2026-08-15 13:00:24 +01:00

19 lines
815 B
Swift

// BundledDumpProvider.swift — no-network last resort (P0 live chain).
//
// A REAL snapshot of the mirror dump is bundled into the app (FuelBoardDump
// dataset, refreshed before builds by scripts/refresh_bundled_dump.sh) so the
// app never demos empty and App Review always sees real data even fully
// offline. Same relay envelope, so the shared decode applies unchanged.
import UIKit
enum BundledDumpProvider {
/// The bundled real snapshot, decoded with the shared relay decode —
/// nil only if the asset is missing or corrupt (callers then fall back
/// to the England-wide sample set).
static var stations: [FuelStation]? {
guard let asset = NSDataAsset(name: "FuelBoardDump") else { return nil }
return try? FuelPriceProvider.decodeStations(from: asset.data)
}
}