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