INTEGRACIÓN / EVENTOS

Eventos del Player

Los eventos p2lrn:* describen el ciclo de reproducción con un contrato estable. Puedes escucharlos en el DOM para reaccionar en la interfaz o recibir el mismo flujo canónico mediante HostAdapter.emitEvent() para analítica y persistencia.

1. Dos formas de recibirlos

Para una pantalla concreta puedes escuchar CustomEvent sobre el Player. Para una integración centralizada utiliza emitEvent; así no dependes de montar listeners distintos en cada vista.

JavaScript · listeners DOM
const player = document.querySelector('p2lrn-player');

player.addEventListener('p2lrn:score', (event) => {
  console.log(event.detail);
  console.log(event.detail.event);
});

En DOM, los campos del payload aparecen directamente en event.detail, junto con event.detail.context y el sobre canónico completo en event.detail.event.

2. Sobre canónico

El objeto que recibe HostAdapter.emitEvent(event, context) mantiene siempre la misma envoltura, independientemente del renderer que lo origine.

JSON
{
  "schema": "https://p2lrn.org/schema/runtime-event/1",
  "version": "1",
  "type": "p2lrn:complete",
  "timestamp": "2026-10-16T08:30:00.000Z",
  "context": {
    "packageId": "urn:uuid:...",
    "contentRoot": "sha256:...",
    "entityId": "urn:uuid:...",
    "resourceId": "urn:uuid:...",
    "representationId": "urn:uuid:...",
    "rendererId": "https://p2lrn.org/renderer/..."
  },
  "payload": {}
}

schema y version identifican el contrato; type identifica el evento; timestamp es la hora del runtime; context localiza el contenido; payload contiene los datos específicos.

3. Eventos de carga y representación

p2lrn:ready

El paquete se ha cargado y verificado lo suficiente para estar preparado. Incluye packageId y contentRoot.

p2lrn:rendered

Una entidad se ha representado con un renderer concreto. La progresión puede utilizarlo para marcar viewed.

p2lrn:activityready

El runtime interno de una actividad ya está listo. Puede incluir tipo de actividad, runtime, versión SCORM, librería H5P o topología de aislamiento.

4. Eventos de interacción

p2lrn:answer

Respuesta de una pregunta nativa. Incluye questionId y la respuesta normalizada.

p2lrn:progress

Avance interno de una actividad compatible. En cuestionarios incluye value, answered y total.

p2lrn:timeupdate

Actualización del tiempo restante de un intento o pregunta temporizada.

p2lrn:timeout

Se agotó el tiempo de una pregunta o del intento.

p2lrn:navigation

Resultado de una petición de navegación SCORM 2004 cuando interviene el secuenciador.

p2lrn:progress no significa progreso global del curso.

Describe el avance que publica una actividad. El progreso del curso se determina con el estado y las reglas de Progresión.

5. Estado, puntuación y finalización

p2lrn:statechange

El estado de reanudación de una actividad ha cambiado. Puede contener respuestas nativas, CMI SCORM o estado H5P según el runtime.

p2lrn:score

Puntuación estructurada. Los campos comunes son graded, raw, max, normalized y, cuando existen, passed o completed.

p2lrn:complete

La actividad ha comunicado finalización. El payload depende del runtime y puede incluir score, respuestas, estado o statement terminal.

p2lrn:progressionchange

Ha cambiado el estado de progresión calculado para una entidad: vista, completada, aprobada o porcentaje de nota.

6. H5P y xAPI

H5P puede emitir statements xAPI. P2LRN los expone sin convertirlos en identidad de confianza de la plataforma.

p2lrn:xapi

Incluye runtime:"h5p", el statement generado por contenido, source:"content-runtime" y authoritative:false.

p2lrn:score

Cuando statement.result contiene score/success/completion, P2LRN deriva una forma común para la nota.

p2lrn:complete

Se emite con verbos terminales completed, passed o failed.

Si vas a enviar xAPI a un LRS, reconstruye actor, authority, registration/intento y demás campos de confianza en el servidor de tu plataforma.

7. Errores

p2lrn:error incluye una phase cuando la implementación conoce la fase que falló. Puede aparecer al cargar el paquete, representar contenido, guardar estado, informar nota, enviar eventos, resolver secuenciación o ejecutar un runtime.

El error técnico sirve para diagnóstico. La interfaz de tu aplicación debe decidir el mensaje que se enseña al alumno y qué errores son recuperables.

8. Orden y persistencia con Host Adapter

Las llamadas a emitEvent se serializan por Adapter: un evento se entrega después del anterior. Si tu callback falla, P2LRN produce localmente un p2lrn:error de fase emitEvent sin reenviar recursivamente ese mismo error al Adapter que está fallando.

Para un historial analítico conserva el sobre canónico. Para reanudación utiliza saveState; no intentes reconstruir el estado actual reproduciendo todo el log de eventos salvo que tu plataforma lo haya diseñado expresamente así.

9. Qué eventos guardar

No es obligatorio almacenar todos los eventos. Una plataforma puede guardar sólo notas/estado, o mantener un log completo si necesita analítica detallada.

Reanudación

saveState es más directo que almacenar cada statechange.

Nota final

reportScore evita depender de interpretar todos los eventos de score.

Analítica por interacción

Conserva answer, progress, xapi o CMI SCORM según el contenido.

Auditoría

Conserva el sobre canónico, añade tu attemptId y un receivedAt del servidor.

10. Nombres que debes utilizar

Usa los eventos p2lrn:* publicados.

El runtime mantiene compatibilidad interna con nombres históricos, pero una integración nueva debe escuchar y persistir únicamente los nombres P2LRN actuales.

La guía Métricas y analítica explica qué extraer de cuestionarios, SCORM, H5P y progresión y cómo asociarlo a alumno e intento.

Intentos e interacciones enriquecidas

Los cuestionarios nativos emiten ahora eventos explícitos de ciclo de intento e interacción para que una plataforma pueda distinguir inicio, reanudación y entrega sin reconstruirlos a partir del DOM.

p2lrn:attempt

Fases started, resumed y submitted, con número de intento y contadores de progreso. El evento de intento no duplica las respuestas crudas del alumno.

p2lrn:interaction · answer-change

Indica que cambió la respuesta de una pregunta e incluye questionId y questionType, pero no copia la respuesta completa dentro del evento analítico.

p2lrn:interaction · colaboración

Votos, notas de pizarra, aportaciones y revisiones entre pares utilizan el mismo sobre canónico de interacción.

p2lrn:interaction · recursos/medios

Aperturas de recursos e interacciones relevantes de medios pueden conservar su familia semántica sin depender de la interfaz visible.

Analítica no significa copiar datos personales al paquete.

La identidad del alumno, la matrícula y el intento real siguen perteneciendo al host. El evento describe lo ocurrido en el contenido; la plataforma añade su contexto privado al persistirlo.