[package]
name = "monetize-ui-server"
description = "BFF for the operator console: passkey sessions, REST/SSE toward the browser, bearer gRPC toward monetize-server"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
repository.workspace = true
license.workspace = true
authors.workspace = true
publish.workspace = true
[[bin]]
name = "monetize-ui-server"
path = "src/main.rs"
[dependencies]
monetize-proto = { path = "../monetize-proto" }
# The VERIFY half, and only that: the canonical form a fact's signature covers
# lives in exactly one place, and the console links the same crate a product
# does rather than re-deriving it. No redb, no vendors — monetize-embed is the
# leaf built for callers that must check a signature without being monetize.
monetize-embed = { path = "../monetize-embed" }
# `monetize_product::bytes` — the ONE byte formatter (see its doc). Already in
# the tree under monetize-embed; named here because this crate calls it.
monetize-product = { path = "../monetize-product" }
tonic.workspace = true
prost.workspace = true
axum.workspace = true
tokio = { workspace = true, features = ["net", "signal"] }
tokio-stream = { version = "0.1", features = ["sync"] }
futures-util = "0.3"
# RA3-1: the console's fleet is kept by a jera job, not by its pages.
jera = { version = "0.2.1", default-features = false }
# `fs` serves the trunk bundle; the two compression features are pure Rust
# (flate2's rust backend, the brotli crate) — the same choice gunnar-ui made.
tower-http = { version = "0.7", features = ["fs", "compression-gzip", "compression-br"] }
tower = { version = "0.5", features = ["util"] }
http = "1"
serde.workspace = true
serde_json.workspace = true
anyhow.workspace = true
# The passkey ceremony, ported from gunnar-ui-server: pure RustCrypto, ES256
# only, no openssl. (edda's nornir-auth-webauthn gates its real path behind
# webauthn-rs + openssl and fails closed without it, so it is not the reuse here.)
# The ceremony is NOT written here any more. nornir-auth-webauthn 0.1.2
# (edda, crates.io, 2026-09-20) carries the one implementation this console,
# holger-ui and gunnar-ui all used to carry a copy of. default-features = false
# + webauthn-pure keeps it pure RustCrypto on p256 0.13 with no openssl.
nornir-auth-webauthn = { version = "0.1.2", default-features = false, features = [
"webauthn-pure",
] }
p256 = { version = "0.14", features = ["ecdsa"] }
sha2 = "0.11"
ciborium = "0.2"
base64 = "0.23"
blake3 = "1"
uuid = { version = "1", features = ["v4"] }
redb.workspace = true
# Every service in the suite goes through skidbladnir.
skidbladnir.workspace = true
# The suite's bearer ladder (`flag > $MONETIZE_SERVER_TOKEN > file`), reused as-is.
nornir-service = { version = "0.1.9" }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
[dev-dependencies]
tempfile = "3"
# The mock monetize has to SIGN, so a corrupted signature is corrupted relative
# to a real one. Signing lives in `monetize` core, which drags redb and the
# vendors into a BFF test; the key itself is thirty lines lighter.
ed25519-dalek.workspace = true
rand.workspace = true
tower = { version = "0.5", features = ["util"] }
http-body-util = "0.1"
# The pinned-control test mints the ONE monetize's certificate (pure Rust).
rcgen = "0.14"
# `tests/accounts.rs` draws the Accounts screens from this server's answers
# with the console's own cells (`monetize_ui_web::accounts`, host-compiled).
monetize-ui-web = { path = "../monetize-ui-web" }