Eventos
El sobre de un evento, el microlote que transporta un mensaje de difusión, y todos los tipos de evento con su canal, su etapa y su clase de entrega.
- Disponibilidad: Planificado
- Evidencia: Leído del código fuente
- Referencia
El evento
{
"id": "evt_9fK2mQ7x",
"stream": { "organization": "team-42", "application": "app_Shop0001x", "job": "job_Prep0001x" },
"sequence": 118,
"type": "stage.progress",
"time": "2026-09-19T10:15:02.250Z",
"data": { "stage": "generate", "done": 41, "total": 96 }
}| Miembro | Significado |
|---|---|
id |
Identidad estable del evento. Úsala para descartar duplicados. |
stream |
El ámbito del evento y, por lo tanto, su canal: organization siempre, application y job cuando corresponden |
sequence |
Monótona y sin huecos por canal, a partir de 1 |
type |
Uno de los tipos de más abajo |
time |
Cuándo se confirmó el cambio de estado |
data |
Depende del tipo. Los eventos job.* llevan state; los stage.* llevan stage, done y total; los eventos de módulos, cache.hit y retry.scheduled llevan module, y key o attempt cuando corresponde. |
Los eventos y los registros nunca contienen credenciales, tokens ni datos de otra organización.
El microlote
Un mensaje de difusión transporta un microlote:
{ "protocol": "beyond-cdn-events/1", "channel": "job:job_Prep0001x", "events": [] }Los eventos conservan su orden dentro de un lote. Las notificaciones de progreso y de registros se agrupan durante un intervalo corto para mantener acotados el costo y la distribución; un notificador divide un lote en lugar de superar el límite de tamaño. Los eventos de la clase immediate se envían sin esperar al intervalo.
Todo evento se guarda con su secuencia sea cual sea su clase de entrega. El agrupamiento afecta cuándo te notifican, nunca lo que puedes reproducir.
El puntero
A veces un notificador no puede o no debe enviar un evento. En ese caso difunde un puntero en su lugar, con su propio nombre de evento de difusión, beyond-cdn-pointer/1:
{ "protocol": "beyond-cdn-events/1", "channel": "job:job_Prep0001x", "sequence": 131, "reason": "oversize" }| Miembro | Significado |
|---|---|
protocol |
beyond-cdn-events/1. El puntero es un mensaje aditivo del protocolo de eventos; el nombre del evento de difusión y la ausencia de events lo distinguen de un microlote. |
channel |
El canal al que se refiere |
sequence |
El canal llegó al menos a esta secuencia, y esos eventos no viajaron |
reason |
oversize: el evento no cabe en un mensaje. stale: la notificación esperó más que la antigüedad máxima de notificación, así que un atraso cuesta un puntero por canal en lugar de una avalancha. |
Un puntero no es un tipo de evento. No tiene id, ni type, ni secuencia propia, nunca se guarda y una reproducción nunca lo devuelve. Trátalo como un hueco hasta sequence y reproduce desde tu cursor. Un puntero igual o anterior a tu cursor se ignora. No se pierde nada, porque todo evento se guarda pase lo que pase con su notificación.
Tipos de evento
Un notificador nunca retrasa, agrupa ni descarta los eventos inmediatos (immediate). Los eventos agrupados (batched) pueden ir en microlotes.
Trabajos, cola y turnos
| Tipo | Canales | Entrega |
|---|---|---|
job.queued, job.running, job.waiting_turn, job.succeeded, job.failed, job.cancelled, job.limit_exceeded |
trabajo, aplicación | Inmediata |
queue.position |
trabajo | Agrupada |
turn.started, turn.ended |
trabajo | Inmediata |
retry.scheduled |
trabajo | Inmediata |
Etapas
| Tipo | Etapa | Canales | Entrega |
|---|---|---|---|
stage.started, stage.succeeded, stage.failed |
cualquiera | trabajo | Inmediata |
stage.progress |
cualquiera | trabajo | Agrupada |
graph.pinned |
resolve |
trabajo, aplicación | Inmediata |
graph.exception |
resolve |
trabajo | Inmediata |
package.fetched, package.reused |
prepare |
trabajo | Agrupada |
package.failed |
prepare |
trabajo | Inmediata |
inventory.persisted |
analyze |
trabajo, aplicación | Inmediata |
inventory.unknown |
analyze |
trabajo | Inmediata |
module.queued, module.started, module.generated, cache.hit |
generate |
trabajo | Agrupada |
module.failed, module.limit_exceeded, diagnostics.reported |
generate |
trabajo | Inmediata |
closure.validated, closure.incomplete |
validate |
trabajo, aplicación | Inmediata |
Releases, aplicación y organización
| Tipo | Canales | Entrega |
|---|---|---|
release.ready, release.failed |
trabajo, aplicación | Inmediata |
release.candidate, release.activated, release.retired |
aplicación | Inmediata |
application.changed |
aplicación, organización | Inmediata |
domain.changed, notice.update |
aplicación | Inmediata |
plan.changed, credit.granted |
organización | Inmediata |
credit.reserved, credit.settled, credit.released |
organización | Agrupada |
usage.recorded |
trabajo, organización | Agrupada |
Registros y control
| Tipo | Canales | Entrega | Significado |
|---|---|---|---|
log.batch |
trabajo | Agrupada | Líneas de registro saneadas: time, level, stage, message |
access.revoked |
todos | Inmediata | Tu acceso al canal terminó. Consulta Revocación. |
resync.required |
todos | Inmediata | Ya no puedes confiar en tu posición: carga una instantánea. Consulta Reconexión y reproducción. |
Los nombres de los tipos, los estados y los códigos son identificadores y nunca se traducen. Las aplicaciones que los muestran se encargan de localizar sus explicaciones para las personas.