Documentation
¶
Overview ¶
Package ramune provides Go bindings for JavaScriptCore via purego — no Cgo required. The JSC runtime is dynamically loaded at startup and works with the system framework on macOS and libjavascriptcoregtk on Linux.
Basic Usage ¶
Evaluate JavaScript and read results:
rt, err := ramune.New()
if err != nil {
log.Fatal(err)
}
defer rt.Close()
val, err := rt.Eval("1 + 2")
if err != nil {
log.Fatal(err)
}
defer val.Close()
fmt.Println(val.Float64()) // 3
Constructing Objects ¶
Create JS objects and arrays directly from Go:
obj, _ := rt.NewObject(map[string]any{"name": "Alice", "age": 30})
arr, _ := rt.NewArray(1, "two", true)
obj.SetAttr("tags", arr)
Go Callbacks ¶
Register Go functions callable from JavaScript:
rt.RegisterFunc("add", func(args []any) (any, error) {
return args[0].(float64) + args[1].(float64), nil
})
val, _ := rt.Eval("add(3, 4)") // 7
npm Packages ¶
Use npm packages via automatic esbuild bundling:
rt, _ := ramune.New(
ramune.NodeCompat(),
ramune.Dependencies("lodash@4"),
)
val, _ := rt.Eval(`lodash.chunk([1,2,3,4,5,6], 2)`)
Event Loop and Async ¶
setTimeout, setInterval, and Promises work with the built-in event loop:
val, _ := rt.EvalAsync(`
new Promise(resolve => setTimeout(() => resolve(42), 100))
`)
fmt.Println(val.Float64()) // 42
Fetch ¶
HTTP requests via globalThis.fetch backed by Go's net/http:
rt, _ := ramune.New(ramune.WithFetch())
val, _ := rt.EvalAsync(`
fetch("https://api.example.com/data").then(r => r.json())
`)
Index ¶
- Variables
- func ClearCache() error
- func Register[F any](rt *Runtime, name string, fn F) error
- type CallbackContext
- func (cc *CallbackContext) Eval(code string) (any, error)
- func (cc *CallbackContext) EvalBool(code string) (bool, error)
- func (cc *CallbackContext) EvalFloat64(code string) (float64, error)
- func (cc *CallbackContext) EvalString(code string) (string, error)
- func (cc *CallbackContext) Exec(code string) error
- func (cc *CallbackContext) GetProperty(name string) (any, error)
- func (cc *CallbackContext) SetProperty(name string, value any) error
- type GCConfig
- type GoFunc
- type GoFuncWithContext
- type JSError
- type LibraryNotFoundError
- type Module
- type Option
- type PermissionState
- type Permissions
- type Runtime
- func (r *Runtime) Bind(name string, v any) error
- func (r *Runtime) Close() error
- func (r *Runtime) Eval(code string) (*Value, error)
- func (r *Runtime) EvalAsync(code string) (*Value, error)
- func (r *Runtime) EvalAsyncWithContext(ctx context.Context, code string) (*Value, error)
- func (r *Runtime) EvalWithContext(ctx context.Context, code string) (*Value, error)
- func (r *Runtime) Exec(code string) error
- func (r *Runtime) GlobalObject() *Value
- func (r *Runtime) LoadModule(m Module) error
- func (r *Runtime) NewArray(items ...any) (*Value, error)
- func (r *Runtime) NewObject(props map[string]any) (*Value, error)
- func (r *Runtime) NewUint8Array(data []byte) (*Value, error)
- func (r *Runtime) RegisterFunc(name string, fn GoFunc) error
- func (r *Runtime) RegisterFuncWithContext(name string, fn GoFuncWithContext) error
- func (r *Runtime) RunEventLoop() error
- func (r *Runtime) RunEventLoopFor(timeout time.Duration) error
- func (r *Runtime) RunEventLoopWithContext(ctx context.Context) error
- func (r *Runtime) Tick() (bool, error)
- func (r *Runtime) Wake()
- type RuntimePool
- func (p *RuntimePool) Addr() string
- func (p *RuntimePool) Broadcast(code string) error
- func (p *RuntimePool) Close() error
- func (p *RuntimePool) Eval(code string) (*Value, error)
- func (p *RuntimePool) Exec(code string) error
- func (p *RuntimePool) ListenAndServe(addr string, jsHandler string) error
- func (p *RuntimePool) Size() int
- func (p *RuntimePool) StopHTTP()
- type Value
- func (v *Value) Attr(name string) *Value
- func (v *Value) AttrErr(name string) (*Value, error)
- func (v *Value) Bool() (bool, error)
- func (v *Value) Bytes() ([]byte, error)
- func (v *Value) Call(args ...any) (*Value, error)
- func (v *Value) Close() error
- func (v *Value) Delete(name string) error
- func (v *Value) Float64() (float64, error)
- func (v *Value) GoString() (string, error)
- func (v *Value) Has(name string) bool
- func (v *Value) Index(i int) *Value
- func (v *Value) Int64() (int64, error)
- func (v *Value) IsArray() bool
- func (v *Value) IsFunction() bool
- func (v *Value) IsNull() bool
- func (v *Value) IsUndefined() bool
- func (v *Value) Keys() ([]string, error)
- func (v *Value) Len() (int, error)
- func (v *Value) Ptr() uintptr
- func (v *Value) SetAttr(name string, val any) error
- func (v *Value) String() string
- func (v *Value) ToMap() (map[string]any, error)
- func (v *Value) ToSlice() ([]any, error)
Constants ¶
This section is empty.
Variables ¶
var ErrAlreadyClosed = errors.New("ramune: runtime already closed")
ErrAlreadyClosed is returned when operations are attempted on a closed Runtime.
var ErrJSCNotFound = errors.New("ramune: shared library not found")
ErrJSCNotFound is returned when no suitable JavaScriptCore shared library can be located on the system.
var ErrNilValue = errors.New("ramune: operation on nil Value")
ErrNilValue is returned when an operation is attempted on a nil Value.
Functions ¶
func ClearCache ¶
func ClearCache() error
ClearCache removes all cached JS bundles created by Dependencies().
func Register ¶
Register registers a typed Go function as a global JavaScript function. Unlike RegisterFunc, which requires manual args[]any casting, Register uses reflection to automatically convert JS arguments to the function's parameter types and convert return values back.
Supported parameter types: float64, float32, int, int8/16/32/64, uint, uint8/16/32/64, string, bool, map[string]any, []any.
Supported return signatures:
- func(...) → no return value
- func(...) T → single return value (non-error)
- func(...) error → single error return
- func(...) (T, error) → value + error
Example:
ramune.Register(rt, "add", func(a, b float64) float64 {
return a + b
})
Types ¶
type CallbackContext ¶
type CallbackContext struct {
// contains filtered or unexported fields
}
CallbackContext provides safe access to JSC from within a GoFunc. Value methods like Attr() and Call() dispatch to the JSC goroutine, which deadlocks inside a callback (already on the JSC goroutine). CallbackContext calls JSC functions directly and returns Go values.
func (*CallbackContext) Eval ¶
func (cc *CallbackContext) Eval(code string) (any, error)
Eval evaluates JS code and returns the result as any (Go value).
func (*CallbackContext) EvalBool ¶
func (cc *CallbackContext) EvalBool(code string) (bool, error)
EvalBool evaluates JS code and returns the result as bool.
func (*CallbackContext) EvalFloat64 ¶
func (cc *CallbackContext) EvalFloat64(code string) (float64, error)
EvalFloat64 evaluates JS code and returns the result as float64.
func (*CallbackContext) EvalString ¶
func (cc *CallbackContext) EvalString(code string) (string, error)
EvalString evaluates JS code and returns the result as string.
func (*CallbackContext) Exec ¶
func (cc *CallbackContext) Exec(code string) error
Exec executes JavaScript code, discarding the result.
func (*CallbackContext) GetProperty ¶
func (cc *CallbackContext) GetProperty(name string) (any, error)
GetProperty reads a property from the global object.
func (*CallbackContext) SetProperty ¶
func (cc *CallbackContext) SetProperty(name string, value any) error
SetProperty sets a property on the global object.
type GCConfig ¶
type GCConfig struct {
// DisableAutoGC disables Go's automatic GC while the HTTP server is
// running. Manual GC is triggered every GCInterval requests.
// Default: true (for HTTP server stability).
DisableAutoGC bool
// GCInterval is the number of HTTP requests between manual GC cycles.
// Lower values use more CPU but prevent memory growth.
// Default: 5000. Set to 0 to disable manual GC.
GCInterval int
// GCPercent sets the Go GC target percentage (same as GOGC env var).
// Only used when DisableAutoGC is false.
// Default: 100 (Go's default). Set to -1 to disable GC entirely.
GCPercent int
}
GCConfig controls garbage collection behavior for JSC interoperability. Go's concurrent GC can corrupt JSC's internal structures under high load. These settings allow tuning the tradeoff between performance and stability.
func DefaultGCConfig ¶
func DefaultGCConfig() GCConfig
DefaultGCConfig returns the default GC configuration.
type GoFunc ¶
GoFunc is a Go function that can be called from JavaScript. Arguments are converted to Go types: bool, float64, string, nil, map[string]any (for objects), or []any (for arrays).
type GoFuncWithContext ¶
type GoFuncWithContext func(ctx *CallbackContext, args []any) (any, error)
GoFuncWithContext is a callback that receives a CallbackContext for safe JSC access. Use RegisterFuncWithContext to register these.
type JSError ¶
type JSError struct {
Context string
Message string
Stack string // JavaScript stack trace, if available
}
JSError represents an error that originated in the JavaScript runtime.
type LibraryNotFoundError ¶
type LibraryNotFoundError struct {
Searched []string
}
LibraryNotFoundError provides detailed information about which paths were searched when JavaScriptCore could not be found.
func (*LibraryNotFoundError) Error ¶
func (e *LibraryNotFoundError) Error() string
func (*LibraryNotFoundError) Unwrap ¶
func (e *LibraryNotFoundError) Unwrap() error
type Module ¶
type Module struct {
// Name is the module name used with require('name').
Name string
// Exports maps JS property names to Go functions.
// Each function becomes a property on the module object.
Exports map[string]GoFunc
// Init is called after exports are registered, allowing
// additional setup such as evaluating JS code.
// The Runtime's JSC lock is held — use execLocked/evalLocked only.
Init func(rt *Runtime) error
}
Module defines a custom module that can be loaded via require() in JS.
type Option ¶
type Option func(*config)
Option configures a Runtime.
func Dependencies ¶
Dependencies declares npm package dependencies that are automatically installed, bundled with esbuild, and evaluated in the JSC context. Packages are specified as "name" or "name@version" (e.g., "lodash@4"). The bundle is cached in ~/.cache/ramune/jsbundles/<hash>/. Packages are fetched directly from the npm registry — no npm or bun required.
func NodeCompat ¶
func NodeCompat() Option
NodeCompat installs a minimal Node.js compatibility layer into the JSC context. This enables npm packages that depend on Node.js built-ins to run in JSC with Go providing the native functionality.
Supported polyfills:
- require() — returns polyfilled modules
- process.env, process.cwd(), process.platform, process.arch
- child_process.spawnSync / execSync (synchronous only)
- fs.readFileSync, fs.existsSync, fs.writeFileSync, fs.mkdirSync
- path.join, path.resolve, path.dirname, path.basename, path.sep
- Buffer.from (basic)
- console.log, console.error, console.warn
- setTimeout (immediate execution, no real delay)
func WithFetch ¶
func WithFetch() Option
WithFetch installs a globalThis.fetch polyfill backed by Go's net/http. This is also automatically enabled when NodeCompat() is used.
func WithGC ¶
WithGC configures garbage collection behavior. See GCConfig for details on each setting.
func WithLibraryPath ¶
WithLibraryPath sets an explicit path to the JavaScriptCore shared library.
func WithModule ¶
WithModule returns an Option that registers a module during Runtime creation. The module is available via require('name') if NodeCompat is enabled.
func WithPermissions ¶
func WithPermissions(p *Permissions) Option
WithPermissions sets the permission policy for the Runtime.
type PermissionState ¶
type PermissionState int
PermissionState represents the state of a permission.
const ( PermGranted PermissionState = iota PermDenied )
type Permissions ¶
type Permissions struct {
Read PermissionState
Write PermissionState
Net PermissionState
Env PermissionState
Run PermissionState
ReadPaths []string // allowed read paths (empty = all if granted)
WritePaths []string // allowed write paths
NetHosts []string // allowed network hosts
EnvVars []string // allowed env var names
RunCmds []string // allowed commands
}
Permissions controls access to system resources. Default is all granted (Bun-compatible). Use WithSandbox() to deny by default.
func AllPermissions ¶
func AllPermissions() *Permissions
AllPermissions returns permissions with everything granted.
func SandboxPermissions ¶
func SandboxPermissions() *Permissions
SandboxPermissions returns permissions with everything denied.
func (*Permissions) CheckEnv ¶
func (p *Permissions) CheckEnv(name string) error
CheckEnv checks if accessing the given env var is allowed.
func (*Permissions) CheckNet ¶
func (p *Permissions) CheckNet(host string) error
CheckNet checks if network access to the given host is allowed.
func (*Permissions) CheckRead ¶
func (p *Permissions) CheckRead(path string) error
CheckRead checks if reading the given path is allowed.
func (*Permissions) CheckRun ¶
func (p *Permissions) CheckRun(cmd string) error
CheckRun checks if running the given command is allowed.
func (*Permissions) CheckWrite ¶
func (p *Permissions) CheckWrite(path string) error
CheckWrite checks if writing to the given path is allowed.
type Runtime ¶
type Runtime struct {
// contains filtered or unexported fields
}
Runtime holds a loaded JavaScriptCore library and a global JS context. Multiple Runtimes can coexist in the same process — each gets a dedicated OS thread for JSC access. All JSC operations are dispatched to this thread via a channel, ensuring thread identity across calls (required by JSC). The Runtime is safe for concurrent use from multiple goroutines.
func New ¶
New creates a new JavaScriptCore runtime with a fresh global context. Each Runtime gets a dedicated OS thread for all JSC operations, ensuring thread identity across calls. Multiple Runtimes can coexist safely.
func (*Runtime) Bind ¶
Bind exposes a Go struct as a JavaScript object on globalThis. Exported struct fields become JS properties (read from current Go state), and methods on the pointer receiver become callable JS functions.
Field naming: if a field has a `js:"name"` tag, that name is used; otherwise the first letter is lowercased (e.g. Name → name).
Method naming: Go method names are converted to camelCase (e.g. Greet → greet, SetAge → setAge).
Fields are backed by the Go struct: reading a property in JS always returns the current Go value. Setting a property in JS updates the Go struct. Methods that mutate the struct are reflected on subsequent property reads.
func (*Runtime) EvalAsync ¶
EvalAsync evaluates JavaScript code that may return a Promise, runs the event loop until the Promise resolves, and returns the result.
func (*Runtime) EvalAsyncWithContext ¶
EvalAsyncWithContext evaluates JavaScript code that may return a Promise, runs the event loop until the Promise resolves or the context is cancelled/expired, and returns the result.
func (*Runtime) EvalWithContext ¶
EvalWithContext evaluates JavaScript code and returns the result, respecting the provided context for cancellation and deadlines. Since JSC cannot be interrupted mid-execution, the context is checked before evaluation begins. For timeout control over async operations, use EvalAsyncWithContext instead.
func (*Runtime) GlobalObject ¶
GlobalObject returns the global object for this context.
func (*Runtime) LoadModule ¶
LoadModule registers a module on an existing Runtime.
func (*Runtime) NewUint8Array ¶
NewUint8Array creates a JavaScript Uint8Array containing a copy of the given bytes.
func (*Runtime) RegisterFunc ¶
RegisterFunc registers a Go function as a global JavaScript function.
func (*Runtime) RegisterFuncWithContext ¶
func (r *Runtime) RegisterFuncWithContext(name string, fn GoFuncWithContext) error
RegisterFuncWithContext registers a Go function that receives a CallbackContext, allowing safe JSC access from within the callback without deadlocking.
func (*Runtime) RunEventLoop ¶
RunEventLoop processes the event loop until all timers complete. Default timeout is 30 seconds.
func (*Runtime) RunEventLoopFor ¶
RunEventLoopFor processes the event loop until all timers complete or the timeout is reached.
func (*Runtime) RunEventLoopWithContext ¶
RunEventLoopWithContext processes the event loop until all timers complete or the context is cancelled/expired.
type RuntimePool ¶
type RuntimePool struct {
// contains filtered or unexported fields
}
RuntimePool manages multiple Runtimes for parallel JS execution. Each Runtime has its own dedicated OS thread and independent JSC VM.
func NewPool ¶
func NewPool(n int, opts ...Option) (*RuntimePool, error)
NewPool creates a pool of n Runtimes, each configured with the given options.
func (*RuntimePool) Addr ¶
func (p *RuntimePool) Addr() string
Addr returns the listener address, or "" if not listening.
func (*RuntimePool) Broadcast ¶
func (p *RuntimePool) Broadcast(code string) error
Broadcast executes JavaScript code on all workers in parallel.
func (*RuntimePool) Close ¶
func (p *RuntimePool) Close() error
Close stops the HTTP server (if running) and closes all Runtimes.
func (*RuntimePool) Eval ¶
func (p *RuntimePool) Eval(code string) (*Value, error)
Eval evaluates JavaScript code on the next available worker.
func (*RuntimePool) Exec ¶
func (p *RuntimePool) Exec(code string) error
Exec executes JavaScript code on the next available worker, discarding the result.
func (*RuntimePool) ListenAndServe ¶
func (p *RuntimePool) ListenAndServe(addr string, jsHandler string) error
ListenAndServe starts an HTTP server that dispatches requests round-robin across pool workers via per-worker channels.
func (*RuntimePool) Size ¶
func (p *RuntimePool) Size() int
Size returns the number of workers in the pool.
func (*RuntimePool) StopHTTP ¶
func (p *RuntimePool) StopHTTP()
StopHTTP stops the HTTP server and drains in-flight requests.
type Value ¶
type Value struct {
// contains filtered or unexported fields
}
Value wraps a JavaScriptCore JSValueRef with lifecycle management. Call Close() to unprotect the value.
func (*Value) Attr ¶
Attr returns a property by name from the JS object. Returns nil if this is not an object or the property doesn't exist.
func (*Value) Close ¶
Close queues the JSValueRef for unprotection at the next safe point. Uses the unprotectQueue to avoid deadlock when called from GoFunc callbacks (which already run on the dedicated JSC goroutine). Safe to call multiple times or on nil.
func (*Value) Int64 ¶
Int64 returns the value as an int64 (truncated from float64, since JS has no integer type).
func (*Value) IsFunction ¶
IsFunction reports whether this value is a JavaScript function.
func (*Value) IsUndefined ¶
IsUndefined reports whether this value is JavaScript undefined.
func (*Value) Len ¶
Len returns the "length" property as an integer. Works for arrays, strings, and any object with a length property.
Source Files
¶
- asyncnet.go
- asyncspawn.go
- bind.go
- buncompat.go
- bundle.go
- callback.go
- callbackctx.go
- convert.go
- detect.go
- detect_linux.go
- dns.go
- errors.go
- eventloop.go
- fetch.go
- jsc.go
- module.go
- nodecompat.go
- nodecompat_crypto.go
- nodecompat_fs.go
- nodecompat_misc.go
- nodecompat_path.go
- permissions.go
- pool.go
- register.go
- signal_linux_cgo.go
- sqlite.go
- value.go
- websocket.go
- worker.go
Directories
¶
| Path | Synopsis |
|---|---|
|
bench
|
|
|
pool
command
|
|
|
cmd
|
|
|
ramune
command
Command ramune is a JavaScript runtime powered by JavaScriptCore via purego.
|
Command ramune is a JavaScript runtime powered by JavaScriptCore via purego. |
|
internal
|
|
|
tsgo/bundled
Package bundled provides access to files bundled with TypeScript.
|
Package bundled provides access to files bundled with TypeScript. |
|
tsgo/compiler
Package compiler implements the TypeScript compiler.
|
Package compiler implements the TypeScript compiler. |
|
tsgo/diagnostics
Package diagnostics contains generated localizable diagnostic messages.
|
Package diagnostics contains generated localizable diagnostic messages. |
|
tsgo/jsnum
Package jsnum provides JS-like number handling.
|
Package jsnum provides JS-like number handling. |
|
tsgo/nodebuilder
Exports interfaces and types defining the node builder - concrete implementations are on top of the checker, but these types and interfaces are used by the emit resolver in the printer
|
Exports interfaces and types defining the node builder - concrete implementations are on top of the checker, but these types and interfaces are used by the emit resolver in the printer |
|
tsgo/printer
Package printer exports a Printer for pretty-printing TS ASTs and writer interfaces and implementations for using them Intended ultimate usage:
|
Package printer exports a Printer for pretty-printing TS ASTs and writer interfaces and implementations for using them Intended ultimate usage: |
|
tsgo/stringutil
Package stringutil Exports common rune utilities for parsing and emitting javascript
|
Package stringutil Exports common rune utilities for parsing and emitting javascript |