Présentation de l'architecture
bext est un espace de travail Rust avec environ 38 caisses organisées de manière à ce que chaque caisse ait une seule responsabilité, et des fonctionnalités Cargo en option gèrent des dépendances lourdes telles que V8, wasmtime, Quinn (QUIC) et libphp. La version des fonctionnalités par défaut relie V8 + le bundle bext - turbopack ; tout le reste est limité aux fonctionnalités.
Structure de l'espace de travail#
bext/
Cargo.toml # Workspace root
crates/
# ── Server + core ────────────────────────────────────────
bext-server/ # Main binary — actix-web HTTP server, masquerade router, vhost
bext-core/ # Shared logic: SSR types, caching, source transforms, route discovery, framework registry. Houses `transform/prism_compile.rs` (the build-time JSX fold pass).
bext-impls/ # Trait impls glue between bext-core and the optional crates
bext-license/ # Ed25519 offline license key validation
bext-keygen/ # License key generation utility (binary)
# ── PRISM / framework pipeline ───────────────────────────
bext-turbopack/ # Direct API around utoo/Turbopack — JSX → JS bundle compilation, file watcher, registry, transitive-closure walker. Owns the prism_compile call sites.
bext-v8/ # rusty_v8 SSR isolate. Eval thread, page-context cache, streaming pump.
bext-react-compiler/ # SWC-based React-Compiler integration (auto-memo + SSR pure-fn lowering)
bext-css/ # Rust Tailwind v4 engine (utility scanner, JIT class generator)
bext-import/ # AST-aware "use server" / "use client" directive scanner
bext-proxy/ # HTTP proxy pool (upstream pools, retry, health checks)
# ── Plugins ──────────────────────────────────────────────
bext-plugin/ # NAPI addon for Bun (native plugin mode)
bext-plugin-api/ # Trait definitions + shared types (no heavy deps; WASM guest-safe)
bext-plugin-wasm/ # wasmtime sandbox for WASM plugins
bext-plugin-v8/ # V8 isolate sandbox (sibling to bext-v8; runs untrusted plugin JS)
bext-plugin-quickjs/ # rquickjs sandbox for trusted JS plugins
bext-plugin-lua/ # mlua sandbox for Lua plugins
bext-plugin-nsjail/ # Process-level sandbox with JSON-over-stdio IPC
# ── Networking + protocols ───────────────────────────────
bext-tls/ # ACME provisioning, SNI resolution, OCSP stapling
bext-realtime/ # SSE + WebSocket pub/sub hub with Redis relay
bext-waf/ # Web Application Firewall (IP, geo, rules, DDoS)
bext-ebpf/ # eBPF acceleration: XDP, uprobes, seccomp-bpf
bext-php/ # Embedded PHP SAPI via FFI (FrankenPHP-style)
bext-protocol-mqtt/ # MQTT pub/sub broker
bext-protocol-grpc/ # gRPC server (codegen + dispatcher)
bext-protocol-caldav/ # CalDAV / CardDAV server
# ── nginx compat ─────────────────────────────────────────
bext-nginx-compat/ # nginx.conf parser → bext config converter
bext-nginx-shim/ # Drop-in nginx binary replacement (binary)
# ── Framework adapters ───────────────────────────────────
bext-framework-astro/ # Astro adapter (SSR + islands)
bext-framework-qwik/ # Qwik adapter
bext-framework-solidstart/ # SolidStart adapter
bext-framework-sveltekit/ # SvelteKit adapter
# ── Tooling / DX ─────────────────────────────────────────
bext-dx/ # Developer-experience: dev banner, file-watcher CLI
bext-tui/ # Terminal UI for live deploy / log streaming
bext-lsp/ # Language Server (completions, hovers, diagnostics)
bext-bench-history/ # Perf-history database used by the benchmark dashboard
harnesses/
conformance/ # Next.js conformance test suite
ecosystem/ # Third-party framework integration tests
security/ # Fuzzing and penetration test harness
jsx-shootout/ # 5-engine SSR throughput bench (PRISM, Marko, Solid, React, Rust)
plugin-harness/ # Plugin sandbox conformance tests
cache-bench/ # ISR cache benchmark
ssr-dev/ # PRISM SSR dev-server harness against ~/dev/apps/app
sites/ # Self-contained PRISM fixture sites used by integration tests
companion/ # Desktop companion app (Tauri)
packages/ # NPM-published packages (@bext-stack/*, @bext/*)
sites/ # First-party PRISM sites (docs, status, prism-demo, etc.)
Graphique de dépendance (haut niveau)#
bext-server est la racine qui récupère tout ; bext-plugin-api est la feuille sans dépendances bext (les caisses invitées WASM peuvent donc en dépendre sans glisser dans actix-web ou V8).
bext-server
|-- bext-core (always — types, transforms, route discovery)
|-- bext-impls (always — trait glue)
|-- bext-turbopack (default — JSX/TSX → JS bundle pipeline)
|-- bext-v8 (default `v8` feature — SSR isolate)
|-- bext-react-compiler (optional `react-compiler` — SWC integration)
|-- bext-css (optional `route-css` — Tailwind JIT)
|-- bext-proxy (always — upstream pools)
|-- bext-plugin-{api,wasm,v8,quickjs,lua,nsjail} (optional `plugins`)
|-- bext-tls (optional `tls`)
|-- bext-realtime (optional `realtime`)
|-- bext-waf (optional `waf`)
|-- bext-ebpf (optional `ebpf`)
|-- bext-php (optional `php`)
|-- bext-protocol-{mqtt,grpc,caldav} (optional)
|-- bext-nginx-compat (optional `nginx-compat` — masquerade routing)
|-- bext-license (always)
Le framework PRISM appartient à bext -core (la passe de compilation) et bext - turbopack (les sites d'appel + intégration du bundler). L'interface TypeScript /TSX - analyse et émission - est le compilateur externe tsc-rs (consommé en tant que caisses de dépendance git plus un sous-processus tsc-rs --pipe). Le runtime dans lequel la sortie compilée appelle se trouve en dehors de l'espace de travail Rust, dans sites/shared/framework/ ( TypeScript, publié sous le nom
@bext-stack/framework).
Pour savoir comment ces pièces s'assemblent sur une seule demande, consultez le Pipeline de rendu PRISM ; pour le pool d'isolation qui exécute la sortie, consultez le Piscine de rendu V8.
bext-plugin-api est délibérément léger (uniquement serde et
serde_json ) afin que les caisses invitées WASM puissent en dépendre sans avoir recours à bext -core ou actix-web.
Indicateurs de fonctionnalités#
Le serveur bext utilise les indicateurs de fonctionnalité Cargo pour conserver le binaire léger. Les valeurs par défaut de Cargo sont ["v8", "route-css"] ; le bundle Turbopack dont PRISM a besoin pour compiler les routes .tsx est activé par build (il se trouve dans la fonctionnalité de production activ-2 définie ci-dessous), et non par défaut. Tout le reste est opt-in :
| Fonctionnalité | Caisses activées | Défaut |
|---|---|---|
v8 |
bext -v8 (isolat rusty_v8, SSR) | sur |
route-css |
bext -css (Rust Tailwind v4) | sur |
turbopack |
bext - turbopack (bundle JSX → JS, passe de compilation PRISM) | sur (par build) |
react-compiler |
bext - react -compilateur (SWC + Compilateur React) | sur (par build) |
plugins |
bext -plugin-api, bext -plugin-wasm, bext -plugin-v8, bext -plugin-quickjs, bext -plugin-lua, bext -plugin-nsjail | désactivé |
tls |
bext -tls (ACME, SNI, OCSP) | désactivé |
realtime |
bext -temps réel (pub-sub SSE/WS) | désactivé |
waf |
bext -waf | désactivé |
redis |
Caisse redis | désactivé |
h3-quic |
quinn, h3, h3-quinn | désactivé |
otel |
opentelemetry, traçage- opentelemetry | désactivé |
ebpf |
bext -ebpf | désactivé |
php |
bext -php | désactivé |
nginx-compat |
bext - nginx -compat (routeur vhost mascarade) | désactivé |
websocket-proxy |
tokio-tungsténite | désactivé |
Une version minimale ( --no-default-features ) se compile en 45 secondes environ sur un MacBook Pro M2. La version de production complète ( v8 + turbopack + route-css + react-compiler + nginx-compat + tls + redis + realtime + waf + php + h3-quic ) prend environ 5 minutes à froid et environ 30 secondes à chaud.
Créer des profils#
L'espace de travail utilise des optimisations de versions agressives :
[profile.release]
opt-level = 3
lto = "fat"
codegen-units = 1
strip = true
Cela produit un seul binaire lié statiquement (avec musl sous Linux) qui fait généralement 15 à 25 Mo en fonction des fonctionnalités activées. Le paramètre strip = true supprime les symboles de débogage du binaire de la version.
Une version minimale ( --no-default-features ) omet V8, Turbopack et le moteur Tailwind – utile pour les déploiements proxy uniquement ou PHP uniquement où vous n'avez pas besoin de SSR. Voir Indicateurs de construction et de fonctionnalités pour connaître l'ensemble des fonctionnalités de production recommandées.
Principes de conception de base#
Binaire unique. Tout est livré sous la forme d'un seul exécutable. Aucun processus side-car, aucune dépendance d'exécution (sauf éventuellement PHP et Redis ).
Compilation fermée par fonctionnalités. Vous ne payez que ce que vous utilisez. Un serveur qui n'a pas besoin de plugins WASM ne lie jamais wasmtime.
Zéro copie si possible. Le cache ISR, le cache de compression et le pool SSR transmettent Arc<Vec<u8>> au lieu de cloner les corps de réponse. Le pipeline de transformation utilise Cow<str> pour éviter l'allocation lorsqu'aucune transformation ne s'applique.
Sécurité au moment de la compilation. Les caractéristiques du plug-in ( LifecyclePlugin, MiddlewarePlugin, TransformPlugin ) sont définies dans bext-plugin-api et appliquées au moment de la compilation. La limite WASM utilise JSON-over-ABI pour plus de flexibilité.
Dégradation gracieuse. Chaque sous-système facultatif (eBPF, TLS, WAF, hub temps réel) se dégrade progressivement lorsqu'il n'est pas disponible. Les fonctionnalités d'eBPF vérifient les capacités du noyau au démarrage et reviennent aux chemins de l'espace utilisateur.
Dépendances externes clés#
| Dépendance | But |
|---|---|
| actix-web 4 | Serveur HTTP/1.1 et HTTP/2 |
| rouillé_v8 | Moteur V8 pour le rendu SSR |
| tsc-rs | Compilateur Rust TypeScript — Analyse TS/TSX, AST et émission pour le pipeline PRISM |
| rquickjs | Intégration QuickJS pour le bac à sable du plugin |
| c'était l'heure | Exécution du plugin WASM |
| quinn + h3 | Transport HTTP/3 (QUIC) |
| bruissements 0,23 | TLS 1.2/1.3 avec crypto en anneau |
| SQLX 0.8 | PostgreSQL pour le mode autonome |
| tableau de bord 6 | Cartes de hachage simultanées pour les caches |
| aho-corasick | Correspondance de chaînes multi-modèles pour les transformations |
Pour la liste complète des caisses et de leurs rôles, voir Référence de caisse.
En rapport#
- Pipeline de rendu PRISM — suivi des requêtes de bout en bout via le chemin de compilation et de rendu PRISM
- Piscine de rendu V8 — topologie du pool, planification et post-mortem du gel du 10/06/2026
- Frontend TypeScript (tsc-rs) — le compilateur Rust TS derrière le pipeline PRISM
- Transformer le pipeline — chaque transformation de source et de réponse, dans l'ordre
- Référence de caisse — listes de modules par caisse et matrice d'indicateurs de fonctionnalités
- Cycle de vie des demandes — comment une seule requête HTTP circule à travers tous les sous-systèmes