- Startseite
- Documentation
- Nativ
- Native Media- und System-Dienstprogramme
Native Media- und System-Dienstprogramme
Dieses Dokument ist ein detaillierter Einblick in das Subsystem der System/Media/Konvertierungs-Primitiven-Schicht, die in docs/natives-architecture.md beschrieben wird: image, html, clipboard und work-Profiling.
Implementierungsdateien
Abschnitt betitelt „Implementierungsdateien“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
Hinweis: Es gibt keine
crates/pi-natives/src/work.rs; Work-Profiling ist inprof.rsimplementiert und wird durch Instrumentierung intask.rsgespeist.
TS-API ↔ Rust Export-/Modul-Zuordnung
Abschnitt betitelt „TS-API ↔ Rust Export-/Modul-Zuordnung“| TS-Export (packages/natives) | Rust N-API Export | Rust-Modul |
|---|---|---|
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 + TS-Fallback-Logik | clipboard.rs + clipboard/index.ts |
readImageFromClipboard() | read_image_from_clipboard | clipboard.rs |
getWorkProfile(lastSeconds) | get_work_profile | prof.rs |
Datenformat-Grenzen und Konvertierungen
Abschnitt betitelt „Datenformat-Grenzen und Konvertierungen“Bild (image)
Abschnitt betitelt „Bild (image)“- JS-Eingabegrenze:
Uint8Arraymit codierten Bildbytes. - Rust-Decodierungsgrenze: Bytes werden in
Vec<u8>kopiert, das Format wird mitImageReader::with_guessed_format()erkannt und dann zuDynamicImagedecodiert. - In-Memory-Zustand:
PhotonImagespeichertArc<DynamicImage>. - Ausgabegrenze:
encode(format, quality)gibtPromise<Uint8Array>zurück (RustVec<u8>).
Format-IDs sind numerisch:
0: PNG1: JPEG2: WebP (verlustfreier Encoder)3: GIF
Einschränkungen:
qualitywird nur für JPEG verwendet.- PNG/WebP/GIF ignorieren
quality. - Nicht unterstützte Format-IDs führen zu einem Fehler (
Invalid image format: <id>).
HTML-Konvertierung (html)
Abschnitt betitelt „HTML-Konvertierung (html)“- JS-Eingabegrenze: HTML
string+ optionales Objekt{ cleanContent?: boolean; skipImages?: boolean }. - Rust-Konvertierungsgrenze: Der
String-Input wird durchhtml_to_markdown_rs::convertkonvertiert. - Ausgabegrenze: Markdown
string.
Konvertierungsverhalten:
cleanContentist standardmäßigfalse.- Bei
cleanContent=truewird Vorverarbeitung mitPreprocessingPreset::Aggressiveund Hard-Removal-Flags für Navigation/Formulare aktiviert. skipImagesist standardmäßigfalse.
Zwischenablage (clipboard)
Abschnitt betitelt „Zwischenablage (clipboard)“- Text-Pfad:
- TS sendet zunächst OSC 52 (
\x1b]52;c;<base64>\x07), wenn stdout ein TTY ist. - Derselbe Text wird anschließend als Best-Effort über die native Zwischenablage-API (
native.copyToClipboard) versucht. - Unter Termux versucht TS zuerst
termux-clipboard-set.
- TS sendet zunächst OSC 52 (
- Bild-Lesepfad:
- Rust liest das Rohbild aus
arboard. - Rust re-codiert es zu PNG-Bytes (
image-Crate) und gibt{ data: Uint8Array, mimeType: "image/png" }zurück. - TS gibt frühzeitig
nullzurück bei Termux oder Linux-Sitzungen ohne Display-Server (fehlendeDISPLAY/WAYLAND_DISPLAY).
- Rust liest das Rohbild aus
Work-Profiling (work)
Abschnitt betitelt „Work-Profiling (work)“- Erfassungsgrenze: Profiling-Samples werden durch
profile_region(tag)-Guards intask::blockingundtask::futureerzeugt. - Speicherformat: Ringpuffer fester Größe (
MAX_SAMPLES = 10_000), der Stack-Pfad + Dauer (μs) + Zeitstempel (μs seit Prozessstart) speichert. - Ausgabegrenze:
getWorkProfile(lastSeconds)gibt ein Objekt zurück:folded: Folded-Stack-Text (Flamegraph-Eingabe)summary: Markdown-Tabellen-Zusammenfassungsvg: optionales Flamegraph-SVGtotalMs,sampleCount
Lebenszyklus und Zustandsübergänge
Abschnitt betitelt „Lebenszyklus und Zustandsübergänge“Bild-Lebenszyklus
Abschnitt betitelt „Bild-Lebenszyklus“PhotonImage.parse(bytes)plant eine blockierende Decodierungs-Aufgabe (image.decode).- Bei Erfolg existiert ein nativer
PhotonImage-Handle in JS. resize(...)erstellt einen neuen nativen Handle (image.resize), alter und neuer Handle können koexistieren.encode(...)materialisiert Bytes (image.encode), ohne die Bildabmessungen zu verändern.
Fehlerübergänge:
- Fehler bei Formaterkennung/Decodierung lehnt das Parse-Promise ab.
- Fehler bei der Codierung lehnt das Encode-Promise ab.
- Ungültige Format-ID lehnt das Encode-Promise ab.
HTML-Lebenszyklus
Abschnitt betitelt „HTML-Lebenszyklus“htmlToMarkdown(html, options)plant eine blockierende Konvertierungsaufgabe.- Die Konvertierung läuft mit Standardoptionen (
cleanContent=false,skipImages=false), sofern nicht anders angegeben. - Gibt einen Markdown-String zurück oder lehnt ab.
Fehlerübergänge:
- Konvertierungsfehler gibt ein abgelehntes Promise zurück (
Conversion error: ...).
Zwischenablage-Lebenszyklus
Abschnitt betitelt „Zwischenablage-Lebenszyklus“copyToClipboard(text) ist absichtlich Best-Effort und nutzt mehrere Pfade:
- Bei TTY: Versuch eines OSC-52-Schreibvorgangs (Base64-Payload).
- Versuch des Termux-Befehls, wenn
TERMUX_VERSIONgesetzt ist. - Versuch einer nativen
arboard-Textkopie. - Fehler werden auf TS-Ebene unterdrückt.
readImageFromClipboard() unterscheidet sich in der Strenge je nach Phase:
- TS blockiert nicht unterstützte Laufzeitkontexte (Termux/headless Linux) hart zu
null. - Rust
arboard-Lesevorgang wird nur ausgeführt, wenn TS es erlaubt. ContentNotAvailablewird aufnullabgebildet.- Andere Rust-Fehler führen zur Ablehnung.
Work-Profiling-Lebenszyklus
Abschnitt betitelt „Work-Profiling-Lebenszyklus“- Kein expliziter Start: Profiling ist immer aktiv, wenn Task-Helfer ausgeführt werden.
- Jeder instrumentierte Task-Scope zeichnet beim Drop des Guards ein Sample auf.
- Samples überschreiben die ältesten Einträge, nachdem die Pufferkapazität erreicht ist.
getWorkProfile(lastSeconds)liest ein Zeitfenster und leitet Folded-/Summary-/SVG-Artefakte ab.
Fehlerübergänge:
- SVG-Generierungsfehler ist ein Soft-Fail (
svg: null), während Folded und Summary weiterhin zurückgegeben werden. - Ein leeres Sample-Fenster gibt leere Folded-Daten und
svg: nullzurück, keinen Fehler.
Nicht unterstützte Operationen und Fehlerweiterleitung
Abschnitt betitelt „Nicht unterstützte Operationen und Fehlerweiterleitung“- Nicht unterstützte Decodierungs-Eingabe oder beschädigte Bytes: strikter Fehler (Promise-Ablehnung).
- Nicht unterstützte Encode-Format-ID: strikter Fehler.
- Kein Best-Effort-Fallback-Pfad im TS-Wrapper.
- Konvertierungsfehler sind strikte Fehler (Ablehnung).
- Fehlende Optionen werden als Best-Effort-Standardwerte behandelt, nicht als Fehler.
Zwischenablage
Abschnitt betitelt „Zwischenablage“- Textkopie ist Best-Effort auf TS-Ebene: Betriebsfehler werden unterdrückt.
- Bild-Lesevorgang unterscheidet zwischen “kein Bild” (
null) und Betriebsfehler (Ablehnung). - Termux/headless Linux werden als nicht unterstützte Kontexte für den Bild-Lesevorgang behandelt (
null).
Work-Profiling
Abschnitt betitelt „Work-Profiling“- Der Abruf ist strikt für den Funktionsaufruf selbst, aber die Artefakt-Generierung ist teilweise Best-Effort (
svgnullable). - Puffertrunkierung ist erwartetes Verhalten (Ringpuffer), kein Datenverlust-Bug.
Plattform-Hinweise
Abschnitt betitelt „Plattform-Hinweise“- Zwischenablage-Text: OSC 52 hängt von der Terminal-Unterstützung ab; nativer Zwischenablagezugriff hängt von der Desktop-Umgebung/Sitzung ab.
- Zwischenablage-Bild lesen: In TS blockiert für Termux und Linux ohne Display-Server.