Documentación

DOC / 14 / RUNTIME

Preview del runtime nativo

Instala el preview público del router y runtime G1, y evalúa HTTP/2, layouts controlados por rutas, lifecycle limitado y tres modos SSR.

En esta guíaPreview del runtime nativo
Primeros pasosEstructura del proyectoReferencia del CLIBucle de desarrolloBuilds incrementalesRouting y páginasVistas RustEventos y foldsSchemas y snapshotsSync verificado con HyphaeContenido tipadoRuntime del navegadorPropiedad del DOMPreview del runtime nativoDespliegue portableBeta full-stackPreview de OpenSDKComponentes y lenguajesConformidad de frameworks webProtocolo de toolingCompatibilidad y deprecaciónAssets adaptativosConfianza de artefactosConfianza de releasesEvidencia de rendimientoErrores y diagnósticosTelemetría voluntariaBuild y despliegueCrates y APILicenciamiento y políticas

Instala la beta pública G1

pliego-router y pliego-runtime 0.4.0-beta.1 son públicos en crates.io y G1 está completo. Fija ambas versiones exactas con la misma versión del CLI y de cada crate PliegoRS.

toml
[dependencies]
pliego-router = "=0.4.0-beta.1"
pliego-runtime = "=0.4.0-beta.1"

Mantén explícita la propiedad del transporte y del framework

El router portable sella gramática de rutas, parámetros, scopes de group y layout, capabilities de middleware, identidad de error boundaries, colisiones y un digest determinista del grafo. El runtime controla admisión de conexiones y requests, deadlines, cancelación, cleanup, commitment, conteo de bytes, diagnósticos, recibos y señales de finalización limitadas.

Hyper
Único propietario del parser y framing de protocolo HTTP/1.1 y HTTP/2
Axum / Tower
Composición del servicio HTTP e interoperabilidad explícita
Tokio
Ejecución de sockets, timers, wakeups de cancelación y scheduling de tareas
PliegoRS
Política limitada de conexiones, semántica sellada de aplicación, reglas de fallo, cleanup y evidencia

Limita la red antes del código de aplicación

TransportLimits limita conexiones TCP activas, el deadline absoluto del head HTTP/1, inactividad de lectura y escritura, streams HTTP/2 del peer, ventanas de flow control y buffers de envío por stream. RequestLimits aplica presupuestos de headers y body a ambas versiones. Cada política tiene un digest determinista.

rust
use pliego_runtime::{NativeRuntimeBuilder, TransportLimits};

let transport = TransportLimits {
    max_connections: 512,
    http2_max_concurrent_streams: 64,
    ..TransportLimits::default()
};
let runtime = NativeRuntimeBuilder::new(graph, "edge-a")?
    .transport_limits(transport)?
    .build()?;
Overload
Las conexiones excedentes cierran antes del parseo; los requests excedentes reciben un 503 limitado
Slow peers
Deadlines absolutos del head y de inactividad de lectura/escritura liberan sockets de forma determinista
Body formats
PLG-RUN-110 rechaza framing conflictivo con 400. La ruta genérica del G1 publicado rechaza bodies encoded o multipart; main agrega presupuestos G2 de decoding y partes solo para actions.
Shutdown
El trabajo nuevo se detiene, los scopes se cancelan, las conexiones drenan y las tareas restantes abortan solo tras el deadline

Elige un modo SSR explícito

Complete renderiza una respuesta limitada antes del commitment. Ordered transmite factories hermanas bajo backpressure. Boundary inicia de forma concurrente un conjunto limitado de futures, emite un anchor template data-pliego-boundary inerte y estable, y entrega HTML útil resuelto en orden de declaración sin un runtime JavaScript de parches.

rust
use pliego_dom::{IntoView, el};
use pliego_runtime::{
    AsyncBoundary, BoundaryDocument, BoundaryRenderOptions,
    render_boundary_document,
};

