HN रिलीज़: WebAssembly QuickJS sandbox में JavaScript चलाना
(github.com/sebastianwessel)QuickJS - WebAssembly QuickJS sandbox में JavaScript चलाना
यह TypeScript पैकेज QuickJS engine का उपयोग करके WebAssembly sandbox के भीतर JavaScript कोड को सुरक्षित रूप से चलाने में मदद करता है। यह untrusted code को सुरक्षित रूप से isolate करके चलाने के लिए उपयुक्त है, और WebAssembly में compile किए गए हल्के और तेज़ QuickJS engine का उपयोग करके एक मज़बूत code execution environment प्रदान करता है।
विशेषताएँ
- सुरक्षा: untrusted JavaScript code को सुरक्षित और isolated environment में चलाया जा सकता है
- फ़ाइल सिस्टम: virtual file system को mount किया जा सकता है
- custom Node modules: custom Node modules को mount किया जा सकता है
- Fetch client: http(s) calls करने के लिए fetch client उपलब्ध कराया जा सकता है
- test runner: test runner और chai-आधारित
expectशामिल है - प्रदर्शन: हल्के और efficient QuickJS engine के फ़ायदों का उपयोग किया जा सकता है
- विविधता: मौजूदा TypeScript projects के साथ आसानी से integrate किया जा सकता है
- सरलता: sandbox के भीतर JavaScript code को चलाने और manage करने के लिए user-friendly API प्रदान करता है
पूरा दस्तावेज़ देखें
repository में examples खोजें
बुनियादी उपयोग
पैकेज का उपयोग करने का एक सरल उदाहरण नीचे दिया गया है:
import { quickJS } from '@sebastianwessel/quickjs'
// QuickJS wasm load और initialization जैसी सामान्य setup
// यह resource-intensive काम है, इसलिए संभव हो तो इसे केवल एक बार करना चाहिए
const { createRuntime } = await quickJS()
// हर बार js code चलाते समय runtime instance बनाया जाता है
const { evalCode } = await createRuntime({
allowFetch: true, // fetch inject करता है और code को data लाने की अनुमति देता है
allowFs: true, // virtual file system को mount करता है और node:fs module प्रदान करता है
env: {
MY_ENV_VAR: 'env var value'
},
})
const result = await evalCode(`
import { join } as path from 'path'
const fn = async ()=>{
console.log(join('src','dist')) // host system पर "src/dist" log करता है
console.log(env.MY_ENV_VAR) // host system पर "env var value" log करता है
const url = new URL('https://example.com')
const f = await fetch(url)
return f.text()
}
export default await fn()
`)
console.log(result) // { ok: true, data: '<!doctype html>\n<html>\n[....]</html>\n' }
क्रेडिट
यह लाइब्रेरी निम्न पर आधारित है:
- quickjs-emscripten
- quickjs-emscripten-sync
- memfs
- Chai
इस्तेमाल किए गए tools:
- Bun
- Biome
- Hono
- poolifier-web-worker
- tshy
- autocannon
लाइसेंस
यह प्रोजेक्ट MIT license के अंतर्गत है।
यह पैकेज उन developers के लिए आदर्श है जो TypeScript applications के भीतर JavaScript code को सुरक्षित रूप से चलाना चाहते हैं, और QuickJS WebAssembly sandbox के माध्यम से performance और security सुनिश्चित करता है।
GN⁺ का सार
यह लेख QuickJS engine का उपयोग करके WebAssembly sandbox में JavaScript code को सुरक्षित रूप से चलाने का तरीका समझाता है। यह untrusted code को isolate करके चलाने में बहुत उपयोगी है। QuickJS हल्का होने के साथ तेज़ प्रदर्शन भी देता है, और TypeScript projects के साथ आसानी से integrate होने का लाभ प्रदान करता है। इसी तरह की सुविधाएँ देने वाले प्रोजेक्ट्स में Deno और Node.js शामिल हैं।
1 टिप्पणियां
Hacker News टिप्पणियाँ
quickjs-emscripten लाइब्रेरी के लेखक ने लाइब्रेरी की standard library की प्रशंसा की
fetchfunction वाले ही cookies का उपयोग करकेfetchcall करने देती हैपिछली नौकरी में quickjs-emscripten का उपयोग करते हुए कई "segmentation faults" और errors का अनुभव हुआ
JavaScript को sandbox करने के कई तरीके हैं
पूछा कि क्या यह browser में चल सकता है
quickjs आज़माया था, लेकिन अंततः isolated-vm चुना
एक अन्य JS sandbox library के लेखक ने quickjs-emscripten के approach को दिलचस्प बताया
createRuntimefetchके अलावा host environment के लिए calls define कर सकता हैलगा कि इस लाइब्रेरी के जरिए user द्वारा दिया गया JS code चलाया जा सकता है
कहा कि QuickJS का performance host JS VM से प्रतिस्पर्धा नहीं कर सकता
quickjs-emscripten के लिए high-level wrapper पर काम कर रहे थे
require()support लागू करना कठिन थाquickjs-emscripten-sync लाइब्रेरी host और guest functions का automatic synchronization देती है, जो एक बड़ा attack surface बन सकता है
पूछा कि क्या wasm में compile होने के कारण यह browser में चल सकता है