v2 Phase 1: ingestion + SQLite foundation
- Persistence via Node's built-in node:sqlite (zero native deps) on a Docker volume: response cache, source health, fixture↔provider id map, per-fixture enrichment, ingest log. Runtime bumped to node:24-slim + --experimental-sqlite. - Resilient fetcher: DB cache + per-source rate-limit + jittered backoff + circuit-breaker (blocked sources trip + skip; UI reads DB, never breaks). - ESPN hidden API as the PRIMARY rich source (works from the VPS where SofaScore 403s): scoreboard (live scores w/ clock) + summary (venue, H2H, recent form, lineups, team stats). football-data / SofaScore are fallbacks. - Scheduler: maps all 72 group fixtures to ESPN event ids, polls live on a dynamic cadence, enriches imminent fixtures into match_ext. /api/sources/health. - Verified: DB populates (real H2H + form for opening matches), 22 tests pass, Docker image runs node:sqlite on the volume and persists across restart. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+1
-1
@@ -63,7 +63,7 @@ export interface Snapshot {
|
||||
/** When the live layer last refreshed (ISO), or null if seed-only. */
|
||||
updatedAt: string | null;
|
||||
/** Which live source produced the current scores. */
|
||||
source: 'seed' | 'football-data' | 'sofascore';
|
||||
source: 'seed' | 'espn' | 'football-data' | 'sofascore';
|
||||
fixtures: Fixture[];
|
||||
/** Group letter → ranked standings. */
|
||||
tables: Record<string, StandingRow[]>;
|
||||
|
||||
Reference in New Issue
Block a user