Volver al Centro de conocimiento
Plataforma

Presentation API: límites de pantalla y sesión

Diseña flujos de Presentation API con disponibilidad de pantalla, activación del usuario, reconexión, cierre, mensajes acotados y alternativa en la página.

BotBrowser Team

Documentación

Quieres la documentación estructurada de Plataforma?

Este artículo forma parte de la biblioteca editorial. Para pasos de configuración, material de referencia y actualizaciones continuas, entra en la sección de docs.

BotBrowser puede validar un flujo autorizado de Presentation API cuando un navegador controlado expone los métodos y una acción declarada inicia la solicitud. No puede fabricar un receptor ni una pantalla física, elegir un destinatario ni demostrar una entrega. La frontera útil es un estado visible: la página solicita, el navegador media, la presentación puede conectar y la misma tarea sigue disponible en la página si se rechaza cualquier límite.

Una acción del usuario pasa por la disponibilidad de pantalla hasta PresentationRequest, mensajes acotados, reconexión, cierre y una alternativa en la página

TL;DR

Presentation API conecta un contexto de navegación controlador con una pantalla de presentación, pero no convierte esa pantalla en un dispositivo direccionable de la página. Detecta PresentationRequest, observa PresentationAvailability como una señal de ejecución y llama a start() desde un clic o tecla deliberados. Trata connected, closed, terminated, las promesas rechazadas y la ausencia de pantallas como estados normales. Mantén una vista previa o controles dentro de la página.

La especificación W3C Presentation API describe iniciar y reconectar presentaciones, observar disponibilidad, eventos de conexión e intercambio de mensajes. MDN marca la función como de disponibilidad limitada. Un contexto controlado de BotBrowser puede registrar esos estados visibles, pero no prueba que exista una segunda pantalla física ni que una persona haya visto un mensaje.

Contenido

La disponibilidad no es un inventario

PresentationRequest contiene URLs de presentación que el navegador puede cargar en un receptor elegido por el agente de usuario. PresentationAvailability informa si el agente cree que hay una pantalla compatible disponible. No es una lista de televisores, proyectores, receptores o personas cercanas. availability.value === true permite habilitar un control, pero no identifica una pantalla concreta.

La selección pertenece al navegador. La página no debe enumerar receptores ni guardar un supuesto nombre de dispositivo. Las dos URLs son rutas de la aplicación, no direcciones de hardware. Si el constructor no existe, la política impide la función o la disponibilidad es falsa, ofrece la misma vista dentro de la página. La guía de propiedades de pantalla y viewport ayuda a distinguir geometría de identidad; Presentation API añade una sesión mediada, no un perfil de pantalla.

const presentation =
  'PresentationRequest' in window ? new PresentationRequest(['/present/board', '/present/fallback']) : null;

let displayAvailable = false;
if (presentation) {
  try {
    const availability = await presentation.getAvailability();
    displayAvailable = availability.value;
    availability.onchange = () => {
      displayAvailable = availability.value;
      renderPresentationControl({ displayAvailable });
    };
  } catch {
    renderPresentationControl({ displayAvailable: false });
  }
}

Inicia solo con activación del usuario

Llama a presentation.start() desde un botón o una tecla. No lo llames al cargar, desde un temporizador ni tras una respuesta de red. El navegador puede rechazar la promesa por soporte, activación, política o selección de pantalla. La activación transitoria puede expirar mientras esperas trabajo ajeno.

async function startPresentation() {
  if (!presentation) return showInline('unsupported');
  if (!displayAvailable) return showInline('unavailable');
  setPresentationState('starting');
  try {
    const connection = await presentation.start();
    attachConnection(connection);
    setPresentationState(connection.state);
  } catch (error) {
    setPresentationState(classifyPresentationError(error));
    showInline('fallback');
  }
}
startButton.addEventListener('click', startPresentation);

La disponibilidad es una pista anterior al clic; la resolución de start() manda para este intento. Evita dobles solicitudes con starting y devuelve un botón de reintento después del resultado. Para otra transferencia mediada por el navegador, Web Share API: límites de permisos y alternativas muestra la misma separación entre capacidad, activación y entrega.

Modela todo el ciclo de sesión

