[package] name = "punktfunk-core" description = "punktfunk shared protocol/transport/FEC core, exposed over a stable C ABI" version.workspace = true edition.workspace = true rust-version.workspace = true license.workspace = true authors.workspace = true repository.workspace = true [lib] name = "punktfunk_core" # `lib` — so punktfunk-host / punktfunk-client-rs / tools link it as a normal Rust crate. # `staticlib` — `libpunktfunk_core.a` for the C test harness and static embedding. # `cdylib` — `libpunktfunk_core.{so,dylib}` for Swift/Kotlin clients via the C ABI. crate-type = ["lib", "cdylib", "staticlib"] [features] default = [] # Control-plane QUIC (pairing, config, reverse audio). tokio is permitted ONLY here, # never on the per-frame hot path. Off by default so the core stays runtime-free. quic = ["dep:quinn", "dep:tokio", "dep:rustls", "dep:rcgen", "dep:rustls-pki-types", "dep:sha2", "dep:hmac", "dep:spake2"] [dependencies] reed-solomon-simd = "3.1" # GF(2^16) Leopard-RS, SIMD, O(n log n) — the wall-breaker (P2) # Vendored fork of fec-rs: GF(2^8) classic RS with the *Cauchy* generator matrix # (M[j][i] = inv[(m+i)^j]) — byte-identical to the `nanors` library Moonlight uses, so our # parity is decodable by a stock Moonlight client. (reed-solomon-erasure is Vandermonde and is # NOT interoperable.) See vendor/fec-rs/LICENSE (BSD-2-Clause). fec-rs = { path = "vendor/fec-rs" } aes-gcm = "0.10" # AES-128-GCM session crypto, matches GameStream zerocopy = { version = "0.8", features = ["derive"] } bytes = "1" socket2 = "0.6" # set SO_SNDBUF/SO_RCVBUF — default UDP buffers are too small for 4K/5K frame bursts thiserror = "2" tracing = { version = "0.1", default-features = false, features = ["std"] } rand = "0.9" zeroize = "1" quinn = { version = "0.11", optional = true } rustls = { version = "0.23", optional = true, default-features = false, features = ["ring", "std"] } rcgen = { version = "0.13", optional = true, default-features = false, features = ["aws_lc_rs", "pem"] } rustls-pki-types = { version = "1", optional = true } sha2 = { version = "0.10", optional = true } hmac = { version = "0.12", optional = true } spake2 = { version = "0.4", optional = true } tokio = { version = "1", optional = true, features = ["rt-multi-thread", "net", "sync", "macros"] } # `libc` for batched UDP syscalls: `sendmmsg`/`recvmmsg` on Linux (the 1 Gbps+ lever) and the # `recv(MSG_DONTWAIT)` drain on the other unix (Apple/BSD) targets, which have no `recvmmsg` # (see transport/udp.rs `recv_batch`). Needed on every unix target — non-unix (Windows) uses # the scalar fallbacks. Cross-compiles (iOS/tvOS) don't pull libc transitively the way the # macOS host build does, so it must be a direct dep here or those slices fail to link `libc::`. [target.'cfg(unix)'.dependencies] libc = "0.2" [dev-dependencies] proptest = "1" [build-dependencies] cbindgen = "0.29"