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、SharedArrayBufferAtomicsなどマルチエージェント関連の機能もサポートしている。

基本的な使い方

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

出典

作成日時: 2026-08-15 20:42 / 更新日時: 2026-08-15 21:21