- Início
- Documentation
- Nativos
- Utilitários nativos de mídia + sistema
Utilitários nativos de mídia + sistema
Este documento é um aprofundamento de subsistema para a camada de primitivos de sistema/mídia/conversão descrita em docs/natives-architecture.md: image, html, clipboard e perfilamento work.
Arquivos de implementação
Seção intitulada “Arquivos de implementação”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: não existe
crates/pi-natives/src/work.rs; o perfilamento de trabalho é implementado emprof.rse alimentado pela instrumentação emtask.rs.
Mapeamento de API TS ↔ exportação/módulo Rust
Seção intitulada “Mapeamento de API TS ↔ exportação/módulo Rust”| Exportação TS (packages/natives) | Exportação N-API 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 fallback TS | clipboard.rs + clipboard/index.ts |
readImageFromClipboard() | read_image_from_clipboard | clipboard.rs |
getWorkProfile(lastSeconds) | get_work_profile | prof.rs |
Limites de formato de dados e conversões
Seção intitulada “Limites de formato de dados e conversões”Imagem (image)
Seção intitulada “Imagem (image)”- Limite de entrada JS:
Uint8Arraycom bytes de imagem codificada. - Limite de decodificação Rust: os bytes são copiados para
Vec<u8>, o formato é inferido comImageReader::with_guessed_format(), então decodificado paraDynamicImage. - Estado em memória:
PhotonImagearmazenaArc<DynamicImage>. - Limite de saída:
encode(format, quality)retornaPromise<Uint8Array>(Vec<u8>no Rust).
IDs de formato são numéricos:
0: PNG1: JPEG2: WebP (codificador sem perdas)3: GIF
Restrições:
qualityé utilizado apenas para JPEG.- PNG/WebP/GIF ignoram
quality. - IDs de formato não suportados falham (
Invalid image format: <id>).
Conversão HTML (html)
Seção intitulada “Conversão HTML (html)”- Limite de entrada JS:
stringHTML + objeto opcional{ cleanContent?: boolean; skipImages?: boolean }. - Limite de conversão Rust: a entrada
Stringé convertida porhtml_to_markdown_rs::convert. - Limite de saída:
stringMarkdown.
Comportamento da conversão:
cleanContenttem valor padrãofalse.- Quando
cleanContent=true, o pré-processamento é habilitado comPreprocessingPreset::Aggressivee flags de remoção forçada para navegação/formulários. skipImagestem valor padrãofalse.
Área de transferência (clipboard)
Seção intitulada “Área de transferência (clipboard)”- Caminho de texto:
- O TS primeiro emite OSC 52 (
\x1b]52;c;<base64>\x07) quando stdout é um TTY. - O mesmo texto é então tentado via API nativa de área de transferência (
native.copyToClipboard) como melhor esforço. - No Termux, o TS tenta
termux-clipboard-setprimeiro.
- O TS primeiro emite OSC 52 (
- Caminho de leitura de imagem:
- O Rust lê a imagem bruta do
arboard. - O Rust recodifica para bytes PNG (crate
image), retorna{ data: Uint8Array, mimeType: "image/png" }. - O TS retorna
nullantecipadamente no Termux ou em sessões Linux sem servidor de exibição (DISPLAY/WAYLAND_DISPLAYausentes).
- O Rust lê a imagem bruta do
Perfilamento de trabalho (work)
Seção intitulada “Perfilamento de trabalho (work)”- Limite de coleta: amostras de perfilamento são produzidas por guardas
profile_region(tag)emtask::blockingetask::future. - Formato de armazenamento: buffer circular de tamanho fixo (
MAX_SAMPLES = 10_000) armazenando caminho de pilha + duração (μs) + timestamp (μs desde início do processo). - Limite de saída:
getWorkProfile(lastSeconds)retorna objeto:folded: texto de pilha empilhada (entrada para flamegraph)summary: tabela resumo em markdownsvg: SVG de flamegraph opcionaltotalMs,sampleCount
Ciclo de vida e transições de estado
Seção intitulada “Ciclo de vida e transições de estado”Ciclo de vida da imagem
Seção intitulada “Ciclo de vida da imagem”PhotonImage.parse(bytes)agenda uma tarefa de decodificação bloqueante (image.decode).- Em caso de sucesso, um handle nativo
PhotonImageexiste no JS. resize(...)cria um novo handle nativo (image.resize), handles antigos e novos podem coexistir.encode(...)materializa bytes (image.encode) sem alterar as dimensões da imagem.
Transições de falha:
- Falha na detecção de formato/decodificação rejeita a promise de parse.
- Falha na codificação rejeita a promise de encode.
- ID de formato inválido rejeita a promise de encode.
Ciclo de vida do HTML
Seção intitulada “Ciclo de vida do HTML”htmlToMarkdown(html, options)agenda uma tarefa de conversão bloqueante.- A conversão executa com opções padrão (
cleanContent=false,skipImages=false) a menos que especificado. - Retorna string markdown ou rejeita.
Transições de falha:
- Falha no conversor retorna promise rejeitada (
Conversion error: ...).
Ciclo de vida da área de transferência
Seção intitulada “Ciclo de vida da área de transferência”copyToClipboard(text) é intencionalmente melhor esforço e multi-caminho:
- Se TTY: tenta escrita OSC 52 (payload base64).
- Tenta comando Termux quando
TERMUX_VERSIONestá definido. - Tenta cópia de texto nativa via
arboard. - Suprime erros na camada TS.
readImageFromClipboard() possui rigor diferente por estágio:
- O TS bloqueia fortemente contextos de runtime não suportados (Termux/Linux headless) para
null. - A leitura
arboarddo Rust executa apenas quando o TS permite. ContentNotAvailableé mapeado paranull.- Outros erros do Rust rejeitam.
Ciclo de vida do perfilamento de trabalho
Seção intitulada “Ciclo de vida do perfilamento de trabalho”- Sem início explícito: o perfilamento está sempre ativo quando os helpers de tarefa executam.
- Cada escopo de tarefa instrumentado registra uma amostra no drop do guard.
- Amostras sobrescrevem as entradas mais antigas após a capacidade do buffer ser atingida.
getWorkProfile(lastSeconds)lê uma janela de tempo e deriva artefatos folded/summary/svg.
Transições de falha:
- Falha na geração de SVG é falha suave (
svg: null), enquanto folded e summary ainda retornam. - Janela de amostra vazia retorna dados folded vazios e
svg: null, não um erro.
Operações não suportadas e propagação de erros
Seção intitulada “Operações não suportadas e propagação de erros”- Entrada de decodificação não suportada ou bytes corrompidos: falha estrita (rejeição de promise).
- ID de formato de codificação não suportado: falha estrita.
- Sem caminho de fallback de melhor esforço no wrapper TS.
- Erros de conversão são falhas estritas (rejeição).
- Omissão de opções é padronização de melhor esforço, não falha.
Área de transferência
Seção intitulada “Área de transferência”- Cópia de texto é melhor esforço na camada TS: falhas operacionais são suprimidas.
- Leitura de imagem distingue “sem imagem” (
null) de falha operacional (rejeição). - Termux/Linux headless são tratados como contextos não suportados para leitura de imagem (
null).
Perfilamento de trabalho
Seção intitulada “Perfilamento de trabalho”- A recuperação é estrita para a chamada de função em si, mas a geração de artefatos é parcialmente melhor esforço (
svganulável). - Truncamento do buffer é comportamento esperado (buffer circular), não um bug de perda de dados.
Ressalvas de plataforma
Seção intitulada “Ressalvas de plataforma”- Texto da área de transferência: OSC 52 depende do suporte do terminal; o acesso nativo à área de transferência depende do ambiente de desktop/sessão.
- Leitura de imagem da área de transferência: bloqueada no TS para Termux e Linux sem servidor de exibição.