HN no Show: Executando JavaScript em um sandbox QuickJS com WebAssembly
(github.com/sebastianwessel)QuickJS - Executando JavaScript em um sandbox QuickJS com WebAssembly
Este pacote TypeScript permite executar código JavaScript com segurança dentro de um sandbox WebAssembly usando o mecanismo QuickJS. É adequado para isolar e executar com segurança código não confiável e oferece um ambiente robusto de execução de código ao aproveitar o mecanismo QuickJS, leve e rápido, compilado para WebAssembly.
Recursos
- Segurança: permite executar código JavaScript não confiável em um ambiente seguro e isolado
- Sistema de arquivos: permite montar um sistema de arquivos virtual
- Módulos Node personalizados: permite montar módulos Node personalizados
- Cliente Fetch: pode fornecer um cliente fetch capaz de fazer chamadas http(s)
- Executor de testes: inclui um executor de testes e
expectbaseado em chai - Desempenho: aproveita as vantagens do mecanismo QuickJS, leve e eficiente
- Versatilidade: integra-se facilmente a projetos TypeScript existentes
- Simplicidade: fornece uma API amigável para executar e gerenciar código JavaScript dentro do sandbox
Ver documentação completa
Encontrar exemplos no repositório
Uso básico
A seguir, um exemplo simples de uso do pacote:
import { quickJS } from '@sebastianwessel/quickjs'
// Configuração geral, como carregar e inicializar o wasm do QuickJS
// Como é uma tarefa intensiva em recursos, deve ser feita apenas uma vez, se possível
const { createRuntime } = await quickJS()
// Cria uma instância de runtime sempre que o código JS for executado
const { evalCode } = await createRuntime({
allowFetch: true, // injeta fetch e permite que o código busque dados
allowFs: true, // monta um sistema de arquivos virtual e fornece o 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" no sistema do host
console.log(env.MY_ENV_VAR) // registra "env var value" no sistema do 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 é baseada em:
- quickjs-emscripten
- quickjs-emscripten-sync
- memfs
- Chai
Ferramentas utilizadas:
- Bun
- Biome
- Hono
- poolifier-web-worker
- tshy
- autocannon
Licença
Este projeto está sob a licença MIT.
Este pacote é ideal para desenvolvedores que desejam executar código JavaScript com segurança dentro de aplicações TypeScript, garantindo desempenho e segurança por meio do sandbox QuickJS em WebAssembly.
Resumo do GN⁺
Este artigo explica como executar código JavaScript com segurança dentro de um sandbox WebAssembly usando o mecanismo QuickJS. Isso é muito útil para isolar e executar código não confiável. O QuickJS oferece desempenho rápido apesar de ser leve, além da vantagem de se integrar facilmente a projetos TypeScript. Projetos como Deno e Node.js oferecem funcionalidades semelhantes.
1 comentários
Comentários do Hacker News
o autor da biblioteca quickjs-emscripten elogia a biblioteca padrão da biblioteca
fetchusando os mesmos cookies da funçãofetchdo hostem um emprego anterior, usou quickjs-emscripten e enfrentou muitos "segmentation faults" e erros
existem várias formas de fazer sandbox de JavaScript
pergunta se é possível executar no navegador
já usou quickjs, mas no fim escolheu isolated-vm
o autor de outra biblioteca de sandbox para JS acha a abordagem do quickjs-emscripten interessante
createRuntimepermite definir chamadas ao ambiente do host além defetchacha que esta biblioteca permitiria executar código JS fornecido pelo usuário
menciona que o desempenho do QuickJS não pode competir com a VM JS do host
estava trabalhando em um wrapper de alto nível para quickjs-emscripten
require()a biblioteca quickjs-emscripten-sync fornece sincronização automática entre funções do host e do convidado, o que pode representar uma grande superfície de ataque
pergunta se, por ter sido compilado para wasm, é possível executá-lo no navegador
fetchsem anexar cookies