feat: initial release of The Pondering Orb
A retro CRT-themed web TV that channel-surfs live HLS streams through a security-hardened, same-origin Rust relay. Front end (vanilla JS + HLS.js, no framework/build step): - SourceProvider abstraction + canonical Channel/Program model so public streams and future self-hosted media share one UI (MockProvider built first to keep the UI provably source-agnostic; IptvOrgProvider for live data) - Red/black phosphor CRT theme, virtualized 1994-style guide (The Almanac), cable-box zapping with 7-segment OSD, scrying-static transitions - Theater/Dim/Ambient immersion modes, dead-stream "orb clouds over" handling - The Lexicon in-world naming with mundane-mode; full a11y + reduced-motion - HLS.js pinned + Subresource-Integrity verified Rust relay (hyper 1.x + tokio-rustls/ring + hickory-resolver): - Serves the SPA and proxies HLS from one origin (no CORS, untainted canvas) - SSRF defense: resolve -> reject private/loopback/link-local/metadata IPs -> connect to the validated IP (no re-resolve, defeats DNS-rebind), fail-closed - HTTPS-only egress, re-validated redirects, manifest URL rewrite, size/ concurrency caps, strict CSP + security headers, path-traversal guard - /metrics observability + structured logs (host only, never raw URLs) Verified: all SSRF probes rejected, CSP clean, real Apple HLS manifest rewritten, ~39k iptv-org channels fetched end-to-end, tests green, zero warnings. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
[package]
|
||||
name = "pondering-orb"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "The Pondering Orb — hardened same-origin static server + HLS relay for a retro CRT web TV."
|
||||
license = "MIT"
|
||||
|
||||
[[bin]]
|
||||
name = "pondering-orb"
|
||||
path = "src/main.rs"
|
||||
|
||||
[dependencies]
|
||||
tokio = { version = "1", features = ["rt-multi-thread", "macros", "net", "io-util", "time", "signal", "sync", "fs"] }
|
||||
hyper = { version = "1", features = ["server", "client", "http1"] }
|
||||
hyper-util = { version = "0.1", features = ["server", "client", "client-legacy", "http1", "tokio"] }
|
||||
http-body-util = "0.1"
|
||||
bytes = "1"
|
||||
# TLS to upstream stream origins (https-only egress).
|
||||
# Use the `ring` provider (pure-ish, no cmake/C toolchain) rather than the
|
||||
# aws-lc-rs default, so the build stays self-contained.
|
||||
rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12", "logging"] }
|
||||
tokio-rustls = { version = "0.26", default-features = false, features = ["ring", "tls12", "logging"] }
|
||||
webpki-roots = "0.26"
|
||||
# DNS resolution so we can validate the *resolved* IP before connecting (SSRF defense)
|
||||
hickory-resolver = "0.24"
|
||||
# robust URL parse + relative-join for manifest rewriting
|
||||
url = "2"
|
||||
|
||||
[profile.release]
|
||||
# reproducible-ish, lean binary (CI-gate task hardens this further)
|
||||
opt-level = "z"
|
||||
lto = true
|
||||
codegen-units = 1
|
||||
strip = true
|
||||
panic = "abort"
|
||||
Reference in New Issue
Block a user