Declaraciones públicas de zig/src/router.zig (spire-zig (SDK consumido)).
apps/docs/generated/zig/spire.jsonPágina generada desde
spire@spire-0.2.0-XvnrRek1BgCX4Bh8miuITCQgkn0FqeQrYYE3goFfDcQd (zig/src/root.zig). No se edita a mano:bun run docs:genla regenera ybun run docs:checkfalla si difiere.
Router de spire: el único camino por el que un sobre recibido llega a un handler, en cualquier transporte (dec-0119 §1, §4–§8).
Tubería de dispatch, en este orden (el primer fallo decide):
envelope.decode) → drop + auditkid en el keyring → drop + auditsource = dueño del kid → drop + auditsource = identidad autenticada del peer (unix) → drop + auditRequestKey)authorize → reply deniedLo que falla antes de autenticar (1–5) no recibe respuesta: responder a
un sobre sin autenticar sería un oráculo. Todo lo demás recibe una
respuesta firmada con status (salvo los evt, que nunca responden).
La allowlist va antes del anti-replay: sólo un emisor admitido en la ruta
gasta memoria de la caché de nonces, y cada uno dentro de su cuota (lo
que su rate admite en una ventana, reservado al registrar). Un emisor que
inunda se queda sin su cuota, nunca deja sin servicio a otro. Lo que se
deniega antes del anti-replay no ejecuta nada, así que repetirlo sólo
vuelve a dar denied. El rate va después del anti-replay a propósito: un
sobre rechazado por rate queda registrado (el cliente re-sella su
reintento), y sus bytes no se pueden reproducir más tarde para ejecutarlo.
Los handlers se registran con register(Contract, policy, handler), los
tres comptime. policy no tiene default: sin ella no compila.
router.Peertype · línea 54
pub const Peer = structQuién está al otro lado del transporte.
router.Outcometype · línea 63
pub const Outcome = enumSin ///.
router.Optionstype · línea 72
pub const Options = structSin ///.
router.RegisterErrorconst · línea 87
pub const RegisterError = error{ AlreadyStarted, DuplicateSubject } || replay_mod.ReserveErrorSin ///.
router.Routerfn · línea 96
pub fn Router(comptime App: type) typeSin ///.
router.Router.Contexttype · línea 100
pub const Context = structSin ///.
router.Router.Context.Undotype · línea 113
pub const Undo = structSin ///.
router.Router.Context.onReplyFailurefn · línea 122
pub fn onReplyFailure(ctx: *Context, comptime T: type, ptr: *T, comptime run: fn (*T) void) voidUn handler que crea estado (una sesión, un binding) registra
aquí cómo deshacerlo por si su respuesta no llega a sellarse:
respuesta fuera de contrato, sin memoria para serializarla o
para el sobre. Sin esto el efecto quedaría huérfano (hecho,
pero sin que nadie reciba su id para cerrarlo). Una por
mensaje; ptr tiene que vivir hasta el final del mensaje
(la arena sirve). Si la respuesta sale, no se llama.
router.Router.Context.setReplyTraceparentfn · línea 134
pub fn setReplyTraceparent(ctx: *Context, tp: []const u8) boolEl handler declara el span que abrió para este mensaje; la respuesta lo lleva en vez de repetir el del request. No cambia el formato del sobre. Un valor que no sea W3C v00 se ignora (y devuelve false): la respuesta repite el del request.
router.Router.initfn · línea 171
pub fn init(allocator: std.mem.Allocator, app: *App, opts: Options) std.mem.Allocator.Error!SelfSin ///.
router.Router.deinitfn · línea 181
pub fn deinit(self: *Self) voidSin ///.
router.Router.registerfn · línea 194
pub fn register(self: *Self, comptime C: type, comptime p: Policy, comptime handler: anytype) RegisterError!voidRegistra handler para el contrato C con la política p.
handler: fn (*Context, C.Request) anyerror!C.Reply.
router.Router.startfn · línea 232
pub fn start(self: *Self) voidCongela el registro. dispatch antes de start responde
unavailable.
router.Router.subjectsfn · línea 236
pub fn subjects(self: *const Self, out: [][]const u8) usizeSin ///.
router.Router.dispatchfn · línea 260
pub fn dispatch(self: *Self, peer: Peer, body: []const u8, out: *std.ArrayList(u8)) std.mem.Allocator.Error!OutcomeProcesa un cuerpo de frame envelope. Si devuelve .replied,
out (vaciado antes) contiene el sobre de respuesta.
Routerfn · línea 96
pub fn Router(comptime App: type) typeSin ///.
Router.Contexttype · línea 100
pub const Context = structSin ///.
Router.Context.Undotype · línea 113
pub const Undo = structSin ///.
Router.Context.onReplyFailurefn · línea 122
pub fn onReplyFailure(ctx: *Context, comptime T: type, ptr: *T, comptime run: fn (*T) void) voidUn handler que crea estado (una sesión, un binding) registra
aquí cómo deshacerlo por si su respuesta no llega a sellarse:
respuesta fuera de contrato, sin memoria para serializarla o
para el sobre. Sin esto el efecto quedaría huérfano (hecho,
pero sin que nadie reciba su id para cerrarlo). Una por
mensaje; ptr tiene que vivir hasta el final del mensaje
(la arena sirve). Si la respuesta sale, no se llama.
Router.Context.setReplyTraceparentfn · línea 134
pub fn setReplyTraceparent(ctx: *Context, tp: []const u8) boolEl handler declara el span que abrió para este mensaje; la respuesta lo lleva en vez de repetir el del request. No cambia el formato del sobre. Un valor que no sea W3C v00 se ignora (y devuelve false): la respuesta repite el del request.
Router.initfn · línea 171
pub fn init(allocator: std.mem.Allocator, app: *App, opts: Options) std.mem.Allocator.Error!SelfSin ///.
Router.deinitfn · línea 181
pub fn deinit(self: *Self) voidSin ///.
Router.registerfn · línea 194
pub fn register(self: *Self, comptime C: type, comptime p: Policy, comptime handler: anytype) RegisterError!voidRegistra handler para el contrato C con la política p.
handler: fn (*Context, C.Request) anyerror!C.Reply.
Router.startfn · línea 232
pub fn start(self: *Self) voidCongela el registro. dispatch antes de start responde
unavailable.
Router.subjectsfn · línea 236
pub fn subjects(self: *const Self, out: [][]const u8) usizeSin ///.
Router.dispatchfn · línea 260
pub fn dispatch(self: *Self, peer: Peer, body: []const u8, out: *std.ArrayList(u8)) std.mem.Allocator.Error!OutcomeProcesa un cuerpo de frame envelope. Si devuelve .replied,
out (vaciado antes) contiene el sobre de respuesta.