373def6d44
Add a streamed-install prototype that can receive archive-derived install bytes straight into local/ without first storing the peer-owned root archive payload. This is intended for low-disk clients that want to install a game but opt out of becoming a downloadable peer source for that game. The protocol gains a current-version-only StreamInstall request and framed StreamInstallFrame responses. The peer core owns the generic transport, transaction, path validation, size checks, CRC32 verification, and lifecycle state. The archive-specific work is hidden behind StreamInstallProvider so the prototype can use unrar while the final implementation can swap in a better provider without rewriting the peer command path. The receiver writes into .local.installing and only promotes to local/ after the full stream verifies. It deliberately does not write the root version.ini or archive files, so the settled local state is installed=true, downloaded=false, and availability=LocalOnly. That preserves the existing rule that local/ is not served to peers and makes streamed receivers non-sources by construction. The CLI is the only caller for now. It exposes stream-install and provides the prototype unrar implementation with unrar lt for entry metadata and unrar p for file bytes. This is simple and good enough to prove non-solid archive streaming, but it is not the production provider shape for solid archives because per-file unrar p would repeatedly decompress prefixes. The Tauri app explicitly passes stream_install_provider: None, so the GUI behavior stays unchanged until a real product path is designed. Document the production-readiness work in NEXT_STEPS.md. The main follow-up is to make the provider abstraction final-ish and replace the per-file CLI unrar provider with a one-pass archive provider, then wire a deliberate GUI low-disk mode, retry semantics, and broader failure scenarios. Test Plan: - just fmt - RUSTC_WRAPPER= CARGO_BUILD_RUSTC_WRAPPER= just test - python3 crates/lanspread-peer-cli/scripts/run_extended_scenarios.py \ S39 S40 --build-image - RUSTC_WRAPPER= CARGO_BUILD_RUSTC_WRAPPER= just clippy - git diff --check - git diff --cached --check Follow-up: NEXT_STEPS.md
79 lines
1.7 KiB
TOML
79 lines
1.7 KiB
TOML
[workspace]
|
|
resolver = "3"
|
|
members = [
|
|
"crates/lanspread-compat",
|
|
"crates/lanspread-db",
|
|
"crates/lanspread-mdns",
|
|
"crates/lanspread-peer",
|
|
"crates/lanspread-peer-cli",
|
|
"crates/lanspread-proto",
|
|
"crates/lanspread-tauri-deno-ts/src-tauri",
|
|
"crates/lanspread-utils",
|
|
]
|
|
|
|
[workspace.dependencies]
|
|
base64 = "0.22"
|
|
bytes = { version = "1", features = ["serde"] }
|
|
crc32fast = "1"
|
|
eyre = "0.6"
|
|
futures = "0.3"
|
|
gethostname = "1"
|
|
if-addrs = "0.15"
|
|
log = "0.4"
|
|
mdns-sd = "0.20"
|
|
mimalloc = { version = "0.1", features = ["secure"] }
|
|
notify = "8"
|
|
s2n-quic = { version = "1", features = ["provider-event-tracing"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
sqlx = {
|
|
version = "0.9",
|
|
default-features = false,
|
|
features = [
|
|
"derive",
|
|
"runtime-tokio",
|
|
"sqlite",
|
|
]
|
|
}
|
|
strum = { version = "0.28", features = ["derive"] }
|
|
tauri = { version = "2", features = [] }
|
|
tauri-plugin-dialog = "2"
|
|
tauri-plugin-shell = "2"
|
|
tauri-plugin-store = "2"
|
|
time = { version = "0.3", features = ["local-offset"] }
|
|
tokio = { version = "1", features = ["full"] }
|
|
tokio-util = { version = "0.7", features = ["codec", "rt"] }
|
|
tracing = "0.1"
|
|
tracing-log = "0.2"
|
|
tracing-subscriber = "0.3"
|
|
uuid = { version = "1", features = ["v7"] }
|
|
walkdir = "2"
|
|
windows = {
|
|
version = "0.62",
|
|
features = [
|
|
"Win32",
|
|
"Win32_UI",
|
|
"Win32_UI_Shell",
|
|
"Win32_UI_WindowsAndMessaging",
|
|
]
|
|
}
|
|
|
|
[profile.release]
|
|
debug = true
|
|
strip = false
|
|
debug-assertions = true
|
|
overflow-checks = true
|
|
lto = false
|
|
panic = "unwind"
|
|
incremental = true
|
|
|
|
[profile.production]
|
|
inherits = "release"
|
|
debug = false
|
|
strip = true
|
|
debug-assertions = false
|
|
overflow-checks = false
|
|
lto = true
|
|
incremental = false
|
|
codegen-units = 1
|