- ホーム
- Documentation
- ネイティブ
- ネイティブメディア + システムユーティリティ
ネイティブメディア + システムユーティリティ
このドキュメントは、docs/natives-architecture.md で説明されているシステム/メディア/変換プリミティブレイヤーのサブシステム詳細解説です: image、html、clipboard、および work プロファイリング。
実装ファイル
Section titled “実装ファイル”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
注:
crates/pi-natives/src/work.rsは存在しません。ワークプロファイリングはprof.rsで実装され、task.rsのインストルメンテーションからデータが供給されます。
TS API ↔ Rust エクスポート/モジュールマッピング
Section titled “TS API ↔ Rust エクスポート/モジュールマッピング”| TS エクスポート (packages/natives) | Rust N-API エクスポート | 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 + TS フォールバックロジック | clipboard.rs + clipboard/index.ts |
readImageFromClipboard() | read_image_from_clipboard | clipboard.rs |
getWorkProfile(lastSeconds) | get_work_profile | prof.rs |
データフォーマット境界と変換
Section titled “データフォーマット境界と変換”画像 (image)
Section titled “画像 (image)”- JS 入力境界:
Uint8Arrayエンコード済み画像バイト。 - Rust デコード境界: バイトは
Vec<u8>にコピーされ、ImageReader::with_guessed_format()でフォーマットが推測された後、DynamicImageにデコードされます。 - インメモリ状態:
PhotonImageはArc<DynamicImage>を保持します。 - 出力境界:
encode(format, quality)はPromise<Uint8Array>(RustVec<u8>) を返します。
フォーマット ID は数値です:
0: PNG1: JPEG2: WebP (ロスレスエンコーダー)3: GIF
制約:
qualityは JPEG でのみ使用されます。- PNG/WebP/GIF は
qualityを無視します。 - サポートされていないフォーマット ID は失敗します (
Invalid image format: <id>)。
HTML 変換 (html)
Section titled “HTML 変換 (html)”- JS 入力境界: HTML
string+ オプションのオブジェクト{ cleanContent?: boolean; skipImages?: boolean }。 - Rust 変換境界:
String入力はhtml_to_markdown_rs::convertによって変換されます。 - 出力境界: Markdown
string。
変換の動作:
cleanContentのデフォルトはfalseです。cleanContent=trueの場合、PreprocessingPreset::Aggressiveによる前処理とナビゲーション/フォームのハード削除フラグが有効になります。skipImagesのデフォルトはfalseです。
クリップボード (clipboard)
Section titled “クリップボード (clipboard)”- テキストパス:
- TS はまず stdout が TTY の場合に OSC 52 (
\x1b]52;c;<base64>\x07) を出力します。 - 同じテキストがベストエフォートとしてネイティブクリップボード API (
native.copyToClipboard) 経由でも試行されます。 - Termux では、TS はまず
termux-clipboard-setを試行します。
- TS はまず stdout が TTY の場合に OSC 52 (
- 画像読み取りパス:
- Rust は
arboardから生の画像を読み取ります。 - Rust はそれを PNG バイトに再エンコードし (
imageクレート)、{ data: Uint8Array, mimeType: "image/png" }を返します。 - TS は Termux またはディスプレイサーバーのない Linux セッション (
DISPLAY/WAYLAND_DISPLAYが未設定) では早期にnullを返します。
- Rust は
ワークプロファイリング (work)
Section titled “ワークプロファイリング (work)”- 収集境界: プロファイリングサンプルは
task::blockingとtask::future内のprofile_region(tag)ガードによって生成されます。 - ストレージフォーマット: スタックパス + 期間 (
μs) + タイムスタンプ (プロセス開始からの μs) を格納する固定サイズのリングバッファ (MAX_SAMPLES = 10_000)。 - 出力境界:
getWorkProfile(lastSeconds)はオブジェクトを返します:folded: フォールドスタックテキスト (フレームグラフ入力)summary: マークダウンテーブルのサマリーsvg: オプションのフレームグラフ SVGtotalMs、sampleCount
ライフサイクルと状態遷移
Section titled “ライフサイクルと状態遷移”画像のライフサイクル
Section titled “画像のライフサイクル”PhotonImage.parse(bytes)はブロッキングデコードタスク (image.decode) をスケジュールします。- 成功時、ネイティブの
PhotonImageハンドルが JS に存在します。 resize(...)は新しいネイティブハンドル (image.resize) を作成し、古いハンドルと新しいハンドルは共存できます。encode(...)は画像の寸法を変更せずにバイトを具体化します (image.encode)。
失敗時の遷移:
- フォーマット検出/デコードの失敗は parse プロミスを拒否します。
- エンコードの失敗は encode プロミスを拒否します。
- 無効なフォーマット ID は encode プロミスを拒否します。
HTML のライフサイクル
Section titled “HTML のライフサイクル”htmlToMarkdown(html, options)はブロッキング変換タスクをスケジュールします。- 変換は指定がない限りデフォルトのオプション (
cleanContent=false、skipImages=false) で実行されます。 - マークダウン文字列を返すか、拒否します。
失敗時の遷移:
- コンバーターの失敗は拒否されたプロミスを返します (
Conversion error: ...)。
クリップボードのライフサイクル
Section titled “クリップボードのライフサイクル”copyToClipboard(text) は意図的にベストエフォートかつマルチパスです:
- TTY の場合: OSC 52 書き込み (base64 ペイロード) を試行します。
TERMUX_VERSIONが設定されている場合、Termux コマンドを試行します。- ネイティブの
arboardテキストコピーを試行します。 - TS レイヤーでエラーを吸収します。
readImageFromClipboard() はステージによって厳格さが異なります:
- TS はサポートされていないランタイムコンテキスト (Termux/ヘッドレス Linux) を
nullにハードゲートします。 - Rust の
arboard読み取りは TS が許可した場合のみ実行されます。 ContentNotAvailableはnullにマップされます。- その他の Rust エラーは拒否されます。
ワークプロファイリングのライフサイクル
Section titled “ワークプロファイリングのライフサイクル”- 明示的な開始はありません: タスクヘルパーが実行される際にプロファイリングは常にオンです。
- インストルメンテーションされたすべてのタスクスコープは、ガードのドロップ時に1つのサンプルを記録します。
- バッファ容量に達した後、サンプルは最も古いエントリを上書きします。
getWorkProfile(lastSeconds)は時間ウィンドウを読み取り、フォールド/サマリー/SVG アーティファクトを生成します。
失敗時の遷移:
- SVG 生成の失敗はソフトフェイルです (
svg: null)。フォールドとサマリーは引き続き返されます。 - 空のサンプルウィンドウは空のフォールドデータと
svg: nullを返し、エラーにはなりません。
サポートされていない操作とエラー伝播
Section titled “サポートされていない操作とエラー伝播”- サポートされていないデコード入力または破損したバイト: 厳格な失敗 (プロミスの拒否)。
- サポートされていないエンコードフォーマット ID: 厳格な失敗。
- TS ラッパーにベストエフォートのフォールバックパスはありません。
- 変換エラーは厳格な失敗 (拒否) です。
- オプションの省略はベストエフォートのデフォルト設定であり、失敗ではありません。
クリップボード
Section titled “クリップボード”- テキストコピーは TS レイヤーでベストエフォートです: 操作上の失敗は抑制されます。
- 画像読み取りは「画像なし」(
null) と操作上の失敗 (拒否) を区別します。 - Termux/ヘッドレス Linux は画像読み取りのサポートされていないコンテキストとして扱われます (
null)。
ワークプロファイリング
Section titled “ワークプロファイリング”- 取得は関数呼び出し自体に対しては厳格ですが、アーティファクト生成は部分的にベストエフォートです (
svgは null 許容)。 - バッファの切り捨ては期待される動作 (リングバッファ) であり、データ損失のバグではありません。
プラットフォームの注意事項
Section titled “プラットフォームの注意事項”- クリップボードテキスト: OSC 52 はターミナルのサポートに依存します。ネイティブクリップボードアクセスはデスクトップ環境/セッションに依存します。
- クリップボード画像読み取り: Termux およびディスプレイサーバーのない Linux では TS でブロックされます。