d87397b382
Test / test (pull_request) Successful in 10m15s
Phase 1+2 of the theme-store roadmap: a free catalog served by
solitaire_server and an in-app browse/install flow, making custom
themes installable on Android for the first time (the manual
drop-a-zip flow can't reach the app-private themes dir there).
- solitaire_sync: ThemeCatalogEntry/ThemeCatalogResponse wire types
(additive module; SyncPayload and SyncProvider untouched)
- solitaire_server: THEME_STORE_DIR scan at startup (meta-only
theme.ron parse, sha256, 20 MiB cap, best-effort per archive);
public GET /api/themes, /api/themes/{id}/download, /{id}/preview;
compose volume + README_SERVER docs
- solitaire_data: ThemeStoreClient — catalog fetch + download with
mandatory size/sha256 verification before bytes are released
- solitaire_engine: ThemeStorePlugin — 'Browse theme store' button in
Settings → Cosmetic, modal catalog (leaderboard-style rebuild),
download on AsyncComputeTaskPool, atomic .tmp+rename write into
user_theme_dir, then the existing hardened import_theme pipeline and
an in-place registry refresh
New deps: sha2 (workspace, server+data); ron/zip reused in server;
serde_json added to solitaire_sync dev-deps for DTO round-trip tests.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
60 lines
2.3 KiB
TOML
60 lines
2.3 KiB
TOML
[package]
|
|
name = "solitaire_data"
|
|
version.workspace = true
|
|
license.workspace = true
|
|
edition.workspace = true
|
|
|
|
[dependencies]
|
|
solitaire_core = { workspace = true }
|
|
solitaire_sync = { workspace = true }
|
|
klondike = { workspace = true }
|
|
card_game = { workspace = true }
|
|
serde = { workspace = true }
|
|
serde_json = { workspace = true }
|
|
chrono = { workspace = true }
|
|
thiserror = { workspace = true }
|
|
async-trait = { workspace = true }
|
|
uuid = { workspace = true }
|
|
|
|
# These deps are not available / not needed on wasm32:
|
|
# dirs — platform data directories (no filesystem on browser)
|
|
# reqwest — native HTTP client (sync/analytics gated out on wasm32)
|
|
# tokio — OS-threaded async runtime (mio doesn't compile on wasm32)
|
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
|
dirs = { workspace = true }
|
|
reqwest = { workspace = true }
|
|
tokio = { workspace = true }
|
|
# Theme-store downloads are verified against the catalog's SHA-256
|
|
# before the archive is handed to the engine's theme importer.
|
|
sha2 = { workspace = true }
|
|
|
|
# `keyring-core` is the typed Entry/Error API used by
|
|
# `auth_tokens`. The crate's own dependency tree pulls in
|
|
# `rpassword` which uses `libc::__errno_location` — a symbol the
|
|
# Android NDK doesn't expose (`__errno` lives at a different path
|
|
# on bionic). On Android `auth_tokens` falls back to a stub
|
|
# implementation that always returns `KeychainUnavailable`; the
|
|
# real backend lands when we wire Android Keystore via JNI.
|
|
[target.'cfg(all(not(target_os = "android"), not(target_arch = "wasm32")))'.dependencies]
|
|
keyring-core = { workspace = true }
|
|
|
|
[target.'cfg(target_os = "android")'.dependencies]
|
|
jni = { workspace = true }
|
|
|
|
[dev-dependencies]
|
|
solitaire_core = { workspace = true, features = ["test-support"] }
|
|
solitaire_server = { path = "../solitaire_server" }
|
|
solitaire_sync = { workspace = true }
|
|
axum = { workspace = true }
|
|
sqlx = { workspace = true }
|
|
jsonwebtoken = { workspace = true }
|
|
uuid = { workspace = true }
|
|
chrono = { workspace = true }
|
|
# theme_store_round_trip builds a theme zip in a tempdir for the
|
|
# in-process store server.
|
|
zip = { workspace = true }
|
|
tempfile = { workspace = true }
|
|
|
|
[lints]
|
|
workspace = true
|