LegbaVideoTrack

expérimentaldepuis 0.1.0@legba-core/ui

LegbaVideoTrack

Ce que ça fait

Affiche une MediaStreamTrack vidéo (<legba-video-track>) dans un <video> réel. Quatre états : vide (pas de piste → placeholder, jamais un <video> cassé), chargement (piste fournie, pas encore prête), en direct (lecture réelle), erreur (piste terminée ou échec d’attachement). Changer de piste détache proprement l’ancienne avant d’attacher la nouvelle ; réassigner la même instance est un no-op gratuit.

Signature

class LegbaVideoTrack extends LegbaElement {
  track: MediaStreamTrack | null;
}

Tag : legba-video-track.

Paramètres

PropriétéTypeRequisDéfautDescription
trackMediaStreamTrack | nullnonnullPiste vidéo à afficher ; null = état vide

Retour

N/A — un élément DOM. Aucun événement émis : l’état se lit via le rendu (placeholder/<video>/overlays), pas via un événement dédié.

Erreurs

Aucune : une piste déjà ended, une piste qui se termine en cours d’usage, ou un échec de lecture basculent tous silencieusement vers l’état erreur (overlay role="alert"), jamais une exception qui remonte à l’appelant.

Exemple minimal

import type { LegbaVideoTrack } from "@legba-core/ui";

function attachCameraTrack(el: LegbaVideoTrack, track: MediaStreamTrack | null): void {
  el.track = track;
}

Exemple complet

import type { LegbaVideoTrack } from "@legba-core/ui";

function wireCameraPreview(el: LegbaVideoTrack): void {
  window.navigator.mediaDevices
    .getUserMedia({ video: true })
    .then((stream) => {
      const [track] = stream.getVideoTracks();
      el.track = track ?? null;
      // Le composant réagit lui-même si le matériel se déconnecte : aucun
      // écouteur supplémentaire n'est nécessaire ici.
    })
    .catch(() => {
      el.track = null; // repli sur l'état vide, jamais un <video> cassé
    });
}

Pièges

  • Le <video> interne reste toujours monté dans le Shadow DOM (masqué via hidden en état vide), jamais ajouté/retiré selon l’état — un détail d’implémentation, mais qui garantit qu’aucun <video> visuellement cassé ne s’affiche jamais.
  • Une piste déjà readyState === "ended" au moment de l’affectation bascule directement en erreur, jamais par un aller-retour trompeur par “chargement” ou “initial”.
  • track est comparé par référence (comportement standard de Lit) : réassigner la même instance ne redéclenche jamais un attachement.
  • Le composant ne coupe jamais la piste lui-même (track.stop() reste la responsabilité de l’appelant) — il ne fait qu’arrêter de l’utiliser (video.srcObject = null) au détachement ou à la déconnexion du composant.
  • Consomme les jetons --legba-* comme tout composant @legba-core/ui : ne redéclare jamais un jeton public directement, voir LegbaElement.

Voir aussi