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.
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.
{
"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:readyEl paquete se ha cargado y verificado lo suficiente para estar preparado. Incluye packageId y contentRoot.
p2lrn:renderedUna entidad se ha representado con un renderer concreto. La progresión puede utilizarlo para marcar viewed.
p2lrn:activityreadyEl 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:answerRespuesta de una pregunta nativa. Incluye questionId y la respuesta normalizada.
p2lrn:progressAvance interno de una actividad compatible. En cuestionarios incluye value, answered y total.
p2lrn:timeupdateActualización del tiempo restante de un intento o pregunta temporizada.
p2lrn:timeoutSe agotó el tiempo de una pregunta o del intento.
p2lrn:navigationResultado 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:statechangeEl estado de reanudación de una actividad ha cambiado. Puede contener respuestas nativas, CMI SCORM o estado H5P según el runtime.
p2lrn:scorePuntuación estructurada. Los campos comunes son graded, raw, max, normalized y, cuando existen, passed o completed.
p2lrn:completeLa actividad ha comunicado finalización. El payload depende del runtime y puede incluir score, respuestas, estado o statement terminal.
p2lrn:progressionchangeHa 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:xapiIncluye runtime:"h5p", el statement generado por contenido, source:"content-runtime" y authoritative:false.
p2lrn:scoreCuando statement.result contiene score/success/completion, P2LRN deriva una forma común para la nota.
p2lrn:completeSe 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.
saveState es más directo que almacenar cada statechange.
reportScore evita depender de interpretar todos los eventos de score.
Conserva answer, progress, xapi o CMI SCORM según el contenido.
Conserva el sobre canónico, añade tu attemptId y un receivedAt del servidor.
10. Nombres que debes utilizar
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:attemptFases 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-changeIndica 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ónVotos, notas de pizarra, aportaciones y revisiones entre pares utilizan el mismo sobre canónico de interacción.
p2lrn:interaction · recursos/mediosAperturas de recursos e interacciones relevantes de medios pueden conservar su familia semántica sin depender de la interfaz visible.
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.