let document = BoundaryDocument::new("Account");
let boundaries = [
    AsyncBoundary::map("heading", async { "Account" }, |title| {
        el("h1").child(title).into_view()
    })?,
];
let response = render_boundary_document(
    &document,
    boundaries,
    BoundaryRenderOptions::default(),
)?;

Vincula el documento con el layout controlado por su ruta

Un match sellado expone por separado la cadena completa de scopes group/layout y la cadena exclusiva de layouts. LayoutDocument exige un LayoutLayer por cada layout del match y los compone de raíz a hoja. Las operaciones tipadas before, after y wrap transforman un único frame hijo privado, por lo que el código de aplicación no puede omitirlo ni duplicarlo. Ningún string HTML se parsea o reemplaza.

rust
use pliego_dom::{IntoView, el};
use pliego_runtime::{
    DocumentHead, LayoutDocument, LayoutLayer,
    render_layout_document,
};

let shell = LayoutLayer::new("guide-layout")?
    .before(el("nav").child("Guide"))
    .wrap(el("div").class("guide-shell"))
    .head(DocumentHead::new().stylesheet("/assets/guide.css"));

let document = LayoutDocument::new(
    context.route(),
    el("main").child("Reference").into_view(),
)
.layout(shell)?
.title("Reference");

let response = render_layout_document(
    &document,
    CompleteRenderOptions::default(),
)?;
Ownership
Layouts ausentes, duplicados o ajenos fallan antes del commitment de la respuesta
Child frame
Las operaciones tipadas preservan exactamente un hijo privado por construcción
Head
Los campos escalares internos y de página prevalecen; los assets conservan orden estable y duplicados exactos se emiten una vez
Streams
LayoutStreamDocument valida un slot interno y comparte un presupuesto de bytes para shell y contenido
Receipt
renderMode layout registra routeScopes y routeLayouts

Conecta OpenTelemetry controlado por el operador

El runtime no emite telemetría de requests hasta que el operador configura providers globales de OpenTelemetry y llama open_telemetry. PliegoRS no instala exporter, endpoint, credencial ni collector. Los spans SERVER habilitados permanecen abiertos hasta el último frame del body, y tres métricas HTTP estándar cubren duración, requests activos y tamaño de respuesta.

rust
use pliego_runtime::{
    HttpScheme, OpenTelemetryConfig, RemoteTracePolicy,
};

let telemetry = OpenTelemetryConfig::new(HttpScheme::Https)
    .known_method("PROPFIND")?
    .remote_trace_policy(RemoteTracePolicy::AcceptW3c);

let runtime = NativeRuntimeBuilder::new(graph, "production-a")?
    .open_telemetry(telemetry)
    .build()?;
Default
Sin instrumentación ni parent remoto aceptado
Scheme
Valor Http o Https explícito y confiable del operador
Metrics
Duración de request, requests activos y tamaño del body de respuesta
Cardinality
Set de métodos conocidos, template de ruta sellado y códigos de framework finitos
Receipt
Bucket de duración aproximado e independiente del exporter

Independientemente de OpenTelemetry, cada request terminal emite un evento tracing pliegors::request con ID de ruta sellado, outcome, status, bytes de respuesta, bucket aproximado de duración, modo de render y código diagnóstico limitado. Excluye valores del request y deja subscriber, storage, retención y alertas al operador.

Limita el trabajo y preserva la semántica ya comprometida

Las identidades de boundary se validan y son únicas antes del commitment. Los valores predeterminados permiten 32 declaraciones, cuatro en vuelo y cinco segundos por future; los techos son 256, 32 y 60 segundos. Shell, anchors y vistas resueltas comparten un presupuesto de salida, mientras cada vista conserva límites de profundidad y nodos.

Un timeout, fallo de aplicación, panic o agotamiento de salida después del commitment termina el body y registra el fallo; no puede reescribir el status ni emitir una segunda página. PLG-REN-210 descarta el texto del error de aplicación en el límite en vez de admitirlo en diagnósticos públicos.