ENbext.dev
DocumentationArchitecture

Traduction automatique depuis l’anglais. Consulter l’original.

Sur cette page

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#

code
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).

code
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 :

toml
[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.

Conseil

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#

Modifier cette page ↗Besoin d’aide ? ↗
Rechercher dans la documentation

Saisissez un sujet, une commande ou une question.