- Accueil
- Documentation
- Natifs
- Utilitaires natifs médias + système
Utilitaires natifs médias + système
Ce document est une analyse approfondie du sous-système pour la couche de primitives système/médias/conversion décrite dans docs/natives-architecture.md : image, html, clipboard et le profilage work.
Fichiers d’implémentation
Section intitulée « Fichiers d’implémentation »crates/pi-natives/src/image.rscrates/pi-natives/src/html.rscrates/pi-natives/src/clipboard.rscrates/pi-natives/src/prof.rscrates/pi-natives/src/task.rspackages/natives/src/image/index.tspackages/natives/src/image/types.tspackages/natives/src/html/index.tspackages/natives/src/html/types.tspackages/natives/src/clipboard/index.tspackages/natives/src/clipboard/types.tspackages/natives/src/work/index.tspackages/natives/src/work/types.ts
Note : il n’y a pas de
crates/pi-natives/src/work.rs; le profilage work est implémenté dansprof.rset alimenté par l’instrumentation danstask.rs.
Correspondance API TS ↔ export/module Rust
Section intitulée « Correspondance API TS ↔ export/module Rust »| Export TS (packages/natives) | Export N-API Rust | Module Rust |
|---|---|---|
PhotonImage.parse(bytes) | PhotonImage::parse | image.rs |
PhotonImage#resize(width, height, filter) | PhotonImage::resize | image.rs |
PhotonImage#encode(format, quality) | PhotonImage::encode | image.rs |
htmlToMarkdown(html, options) | html_to_markdown | html.rs |
copyToClipboard(text) | copy_to_clipboard + logique de repli TS | clipboard.rs + clipboard/index.ts |
readImageFromClipboard() | read_image_from_clipboard | clipboard.rs |
getWorkProfile(lastSeconds) | get_work_profile | prof.rs |
Frontières de format de données et conversions
Section intitulée « Frontières de format de données et conversions »Image (image)
Section intitulée « Image (image) »- Frontière d’entrée JS : octets d’image encodés en
Uint8Array. - Frontière de décodage Rust : les octets sont copiés dans un
Vec<u8>, le format est deviné avecImageReader::with_guessed_format(), puis décodé enDynamicImage. - État en mémoire :
PhotonImagestocke unArc<DynamicImage>. - Frontière de sortie :
encode(format, quality)retournePromise<Uint8Array>(Vec<u8>côté Rust).
Les identifiants de format sont numériques :
0: PNG1: JPEG2: WebP (encodeur sans perte)3: GIF
Contraintes :
qualityn’est utilisé que pour JPEG.- PNG/WebP/GIF ignorent
quality. - Les identifiants de format non supportés échouent (
Invalid image format: <id>).
Conversion HTML (html)
Section intitulée « Conversion HTML (html) »- Frontière d’entrée JS :
stringHTML + objet optionnel{ cleanContent?: boolean; skipImages?: boolean }. - Frontière de conversion Rust : l’entrée
Stringest convertie parhtml_to_markdown_rs::convert. - Frontière de sortie :
stringMarkdown.
Comportement de conversion :
cleanContentvautfalsepar défaut.- Lorsque
cleanContent=true, le prétraitement est activé avecPreprocessingPreset::Aggressiveet des indicateurs de suppression stricte pour la navigation/les formulaires. skipImagesvautfalsepar défaut.
Presse-papiers (clipboard)
Section intitulée « Presse-papiers (clipboard) »- Chemin texte :
- TS émet d’abord OSC 52 (
\x1b]52;c;<base64>\x07) lorsque stdout est un TTY. - Le même texte est ensuite tenté via l’API native du presse-papiers (
native.copyToClipboard) en mode « meilleur effort ». - Sur Termux, TS tente d’abord
termux-clipboard-set.
- TS émet d’abord OSC 52 (
- Chemin de lecture d’image :
- Rust lit l’image brute depuis
arboard. - Rust la ré-encode en octets PNG (crate
image), retourne{ data: Uint8Array, mimeType: "image/png" }. - TS retourne
nullimmédiatement sur Termux ou les sessions Linux sans serveur d’affichage (DISPLAY/WAYLAND_DISPLAYabsents).
- Rust lit l’image brute depuis
Profilage work (work)
Section intitulée « Profilage work (work) »- Frontière de collecte : les échantillons de profilage sont produits par les gardes
profile_region(tag)danstask::blockingettask::future. - Format de stockage : tampon circulaire de taille fixe (
MAX_SAMPLES = 10_000) stockant le chemin de pile + la durée (μs) + l’horodatage (μs depuis le démarrage du processus). - Frontière de sortie :
getWorkProfile(lastSeconds)retourne un objet :folded: texte de pile repliée (entrée pour flamegraph)summary: tableau résumé en markdownsvg: SVG flamegraph optionneltotalMs,sampleCount
Cycle de vie et transitions d’état
Section intitulée « Cycle de vie et transitions d’état »Cycle de vie de l’image
Section intitulée « Cycle de vie de l’image »PhotonImage.parse(bytes)planifie une tâche bloquante de décodage (image.decode).- En cas de succès, un handle natif
PhotonImageexiste côté JS. resize(...)crée un nouveau handle natif (image.resize), l’ancien et le nouveau handle peuvent coexister.encode(...)matérialise les octets (image.encode) sans modifier les dimensions de l’image.
Transitions d’échec :
- L’échec de détection de format/décodage rejette la promesse de parse.
- L’échec d’encodage rejette la promesse d’encode.
- Un identifiant de format invalide rejette la promesse d’encode.
Cycle de vie HTML
Section intitulée « Cycle de vie HTML »htmlToMarkdown(html, options)planifie une tâche bloquante de conversion.- La conversion s’exécute avec les options par défaut (
cleanContent=false,skipImages=false) sauf spécification contraire. - Retourne une chaîne markdown ou rejette.
Transitions d’échec :
- L’échec du convertisseur retourne une promesse rejetée (
Conversion error: ...).
Cycle de vie du presse-papiers
Section intitulée « Cycle de vie du presse-papiers »copyToClipboard(text) est intentionnellement en mode « meilleur effort » et multi-chemin :
- Si TTY : tentative d’écriture OSC 52 (payload base64).
- Tentative de la commande Termux lorsque
TERMUX_VERSIONest défini. - Tentative de copie texte native via
arboard. - Les erreurs sont absorbées au niveau de la couche TS.
readImageFromClipboard() diffère en rigueur selon l’étape :
- TS bloque strictement les contextes d’exécution non supportés (Termux/Linux sans interface graphique) en retournant
null. - La lecture Rust
arboardne s’exécute que lorsque TS l’autorise. ContentNotAvailableest mappé versnull.- Les autres erreurs Rust rejettent.
Cycle de vie du profilage work
Section intitulée « Cycle de vie du profilage work »- Pas de démarrage explicite : le profilage est toujours actif lorsque les helpers de tâches s’exécutent.
- Chaque portée de tâche instrumentée enregistre un échantillon lors de la destruction du garde.
- Les échantillons écrasent les entrées les plus anciennes une fois la capacité du tampon atteinte.
getWorkProfile(lastSeconds)lit une fenêtre temporelle et dérive les artefacts folded/summary/svg.
Transitions d’échec :
- L’échec de génération SVG est un échec souple (
svg: null), tandis que folded et summary sont toujours retournés. - Une fenêtre d’échantillons vide retourne des données folded vides et
svg: null, ce n’est pas une erreur.
Opérations non supportées et propagation des erreurs
Section intitulée « Opérations non supportées et propagation des erreurs »- Entrée de décodage non supportée ou octets corrompus : échec strict (rejet de la promesse).
- Identifiant de format d’encodage non supporté : échec strict.
- Pas de chemin de repli « meilleur effort » dans le wrapper TS.
- Les erreurs de conversion sont des échecs stricts (rejet).
- L’omission d’options utilise les valeurs par défaut en mode « meilleur effort », ce n’est pas un échec.
Presse-papiers
Section intitulée « Presse-papiers »- La copie de texte est en mode « meilleur effort » au niveau de la couche TS : les échecs opérationnels sont supprimés.
- La lecture d’image distingue « pas d’image » (
null) d’un échec opérationnel (rejet). - Termux/Linux sans interface graphique sont traités comme des contextes non supportés pour la lecture d’image (
null).
Profilage work
Section intitulée « Profilage work »- La récupération est stricte pour l’appel de fonction lui-même, mais la génération d’artefacts est partiellement en mode « meilleur effort » (
svgnullable). - La troncature du tampon est un comportement attendu (tampon circulaire), pas un bug de perte de données.
Particularités par plateforme
Section intitulée « Particularités par plateforme »- Texte du presse-papiers : OSC 52 dépend du support du terminal ; l’accès natif au presse-papiers dépend de l’environnement de bureau/session.
- Lecture d’image du presse-papiers : bloquée côté TS pour Termux et Linux sans serveur d’affichage.