Una conexión puede pasar por connecting, connected, closed y terminated. Escucha onconnect, onclose, onterminate y onmessage, libera los listeners al cerrar y muestra la alternativa local. Reconectar es una acción distinta: un identificador de presentación es opaco, puede caducar y no prueba que se recuperó la misma pantalla física.

function attachConnection(connection) {
  connection.onconnect = () => setPresentationState('connected');
  connection.onclose = () => {
    setPresentationState('closed');
    showInline('fallback');
  };
  connection.onterminate = () => {
    setPresentationState('terminated');
    showInline('fallback');
  };
  connection.onmessage = event => acceptBoundedMessage(event.data);
}

Si la disponibilidad cambia a falsa, no declares cerrada una sesión conectada hasta recibir su propio evento. Si llega close o terminate, no mantengas el texto “conectado” indefinidamente. Una vista en la página conserva el trabajo aun cuando el receptor desaparece. El artículo de Document Picture-in-Picture ofrece una comparación útil entre una ventana auxiliar y una sesión de presentación.

Mensajes acotados y alternativa

Define un sobre con version, revision, una lista de tipos y un límite de tamaño. Rechaza tipos desconocidos, revisiones antiguas y datos grandes. La recepción de un mensaje es un evento del protocolo, no una confirmación de píxeles ni de lectura humana. Valida la ruta y la versión en el receptor; escapa contenido antes de mostrarlo; cierra si el protocolo no coincide.

const MAX_MESSAGE_BYTES = 16_384;
let revision = 0;
function makeMessage(type, content) {
  const message = { version: 1, revision: ++revision, type, content };
  const encoded = JSON.stringify(message);
  if (new TextEncoder().encode(encoded).length > MAX_MESSAGE_BYTES) throw new Error('message-too-large');
  return encoded;
}

Conserva el modelo de negocio en el almacén normal de la página y deriva una vista pequeña para la presentación. Al cerrar, la edición local continúa; al reconectar, envía la revisión actual en vez de todo el historial. Un tiempo de espera acotado y una sola instantánea de recuperación evitan reintentos infinitos.

Tabla de decisiones

Estado observadoAcción seguraNo afirmar
Falta PresentationRequestMostrar vista localCompatibilidad universal
Disponibilidad falseMantener alternativa o desactivar inicioQue no exista ninguna pantalla física
start() rechazaRegistrar categoría y conservar tareaQue se rechazó un dispositivo nombrado
connectedEnviar una revisión acotadaQue se dibujó cada píxel
Mensaje recibidoValidar sobre y revisiónQue una persona lo confirmó
close o terminateLiberar listeners y ofrecer reintentoQue la pantalla sigue disponible
Reconexión rechazadaBorrar token caducado tras el presupuestoQue se recuperó la misma pantalla

Prueba el límite visible con BotBrowser

Un contexto controlado de BotBrowser puede ejecutar un botón determinista, registrar el constructor, la disponibilidad, las transiciones y la visibilidad de la alternativa. Un resultado unsupported, unavailable o start-rejected es válido si queda registrado y la página sigue funcionando. La documentación de funciones avanzadas de BotBrowser no convierte el ejecutor en un receptor físico.

{
  "request": "PresentationRequest",
  "availability": "unknown",
  "states": ["starting", "fallback"],
  "messagesAccepted": 0,
  "fallbackVisible": true,
  "delivery": "not-observed",
  "physicalDisplay": "not-asserted"
}

Repite el fixture cambiando una sola variable: versión del navegador, ruta de activación, disponibilidad, red o identificador. Compara la primera transición divergente y no conviertas una ejecución local en una promesa para todos los sistemas.

Conclusión

La página debe controlar el estado y el navegador la mediación de pantalla. Detecta soporte, inicia con una acción visible, limita mensajes y trata cierre, terminación y fallo de reconexión como estados esperados. BotBrowser puede repetir y comparar ese contrato visible en contextos autorizados; no puede crear una segunda pantalla, elegir un destinatario ni garantizar entrega.

Fuentes públicas

Lectura siguiente

Compara Document Picture-in-Picture: límites de permisos y ventanas y Web Share API: límites de permisos y alternativas seguras.

#Presentation API#Segunda Pantalla#Sesiones Del Navegador#Privacidad#BotBrowser

Este artículo forma parte de la guía: Superficies de la plataforma web: mapa de revisión

Lleva BotBrowser de la investigación a producción

Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.