- होम
- Documentation
- नेटिव
- नेटिव मीडिया + सिस्टम उपयोगिताएँ
नेटिव मीडिया + सिस्टम उपयोगिताएँ
यह दस्तावेज़ docs/natives-architecture.md में वर्णित system/media/conversion primitives परत का एक सबसिस्टम गहन-विश्लेषण है: 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नहीं है; work प्रोफाइलिंग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 (lossless एनकोडर)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 पहले OSC 52 (
\x1b]52;c;<base64>\x07) उत्सर्जित करता है जब stdout एक TTY हो। - फिर उसी टेक्स्ट को नेटिव क्लिपबोर्ड API (
native.copyToClipboard) के माध्यम से बेस्ट-एफ़र्ट प्रयास किया जाता है। - Termux पर, TS पहले
termux-clipboard-setका प्रयास करता है।
- TS पहले OSC 52 (
- इमेज रीड पथ:
- Rust
arboardसे रॉ इमेज पढ़ता है। - Rust इसे PNG बाइट्स (
imagecrate) में पुनः एन्कोड करता है,{ data: Uint8Array, mimeType: "image/png" }लौटाता है। - TS Termux पर या बिना डिस्प्ले सर्वर (
DISPLAY/WAYLAND_DISPLAYअनुपस्थित) वाले Linux सेशन पर जल्दीnullलौटाता है।
- Rust
Work प्रोफाइलिंग (work)
Section titled “Work प्रोफाइलिंग (work)”- संग्रह सीमा: प्रोफाइलिंग सैंपल
task::blockingऔरtask::futureमेंprofile_region(tag)गार्ड द्वारा उत्पन्न होते हैं। - स्टोरेज फ़ॉर्मेट: निश्चित आकार का सर्कुलर बफ़र (
MAX_SAMPLES = 10_000) जो स्टैक पाथ + अवधि (μs) + टाइमस्टैम्प (μs since process start) स्टोर करता है। - आउटपुट सीमा:
getWorkProfile(lastSeconds)ऑब्जेक्ट लौटाता है:folded: फ़ोल्डेड-स्टैक टेक्स्ट (flamegraph इनपुट)summary: markdown टेबल सारांशsvg: वैकल्पिक flamegraph SVGtotalMs,sampleCount
जीवनचक्र और स्टेट ट्रांज़िशन
Section titled “जीवनचक्र और स्टेट ट्रांज़िशन”इमेज जीवनचक्र
Section titled “इमेज जीवनचक्र”PhotonImage.parse(bytes)एक ब्लॉकिंग डिकोड टास्क (image.decode) शेड्यूल करता है।- सफलता पर, JS में एक नेटिव
PhotonImageहैंडल मौजूद होता है। resize(...)एक नया नेटिव हैंडल (image.resize) बनाता है, पुराने और नए हैंडल साथ-साथ रह सकते हैं।encode(...)इमेज डाइमेंशन को म्यूटेट किए बिना बाइट्स (image.encode) मटेरियलाइज़ करता है।
विफलता ट्रांज़िशन:
- फ़ॉर्मेट डिटेक्शन/डिकोड विफलता parse promise को रिजेक्ट करती है।
- एन्कोड विफलता encode promise को रिजेक्ट करती है।
- अमान्य फ़ॉर्मेट ID encode promise को रिजेक्ट करती है।
HTML जीवनचक्र
Section titled “HTML जीवनचक्र”htmlToMarkdown(html, options)एक ब्लॉकिंग रूपांतरण टास्क शेड्यूल करता है।- रूपांतरण डिफ़ॉल्ट विकल्पों (
cleanContent=false,skipImages=false) के साथ चलता है जब तक निर्दिष्ट न हो। - markdown स्ट्रिंग लौटाता है या रिजेक्ट करता है।
विफलता ट्रांज़िशन:
- कनवर्टर विफलता रिजेक्टेड promise लौटाती है (
Conversion error: ...)।
क्लिपबोर्ड जीवनचक्र
Section titled “क्लिपबोर्ड जीवनचक्र”copyToClipboard(text) जानबूझकर बेस्ट-एफ़र्ट और मल्टी-पाथ है:
- यदि TTY: OSC 52 राइट का प्रयास करें (base64 पेलोड)।
TERMUX_VERSIONसेट होने पर Termux कमांड आज़माएँ।- नेटिव
arboardटेक्स्ट कॉपी आज़माएँ। - TS लेयर पर एरर को निगल लें।
readImageFromClipboard() की सख्ती चरण के अनुसार भिन्न होती है:
- TS असमर्थित रनटाइम संदर्भों (Termux/headless Linux) को
nullपर हार्ड-गेट करता है। - Rust
arboardरीड केवल तभी चलती है जब TS इसकी अनुमति दे। ContentNotAvailableकोnullपर मैप किया जाता है।- अन्य Rust एरर रिजेक्ट करते हैं।
Work प्रोफाइलिंग जीवनचक्र
Section titled “Work प्रोफाइलिंग जीवनचक्र”- कोई स्पष्ट शुरुआत नहीं: जब टास्क हेल्पर्स निष्पादित होते हैं तो प्रोफाइलिंग हमेशा चालू रहती है।
- प्रत्येक इंस्ट्रूमेंटेड टास्क स्कोप गार्ड ड्रॉप पर एक सैंपल रिकॉर्ड करता है।
- बफ़र क्षमता पहुँचने के बाद सैंपल सबसे पुरानी एंट्री को ओवरराइट करते हैं।
getWorkProfile(lastSeconds)एक टाइम विंडो पढ़ता है और folded/summary/svg आर्टिफैक्ट निकालता है।
विफलता ट्रांज़िशन:
- SVG जनरेशन विफलता सॉफ्ट-फेल है (
svg: null), जबकि folded और summary फिर भी लौटते हैं। - खाली सैंपल विंडो खाली folded डेटा और
svg: nullलौटाती है, न कि एरर।
असमर्थित ऑपरेशन और एरर प्रोपेगेशन
Section titled “असमर्थित ऑपरेशन और एरर प्रोपेगेशन”- असमर्थित डिकोड इनपुट या दूषित बाइट्स: सख्त विफलता (promise रिजेक्शन)।
- असमर्थित एन्कोड फ़ॉर्मेट ID: सख्त विफलता।
- TS रैपर में कोई बेस्ट-एफ़र्ट फ़ॉलबैक पाथ नहीं।
- रूपांतरण एरर सख्त विफलताएँ हैं (रिजेक्शन)।
- विकल्प छोड़ना बेस्ट-एफ़र्ट डिफ़ॉल्टिंग है, विफलता नहीं।
क्लिपबोर्ड
Section titled “क्लिपबोर्ड”- टेक्स्ट कॉपी TS लेयर पर बेस्ट-एफ़र्ट है: ऑपरेशनल विफलताएँ दबाई जाती हैं।
- इमेज रीड “कोई इमेज नहीं” (
null) और ऑपरेशनल विफलता (रिजेक्शन) के बीच अंतर करता है। - Termux/headless Linux को इमेज रीड के लिए असमर्थित संदर्भ माना जाता है (
null)।
Work प्रोफाइलिंग
Section titled “Work प्रोफाइलिंग”- फ़ंक्शन कॉल के लिए रिट्रीवल सख्त है, लेकिन आर्टिफैक्ट जनरेशन आंशिक रूप से बेस्ट-एफ़र्ट है (
svgnullable)। - बफ़र ट्रंकेशन अपेक्षित व्यवहार है (ring buffer), डेटा हानि बग नहीं।
प्लेटफ़ॉर्म संबंधी चेतावनियाँ
Section titled “प्लेटफ़ॉर्म संबंधी चेतावनियाँ”- क्लिपबोर्ड टेक्स्ट: OSC 52 टर्मिनल समर्थन पर निर्भर करता है; नेटिव क्लिपबोर्ड एक्सेस डेस्कटॉप वातावरण/सेशन पर निर्भर करती है।
- क्लिपबोर्ड इमेज रीड: Termux और बिना डिस्प्ले सर्वर वाले Linux के लिए TS में ब्लॉक है।