Key changes: - **src/config.rs** – `LiveVueConfig` (server host/port, brotli quality + window size), loaded from `livevue.toml`. A notify-based file watcher reloads the config on any file change; a SIGHUP handler does the same on demand. Falls back to compiled-in defaults when the file is absent. - **src/brotli_layer.rs** – `BrotliBody`, a custom `http_body::Body` wrapper that streams brotli-compressed data through a single persistent `brotli::CompressorWriter`. The encoder survives across SSE event flushes, so its sliding window accumulates context from all prior events — progressively better compression as the stream grows. Both quality (0–11) and window size (lgwin 10–24, i.e. 1 KB – 16 MB) are taken from config. `brotli_compression` is an axum `from_fn_with_state` middleware that activates only when the client sends `Accept-Encoding: br`. - **src/server.rs** – `AppState` gains a `config: SharedConfig` field. `AppState::new` takes the config; `AppState::new_default` is a zero-config convenience constructor. - **livevue.toml** – documented example config with inline comments explaining each field and the brotli window-size tradeoff table. - **examples/todo** – loads config via `load_and_watch_config`, derives the bind address from `config.server`, and applies `brotli_compression` as a router layer. https://claude.ai/code/session_01UnQQkkwts64FPUsSzFfdQb
51 lines
1.5 KiB
TOML
51 lines
1.5 KiB
TOML
[package]
|
|
name = "livevue-rs"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
|
|
# Run the todo example with: cargo run --example todo
|
|
# Run the pg_replication example with: cargo run --example pg_replication --features pg_replication
|
|
|
|
[features]
|
|
# Opt-in feature: PostgreSQL logical replication for reactive cache invalidation.
|
|
# Adds tokio-postgres and bytes as dependencies.
|
|
pg_replication = ["dep:tokio-postgres", "dep:postgres-protocol"]
|
|
|
|
[dependencies]
|
|
axum = { version = "0.7", features = ["macros"] }
|
|
tokio = { version = "1", features = ["full"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
sqlx = { version = "0.8", features = ["runtime-tokio", "sqlite", "postgres"] }
|
|
maud = { version = "0.26", features = ["axum"] }
|
|
uuid = { version = "1", features = ["v4", "serde"] }
|
|
dashmap = "6"
|
|
anyhow = "1"
|
|
tokio-stream = "0.1"
|
|
tracing = "0.1.44"
|
|
futures = "0.3.32"
|
|
|
|
# Config file parsing
|
|
toml = "0.8"
|
|
|
|
# Brotli streaming compression (configurable window size + quality)
|
|
brotli = "6"
|
|
pin-project = "1"
|
|
bytes = "1"
|
|
http-body = "1"
|
|
|
|
# Config file watching (inotify on Linux, kqueue on macOS, FSEvents on macOS)
|
|
notify = "6"
|
|
|
|
# Optional: PostgreSQL logical replication
|
|
tokio-postgres = { version = "0.7", optional = true }
|
|
postgres-protocol = { version = "0.6", optional = true }
|
|
|
|
[dev-dependencies]
|
|
chrono = { version = "0.4", features = ["clock"] }
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|
|
|
[[example]]
|
|
name = "pg_replication"
|
|
path = "examples/pg_replication/main.rs"
|
|
required-features = ["pg_replication"] |