HN Open: Ejecutar JavaScript en un sandbox de QuickJS con WebAssembly
(github.com/sebastianwessel)QuickJS - Ejecutar JavaScript en un sandbox de QuickJS con WebAssembly
Este paquete de TypeScript permite ejecutar código JavaScript de forma segura dentro de un sandbox de WebAssembly usando el motor QuickJS. Es ideal para aislar y ejecutar código no confiable de manera segura, y aprovecha el motor QuickJS, ligero y rápido, compilado a WebAssembly para ofrecer un entorno sólido de ejecución de código.
Características
- Seguridad: permite ejecutar código JavaScript no confiable en un entorno seguro y aislado
- Sistema de archivos: se puede montar un sistema de archivos virtual
- Módulos Node personalizados: se pueden montar módulos Node personalizados
- Cliente Fetch: se puede proporcionar un cliente
fetchpara realizar llamadas http(s) - Test runner: incluye un test runner y
expectbasado en chai - Rendimiento: aprovecha las ventajas del motor QuickJS, ligero y eficiente
- Versatilidad: se integra fácilmente con proyectos TypeScript existentes
- Simplicidad: ofrece una API fácil de usar para ejecutar y administrar código JavaScript dentro del sandbox
Ver la documentación completa
Buscar ejemplos en el repositorio
Uso básico
Aquí hay un ejemplo sencillo de uso del paquete:
import { quickJS } from '@sebastianwessel/quickjs'
// Configuración general, como cargar e inicializar QuickJS wasm
// Como es una tarea intensiva en recursos, debería hacerse solo una vez si es posible
const { createRuntime } = await quickJS()
// Se crea una instancia de runtime cada vez que se ejecuta código js
const { evalCode } = await createRuntime({
allowFetch: true, // inyecta fetch y permite que el código obtenga datos
allowFs: true, // monta un sistema de archivos virtual y proporciona el módulo node:fs
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')) // registra "src/dist" en el sistema host
console.log(env.MY_ENV_VAR) // registra "env var value" en el sistema host
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' }
Créditos
Esta biblioteca se basa en:
- quickjs-emscripten
- quickjs-emscripten-sync
- memfs
- Chai
Herramientas utilizadas:
- Bun
- Biome
- Hono
- poolifier-web-worker
- tshy
- autocannon
Licencia
Este proyecto está bajo la licencia MIT.
Este paquete es ideal para desarrolladores que buscan ejecutar código JavaScript de forma segura dentro de aplicaciones TypeScript, y garantiza rendimiento y seguridad mediante el sandbox de QuickJS en WebAssembly.
Resumen de GN⁺
Este artículo explica cómo ejecutar código JavaScript de forma segura dentro de un sandbox de WebAssembly usando el motor QuickJS. Esto es muy útil para aislar y ejecutar código no confiable. QuickJS ofrece un rendimiento rápido a la vez que ligero, y tiene la ventaja de integrarse fácilmente con proyectos TypeScript. Proyectos como Deno y Node.js ofrecen funcionalidades similares.
1 comentarios
Comentarios de Hacker News
El autor de la librería quickjs-emscripten elogia la biblioteca estándar de la librería
fetchusando las mismas cookies que la funciónfetchdel hostEn un trabajo anterior, experimentó muchos "segmentation faults" y errores al usar quickjs-emscripten
Hay varias maneras de hacer sandboxing de JavaScript
Pregunta si puede ejecutarse en el navegador
Había probado quickjs, pero al final eligió isolated-vm
El autor de otra librería de sandbox para JS considera interesante el enfoque de quickjs-emscripten
createRuntimepuede definir llamadas al entorno host además defetchCree que esta librería permitiría ejecutar código JS proporcionado por usuarios
Menciona que el rendimiento de QuickJS no puede competir con el VM de JS del host
Estaba trabajando en un wrapper de alto nivel para quickjs-emscripten
require()La librería quickjs-emscripten-sync proporciona sincronización automática entre funciones del host y del invitado, lo que podría representar una gran superficie de ataque
Pregunta si puede ejecutarse en el navegador porque fue compilado a wasm