Aller au contenu

Métadonnées (fd 3)

Le canal de métadonnées est en JSONL sur fd 3. Un objet JSON par ligne — chacun définit un panneau, en mute un existant ou l’efface.

TypeMoteur de rendu
image<img> depuis une URL blob (PNG, JPEG, WebP, GIF). Nécessite byteLength + octets sur fd 4.
svgChaîne SVG en innerHTML. Le SVG peut arriver soit inline dans data (chaîne UTF-8), soit via byteLength sur fd 4.
htmlChaîne HTML en innerHTML. Même mode de livraison que svg.
canvas2dUn <canvas> rendu via drawImage. Nécessite byteLength + octets sur fd 4 (image raster).
updateMute des champs sur un id de panneau existant.
clearSupprime un panneau par id.

Les types de contenu personnalisés s’enregistrent via registerRenderer() dans src/views/terminal/content-renderers.ts.

ChampTypeDescription
idstringIdentifiant unique du panneau (par surface).
typestringTout type de contenu ou update / clear.
positionenumfloat (fixé au viewport, par défaut), inline (défile avec le terminal), fixed (sans habillage).
x, ynumberPosition en pixels (origine : coin supérieur gauche du panneau).
width, heightnumber | "auto"Dimensions.
draggablebooleanAutorise le glisser (défaut : true pour float, false sinon).
resizablebooleanAutorise le redimensionnement (défaut : true pour float, false sinon).
interactivebooleanTransfère les événements souris vers fd 5.
byteLengthnumberTaille de la charge utile binaire sur le canal de données.
dataChannelstringCanal de données nommé (défaut : "data" = fd 4).
datastringCharge utile UTF-8 inline (alternative à byteLength, pour le contenu textuel).
formatstringPour image : png / jpeg / webp / gif.
opacitynumber0.0–1.0.
zIndexnumberOrdre d’empilement.
{"id":"photo","type":"image","format":"png","x":100,"y":50,"width":400,"height":300,"byteLength":24576}

Suivi de 24 576 octets PNG bruts sur fd 4.

{"id":"chart","type":"svg","x":50,"y":50,"width":400,"height":300,"data":"<svg viewBox='0 0 100 100'><circle cx='50' cy='50' r='40' fill='blue'/></svg>"}
{"id":"btn","type":"html","x":20,"y":20,"width":200,"height":80,"interactive":true,"data":"<button onclick='alert(1)'>Click</button>"}
{"id":"photo","type":"update","x":200,"y":150}

Seuls les champs que vous passez sont modifiés. Impossible de changer type — effacez et recréez à la place.

{"id":"photo","type":"clear"}

Supprime le panneau et libère son élément DOM. Ses événements ne sont plus livrés.

  • Utilisez des id que vous pouvez relier à l’état côté script. Ils sont renvoyés à chaque événement.
  • Préférez inline à float pour une sortie ponctuelle — ils défilent naturellement avec le texte du terminal.
  • Choisissez byteLength vs data consciemment. data convient pour de petites charges utiles ; au-delà de 64 KiB, utilisez byteLength pour éviter l’échappement de chaîne JSON.
  • Ne diffusez pas de trames brutes à 60 fps — pour de l’animation de type canvas, utilisez update pour envoyer de petites mutations plutôt que de réémettre la charge utile complète.
  • src/views/terminal/panel-manager.ts — répartition fd 3.
  • src/bun/sideband-parser.ts — lecteur JSONL + binaire.
  • src/shared/types.ts — types des options de panneau.