- Inicio
- Documentation
- Nativos
- Utilidades nativas de medios + sistema
Utilidades nativas de medios + sistema
Este documento es una inmersión profunda en el subsistema de la capa de primitivas de sistema/medios/conversión descrita en docs/natives-architecture.md: image, html, clipboard y perfilado de work.
Archivos de implementación
Sección titulada «Archivos de implementación»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
Nota: no existe
crates/pi-natives/src/work.rs; el perfilado de trabajo está implementado enprof.rsy alimentado por la instrumentación entask.rs.
Mapeo de API TS ↔ exportaciones/módulos Rust
Sección titulada «Mapeo de API TS ↔ exportaciones/módulos Rust»| Exportación TS (packages/natives) | Exportación N-API de Rust | Módulo 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 + lógica de respaldo en TS | clipboard.rs + clipboard/index.ts |
readImageFromClipboard() | read_image_from_clipboard | clipboard.rs |
getWorkProfile(lastSeconds) | get_work_profile | prof.rs |
Límites de formato de datos y conversiones
Sección titulada «Límites de formato de datos y conversiones»Imagen (image)
Sección titulada «Imagen (image)»- Límite de entrada JS:
Uint8Arraycon bytes de imagen codificada. - Límite de decodificación Rust: los bytes se copian a
Vec<u8>, el formato se detecta conImageReader::with_guessed_format(), luego se decodifica aDynamicImage. - Estado en memoria:
PhotonImagealmacenaArc<DynamicImage>. - Límite de salida:
encode(format, quality)retornaPromise<Uint8Array>(Vec<u8>en Rust).
Los IDs de formato son numéricos:
0: PNG1: JPEG2: WebP (codificador sin pérdida)3: GIF
Restricciones:
qualitysolo se utiliza para JPEG.- PNG/WebP/GIF ignoran
quality. - Los IDs de formato no soportados fallan (
Invalid image format: <id>).
Conversión HTML (html)
Sección titulada «Conversión HTML (html)»- Límite de entrada JS:
stringHTML + objeto opcional{ cleanContent?: boolean; skipImages?: boolean }. - Límite de conversión Rust: la entrada
Stringes convertida porhtml_to_markdown_rs::convert. - Límite de salida:
stringMarkdown.
Comportamiento de conversión:
cleanContenttiene valor predeterminadofalse.- Cuando
cleanContent=true, se habilita el preprocesamiento conPreprocessingPreset::Aggressivey flags de eliminación forzada para navegación/formularios. skipImagestiene valor predeterminadofalse.
Portapapeles (clipboard)
Sección titulada «Portapapeles (clipboard)»- Ruta de texto:
- TS primero emite OSC 52 (
\x1b]52;c;<base64>\x07) cuando stdout es un TTY. - El mismo texto se intenta luego a través de la API nativa del portapapeles (
native.copyToClipboard) como mejor esfuerzo. - En Termux, TS intenta
termux-clipboard-setprimero.
- TS primero emite OSC 52 (
- Ruta de lectura de imagen:
- Rust lee la imagen cruda desde
arboard. - Rust la recodifica a bytes PNG (crate
image), retorna{ data: Uint8Array, mimeType: "image/png" }. - TS retorna
nullanticipadamente en Termux o sesiones Linux sin servidor de pantalla (DISPLAY/WAYLAND_DISPLAYausentes).
- Rust lee la imagen cruda desde
Perfilado de trabajo (work)
Sección titulada «Perfilado de trabajo (work)»- Límite de recolección: las muestras de perfilado son producidas por guardas
profile_region(tag)entask::blockingytask::future. - Formato de almacenamiento: buffer circular de tamaño fijo (
MAX_SAMPLES = 10_000) que almacena ruta de pila + duración (μs) + marca de tiempo (μs desde el inicio del proceso). - Límite de salida:
getWorkProfile(lastSeconds)retorna un objeto:folded: texto de pila plegada (entrada para flamegraph)summary: tabla resumen en markdownsvg: SVG de flamegraph opcionaltotalMs,sampleCount
Ciclo de vida y transiciones de estado
Sección titulada «Ciclo de vida y transiciones de estado»Ciclo de vida de imagen
Sección titulada «Ciclo de vida de imagen»PhotonImage.parse(bytes)programa una tarea de decodificación bloqueante (image.decode).- En caso de éxito, existe un handle nativo
PhotonImageen JS. resize(...)crea un nuevo handle nativo (image.resize), los handles antiguo y nuevo pueden coexistir.encode(...)materializa bytes (image.encode) sin mutar las dimensiones de la imagen.
Transiciones de fallo:
- Fallo en la detección de formato/decodificación rechaza la promesa de parse.
- Fallo en la codificación rechaza la promesa de encode.
- ID de formato inválido rechaza la promesa de encode.
Ciclo de vida de HTML
Sección titulada «Ciclo de vida de HTML»htmlToMarkdown(html, options)programa una tarea de conversión bloqueante.- La conversión se ejecuta con opciones predeterminadas (
cleanContent=false,skipImages=false) a menos que se especifiquen. - Retorna un string markdown o rechaza.
Transiciones de fallo:
- Fallo del convertidor retorna una promesa rechazada (
Conversion error: ...).
Ciclo de vida del portapapeles
Sección titulada «Ciclo de vida del portapapeles»copyToClipboard(text) es intencionalmente de mejor esfuerzo y multi-ruta:
- Si es TTY: intenta escritura OSC 52 (payload en base64).
- Intenta comando Termux cuando
TERMUX_VERSIONestá establecido. - Intenta copia de texto nativa con
arboard. - Suprime errores en la capa TS.
readImageFromClipboard() difiere en rigurosidad según la etapa:
- TS bloquea estrictamente contextos de ejecución no soportados (Termux/Linux sin interfaz gráfica) retornando
null. - La lectura de
arboarden Rust se ejecuta solo cuando TS lo permite. ContentNotAvailablese mapea anull.- Otros errores de Rust rechazan.
Ciclo de vida del perfilado de trabajo
Sección titulada «Ciclo de vida del perfilado de trabajo»- Sin inicio explícito: el perfilado está siempre activo cuando se ejecutan los helpers de tareas.
- Cada ámbito de tarea instrumentado registra una muestra al destruir la guarda.
- Las muestras sobrescriben las entradas más antiguas después de alcanzar la capacidad del buffer.
getWorkProfile(lastSeconds)lee una ventana de tiempo y deriva artefactos plegados/resumen/svg.
Transiciones de fallo:
- Fallo en la generación de SVG es un fallo suave (
svg: null), mientras que folded y summary aún se retornan. - Una ventana de muestras vacía retorna datos plegados vacíos y
svg: null, no un error.
Operaciones no soportadas y propagación de errores
Sección titulada «Operaciones no soportadas y propagación de errores»- Entrada de decodificación no soportada o bytes corruptos: fallo estricto (rechazo de promesa).
- ID de formato de codificación no soportado: fallo estricto.
- Sin ruta de respaldo de mejor esfuerzo en el wrapper de TS.
- Los errores de conversión son fallos estrictos (rechazo).
- La omisión de opciones se maneja con valores predeterminados de mejor esfuerzo, no como fallo.
Portapapeles
Sección titulada «Portapapeles»- La copia de texto es de mejor esfuerzo en la capa TS: los fallos operacionales se suprimen.
- La lectura de imagen distingue “sin imagen” (
null) de fallo operacional (rechazo). - Termux/Linux sin interfaz gráfica se tratan como contextos no soportados para lectura de imagen (
null).
Perfilado de trabajo
Sección titulada «Perfilado de trabajo»- La recuperación es estricta para la llamada a la función en sí, pero la generación de artefactos es parcialmente de mejor esfuerzo (
svgnullable). - El truncamiento del buffer es comportamiento esperado (buffer circular), no un error de pérdida de datos.
Consideraciones de plataforma
Sección titulada «Consideraciones de plataforma»- Texto del portapapeles: OSC 52 depende del soporte del terminal; el acceso nativo al portapapeles depende del entorno de escritorio/sesión.
- Lectura de imagen del portapapeles: bloqueada en TS para Termux y Linux sin servidor de pantalla.