go-spidermonkey
goccy氏が開発している、FirefoxのSpiderMonkey JavaScriptエンジンを純粋なGoで動かすライブラリ。「SpiderMonkey in pure Go — run untrusted JavaScript anywhere Go runs. No cgo, no WebAssembly runtime, one static binary.」を謳う。
仕組み
SpiderMonkeyを一度WebAssemblyにコンパイルし、それをwasm2go(Wasm→Go変換ツール。変換済みエンジンはgoccy/spidermonkeywasm2goとして提供されている)でGoのソースコードに変換している。この方式により:
- CGO不要(クロスコンパイルが容易、glibc依存がない)
- 別途Wasmランタイム(wasmtime, wazeroなど)を同梱する必要がない
- 単一の静的バイナリとして配布できる
主な用途: サンドボックスでのJS実行
信頼できないJavaScriptコードを安全に実行することに主眼が置かれている。
- ゲストスクリプトはファイルシステム・ネットワーク・環境変数に一切アクセスできない
- ホスト側から外部のwatchdogで暴走ループを強制停止可能
context.Contextによるキャンセル/タイムアウト制御Config.MaxMemoryBytesでメモリ上限を設定可能- 標準出力/エラー出力は
Config.Stdout/Stderrにリダイレクト
標準準拠性
公式のtest262準拠テストスイートで約98%(52,266/53,329件)パス。ES Modules、SharedArrayBuffer、Atomicsなどマルチエージェント関連の機能もサポートしている。
基本的な使い方
js, _ := spidermonkey.New(spidermonkey.Config{})
defer js.Close()
r, _ := js.Eval(context.Background(),
"[1, 2, 3].map(x => x * 2).join(',')")
fmt.Println(r.Value.String()) // 2,4,6
ライセンス
Go側のソースコードはMIT、SpiderMonkeyエンジン自体はMozilla Public License 2.0。
#go #javascript #sandbox #webassembly