Every QuickBEAM runtime provides the globals listed below.
APIs marked with ★ are unique to QuickBEAM — they have no Web or Node.js
equivalent.
These are installed on every runtime, even with apis: false.
The bridge between JavaScript and the BEAM.
API
Description
Beam.call(name, ...args)
Call a named Elixir handler. Returns a Promise.
Beam.callSync(name, ...args)
Call a named Elixir handler, blocking the JS thread until it returns.
Beam.send(pid, message)
Send a message to a BEAM process. Fire-and-forget.
Beam.self()
Get the PID of the owning GenServer.
Beam.onMessage(callback)
Register a callback for incoming BEAM messages.
Beam.monitor(pid, callback)
Monitor a process. Callback fires with exit reason.
Beam.demonitor(ref)
Cancel a monitor.
Beam.peek(promise)
Read a promise's value synchronously. Returns the promise itself if pending. Native implementation via QuickJS JS_PromiseState.
Beam.peek.status(promise)
Returns 'fulfilled', 'rejected', or 'pending'.
Beam.version
QuickBEAM version string (lazy getter).
Beam.sleep(ms)
Async sleep. Returns a Promise.
Beam.sleepSync(ms)
Blocks the JS thread for the given milliseconds.
Beam.hash(data, range?)
Fast non-cryptographic hash via :erlang.phash2.
Beam.escapeHTML(str)
Escape & < > " ' for safe HTML insertion.
Beam.which(bin)
Find an executable on PATH. Returns absolute path or null.
Beam.randomUUIDv7()
Monotonic, sortable UUID v7.
Beam.deepEquals(a, b)
Deep structural equality check.
Beam.semver.satisfies(version, range)
Check version against a requirement (Elixir Version syntax).
Beam.semver.order(a, b)
Compare two semver strings. Returns -1, 0, 1, or null.
Beam.nodes()
List connected BEAM nodes (including self).
Beam.rpc(node, runtime, fn, ...args)
Call a function on a named runtime on a remote BEAM node.
Beam.spawn(script)
Spawn a new JS runtime process evaluating the given script. Returns PID.
Beam.register(name)
Register this runtime under a name for discovery.
Beam.whereis(name)
Look up a registered runtime by name. Returns PID or null.
Beam.link(pid)
Create a bidirectional link with another BEAM process.
Beam.unlink(pid)
Remove a bidirectional link.
Beam.systemInfo()
BEAM VM introspection: schedulers, memory, process count, OTP release.
Beam.processInfo()
Info about the owning GenServer: memory, reductions, message queue, status.
Beam.password.hash(pw, opts?)
Hash a password with PBKDF2-SHA256. Returns PHC-format string. Default 600k iterations.
Beam.password.verify(pw, hash)
Verify a password against a hash. Constant-time comparison.
Beam.nanoseconds()
Monotonic high-resolution timer via :erlang.monotonic_time(:nanosecond).
Beam.uniqueInteger()
Monotonically increasing unique integer via :erlang.unique_integer([:monotonic, :positive]).
Beam.makeRef()
Create a unique BEAM reference. Useful for request/reply correlation.
Beam.inspect(value)
Pretty-print any value via Kernel.inspect. Especially useful for opaque BeamPid/BeamRef.
API
Description
setTimeout(fn, ms, ...args)
Schedule a callback.
setInterval(fn, ms, ...args)
Schedule a repeating callback.
clearTimeout(id)
Cancel a timeout.
clearInterval(id)
Cancel an interval.
API
Description
console.log(...args)
Log to the BEAM (sends {:console, "log", message} to the owner).
console.info(...args)
Alias for console.log.
console.warn(...args)
Log with "warn" level.
console.error(...args)
Log with "error" level.
console.debug(...args)
Alias for console.log.
console.trace(...args)
Log with stack trace.
console.assert(cond, ...args)
Log error if condition is falsy.
console.time(label?)
Start a named timer.
console.timeLog(label?, ...args)
Log elapsed time.
console.timeEnd(label?)
Log elapsed time and remove timer.
console.count(label?)
Log invocation count.
console.countReset(label?)
Reset a counter.
console.dir(obj)
Log a JSON representation.
console.group(...args)
Increase indent.
console.groupEnd()
Decrease indent.
API
Description
TextEncoder
Encode strings to UTF-8. Native Zig implementation.
TextDecoder
Decode UTF-8 (and label aliases). Supports fatal and ignoreBOM options. Native Zig.
atob(data)
Decode a base64 string. Native Zig.
btoa(data)
Encode a string to base64. Native Zig.
API
Description
crypto.getRandomValues(typedArray)
Fill a typed array with cryptographically random values. Native Zig.
performance.now()
High-resolution monotonic timestamp in milliseconds. Native Zig.
queueMicrotask(fn)
Schedule a microtask.
structuredClone(value)
Deep clone via QuickJS serialization.
Browser APIs (apis: :browser)
Loaded by default. These are Web platform APIs backed by OTP.
API
Backed by
fetch(url, init?)
Req (Finch HTTP client)
Request
—
Response
—
Headers
—
API
Backed by
URL
Elixir :uri_string
URLSearchParams
—
API
Description
ReadableStream
—
ReadableStreamDefaultReader
—
WritableStream
—
WritableStreamDefaultWriter
—
TransformStream
—
TextEncoderStream
—
TextDecoderStream
—
API
Description
Blob
Pure TS. Supports all typed array variants, slice(), text(), arrayBuffer(), bytes(), stream().
File
Extends Blob with name and lastModified.
API
Description
Event
—
MessageEvent
—
CloseEvent
—
ErrorEvent
—
CustomEvent
—
EventTarget
—
API
Description
AbortController
—
AbortSignal
Supports timeout() and any() static methods.
API
Backed by
crypto.subtle.digest(algo, data)
:crypto.hash
crypto.subtle.generateKey(algo, ...)
:crypto.generate_key
crypto.subtle.sign(algo, key, data)
:crypto.sign
crypto.subtle.verify(algo, key, sig, data)
:crypto.verify
crypto.subtle.encrypt(algo, key, data)
:crypto.crypto_one_time_aead
crypto.subtle.decrypt(algo, key, data)
:crypto.crypto_one_time_aead
crypto.subtle.deriveBits(algo, key, len)
:crypto
crypto.subtle.deriveKey(algo, key, ...)
—
crypto.subtle.importKey(fmt, data, algo, ...)
—
crypto.subtle.exportKey(fmt, key)
—
crypto.randomUUID()
—
API
Backed by
BroadcastChannel
:pg (distributed process groups)
MessageChannel / MessagePort
—
WebSocket
Mint.WebSocket
EventSource
:httpc streaming
Worker
Spawns a separate BEAM GenServer with its own JS runtime
API
Backed by
localStorage.getItem/setItem/removeItem/clear/key/length
ETS (per-runtime namespace)
API
Backed by
navigator.locks.request(name, cb)
GenServer with monitors
navigator.locks.request(name, opts, cb)
Supports mode, ifAvailable, signal
navigator.locks.query()
—
API
Backed by
compression.compress(format, data)
:zlib
compression.decompress(format, data)
:zlib
CompressionStream
—
DecompressionStream
—
Formats: gzip, deflate, deflate-raw.
API
Description
performance.now()
Native Zig (see core globals).
performance.timeOrigin
—
performance.mark(name, opts?)
—
performance.measure(name, start?, end?)
—
performance.getEntries()
—
performance.getEntriesByType(type)
—
performance.getEntriesByName(name, type?)
—
performance.clearMarks(name?)
—
performance.clearMeasures(name?)
—
performance.toJSON()
—
API
Description
FormData
—
DOMException
—
Buffer
Node-compatible Buffer (available in browser mode too).
Node.js APIs (apis: :node)
Enable with apis: :node or apis: [:browser, :node].
API
Description
process.env
Live Proxy over System.get_env/put_env. Supports get, set, delete, in, Object.keys.
process.argv
['beam', 'quickbeam']
process.platform
Via Beam.callSync → :os.type()
process.arch
Via Beam.callSync → :erlang.system_info(:system_architecture)
process.pid
Via Beam.callSync → :os.getpid()
process.cwd()
Via Beam.callSync → File.cwd!()
process.exit(code?)
—
process.nextTick(fn, ...args)
Alias for queueMicrotask.
process.hrtime(prev?)
High-resolution time.
process.hrtime.bigint()
Nanosecond precision.
process.stdout.write(str)
Via console.log.
process.stderr.write(str)
Via console.error.
process.version
'v22.0.0'
API
Description
path.join(...parts)
—
path.resolve(...parts)
—
path.dirname(p)
—
path.basename(p, ext?)
—
path.extname(p)
—
path.isAbsolute(p)
—
path.normalize(p)
—
path.relative(from, to)
—
path.parse(p)
—
path.format(obj)
—
path.sep
'/'
path.delimiter
':'
API
Backed by
fs.readFileSync(path, opts?)
Beam.callSync → File.read!
fs.writeFileSync(path, data, opts?)
Beam.callSync → File.write!
fs.appendFileSync(path, data, opts?)
—
fs.existsSync(path)
—
fs.mkdirSync(path, opts?)
—
fs.readdirSync(path)
—
fs.statSync(path)
—
fs.lstatSync(path)
—
fs.unlinkSync(path)
—
fs.renameSync(old, new)
—
fs.rmSync(path, opts?)
—
fs.copyFileSync(src, dest)
—
fs.realpathSync(path)
—
fs.readFile(path, opts?, cb)
Async callback style.
fs.writeFile(path, data, opts?, cb)
Async callback style.
API
Description
os.platform()
—
os.arch()
—
os.type()
—
os.release()
—
os.hostname()
—
os.homedir()
—
os.tmpdir()
—
os.cpus()
—
os.totalmem()
—
os.freemem()
—
os.uptime()
—
os.networkInterfaces()
—
os.endianness()
—
os.EOL
'\n'
API
Backed by
child_process.execSync(cmd, opts?)
Beam.callSync → System.cmd
child_process.exec(cmd, opts?, cb)
Beam.call → System.cmd
Every runtime has a live DOM tree backed by lexbor (C library).
Elixir can read the same tree through QuickBEAM.dom_* functions
without JS execution.
API
Description
document.createElement(tag)
—
document.createElementNS(ns, tag)
—
document.createTextNode(text)
—
document.createDocumentFragment()
—
document.createComment(text)
—
document.getElementById(id)
—
document.getElementsByClassName(name)
—
document.getElementsByTagName(tag)
—
document.querySelector(selector)
CSS selector matching via lexbor.
document.querySelectorAll(selector)
—
document.addEventListener/removeEventListener/dispatchEvent
—
document.body
Getter.
document.head
Getter.
document.documentElement
Getter.
document.nodeType
Returns 9 (DOCUMENT_NODE).
document.nodeName
Returns "#document".
Properties (getters/setters):
id, className, classList (DOMTokenList), style (CSSStyleDeclaration),
tagName, nodeName, nodeType, nodeValue, innerHTML, outerHTML,
textContent, parentNode, parentElement, children, childNodes,
firstChild, lastChild, nextSibling, previousSibling
Methods :
querySelector, querySelectorAll, getElementsByClassName,
getElementsByTagName, matches, closest, getAttribute,
setAttribute, removeAttribute, hasAttribute, appendChild,
removeChild, insertBefore, replaceChild, cloneNode, contains,
remove, before, after, prepend, append, replaceWith,
addEventListener, removeEventListener, dispatchEvent
getPropertyValue(prop), setProperty(prop, value, priority?),
removeProperty(prop), getPropertyPriority(prop), cssText (getter),
plus direct property access (el.style.color = 'red').
add(token), remove(token), toggle(token), contains(token),
replace(old, new), item(index), length, value,
forEach(callback), entries(), keys(), values().
No-op stub for SSR compatibility. observe(), disconnect(), and
takeRecords() are defined but do nothing.
Prototype chain and instanceof
DOM nodes have a spec-compliant prototype hierarchy. Constructor
globals (Node, Element, HTMLElement, SVGElement,
MathMLElement, Document, DocumentFragment, Text, Comment)
are on globalThis:
document . createElement ( 'div' ) instanceof HTMLElement // true
document . createElement ( 'div' ) instanceof Element // true
document . createElement ( 'div' ) instanceof Node // true
document . createElementNS ( 'http://www.w3.org/2000/svg' , 'svg' ) instanceof SVGElement // true
Object.prototype.toString.call(el) returns type-specific tags like
[object HTMLDivElement], [object HTMLAnchorElement], etc.
The same DOM node always returns the same JS wrapper, so === works:
document . body === document . body // true
child . parentNode === parent // true
el . firstChild === el . firstChild // true
Returns the element's CSSStyleDeclaration.
These come from QuickJS-NG itself (not QuickBEAM polyfills):
Full ES2023: Promise, Map, Set, WeakMap, WeakSet, Proxy,
Symbol, BigInt, generators, async/await, optional chaining,
nullish coalescing, etc.
ArrayBuffer, SharedArrayBuffer, all typed arrays
JSON, Math, Date, RegExp, Intl (partial)
eval, globalThis