Command line tool and library to generate a Rust crate wrapping JavaScript code into a WebAssembly Component using the QuickJS engine.
ComponentizeJS achieves the same goal of wrapping JavaScript code into a WebAssembly Component, but it does it using a modified version of the SpiderMonkey engine.
Advantages of wasm-rquickjs over ComponentizeJS:
- At the time of writing, there are known bugs in ComponentizeJS (or one of its underlying modules) that prevents it from being used in production.
- Much simpler to develop and debug, as everything exposed for JavaScript is implemented in async Rust using the rquickjs library
- The WIT-JS mapping rules and the set of available JavaScript APIs are well defined
- Smaller WASM binary size
Advantages of ComponentizeJS over wasm-rquickjs:
- Faster runtime (due to the SpiderMonkey engine)
- Faster startup time (it does pre-initialization with Wizer)
- No need for the Rust toolchain for end users
The project is similar to wasmedge-quickjs in using te QuickJS engine compiled to WASM to run JavaScript code, but it is different in the following ways:
- It does not provide support for using the component model from JS (defining imports and exports using WIT)
- The imports the resulting WASM component has are WasmEdge specific
The tool can be used as a command line tool or as a library. The command line tool has two top level commands:
generate-wrapper-crate Generate the wrapper crate for a JavaScript module
generate-dts Generate TypeScript module definitions
This is the primary command that generates the Rust crate embedding the JavaScript code into a WebAssembly Component.
Usage: wasm-rquickjs generate-wrapper-crate --js <JS> --wit <WIT> --output <OUTPUT>
- The
--jsarguments is the path to the JavaScript file to be wrapped. There can be only one JavaScript file, containing an ES6 module exporting the necessary functions and classes as described below. - The
--witargument is the path to the WIT root containing a single world that describes the imports and exports of the component - The
--outputargument is the path to the output directory where the generated Rust crate will be created.
The output directory is going to contain a self-contained Rust crate that can be compiled into a WASM component using
cargo build --target wasm32-wasip2.
The generated crate has some features that control what imports the component will have beside the ones defined in the user's WIT world:
logging: enables thewasi:loggingimport to be used for the JavaScriptconsoleAPIhttp: enables thewasi:httpimport to be used for the JavaScriptfetchAPIsqlite: enables thenode:sqlitemodule with an embedded SQLite database engine
By default logging and http are enabled. The sqlite feature must be explicitly enabled.
The --target option selects which WASI generation mode is used:
--target wasi-p2(default): the historical WASI Preview 2 mode. Component exports are synchronous WIT functions and the full Node.js-compatible builtin set is available. This is the stable, production path.--target wasi-p3: the opt-in WASI Preview 3 mode. WITasync funcexports and imports use the Component Model async ABI, while plain functions remain synchronous. WITfuture<T>/stream<T>values are supported at function boundaries, including inside composite types. See WASI Preview 3 target below for the current status and limitations.
Both targets generate a crate that is still compiled with cargo build --target wasm32-wasip2
(a dedicated wasm32-wasip3 rustc target does not exist yet; the Preview 3 crate uses the
wasip3 bindings on top of the Preview 2 target).
The generate-dts command generates TypeScript module definitions for all the exported and imported interfaces:
Usage: wasm-rquickjs generate-dts --wit <WIT> --output <OUTPUT>
- The
--witargument is the path to the WIT root containing a single world that describes the imports and exports of the component. - The
--outputargument is the path to the output directory where the generated TypeScript module definitions (.d.ts) will be created.
wasm-rquickjs is integrated into Golem's command line interface, so it can be directly used
using Golem app templates.
Note: Golem's Preview 3 SDK/template builds pin the
wasi-p3generator branch and pass--target wasi-p3when building their JavaScript guest images. Preview 2 remains the default for callers that do not select a target explicitly.
Passing --target wasi-p3 to generate-wrapper-crate selects the opt-in, asynchronous WASI
Preview 3 generation mode. It is intended for hosts that support the Component Model async ABI.
How it differs from Preview 2:
- WIT
async funcexports and imports use the Component Model async ABI (task.return); plain functions remain synchronous. - The JavaScript event loop is driven by the Component Model async executor instead of Preview 2
wasi:io/pollpollables — there are nowstd/wasip2/pollable dependencies in the Preview 3 code path. - WIT
future<T>andstream<T>are mapped to JavaScriptPromise<T>andAsyncIterable<T>respectively, both directly and when nested in composite parameter/result types. fetch/ HTTP uses thewasi:httpPreview 3 (wasi:http/handler) async client.
Building and running:
The generated crate is still built with cargo build --target wasm32-wasip2. Running the resulting
component requires a host with Preview 3 and Component Model async support. For example, with the
wasmtime CLI (version 46.x):
wasmtime run -S p3=y -S http=y --wasm component-model=y --wasm component-model-async=y \
--invoke 'my-export()' path/to/component.wasm
The Node.js-compatible builtin set is available on Preview 3 as well. Working end-to-end examples
live under examples/p3, covering async exports/imports, future<T>/stream<T>
values, exported resources, and HTTP fetch.
Current limitations (Preview 3):
- Composition (
--js-modules name=@composition) is not supported yet. - An exported result containing
future<T>orstream<T>must come from anasync func; a synchronous export cannot return its reader before a backpressured writer starts. - The error arm of an exported top-level
result<T, E>cannot containfuture<T>orstream<T>.
Wizer pre-initialization (optimize) supports Preview 3 components. As with Preview 2, module
initialization must become quiescent before the snapshot and cannot leave timers or tasks pending.
Runtime arguments and environment variables are restored before the first export runs; modules
must not capture their values or immutable aliases during top-level initialization.
Preview 3 is opt-in and evolving; Preview 2 (--target wasi-p2) remains the default and stable
path.
The following WIT code:
package demo:pkg;
world example {
export hello: func() -> string;
}must be implemented in JavaScript as:
export const hello = () => {
return "Hello, world!";
};The this is bound to the module object. The JS function name is always in camelCase.
Exported interfaces has to be exported from JavaScript as objects:
The following WIT example:
package demo:pkg;
interface sample-api {
get-string-length: func(value: string) -> u64;
}
world example {
export sample-api;
}has to be implemented in JavaScript as:
export const sampleApi = {
getStringLength: (value) => {
return value.length;
}
};All names are converted to camelCase. The JavaScript this is bound to object representing the exporter interface, in
the above example it is sampleApi.
If two exported interfaces in the same world map to the same JavaScript object name, the colliding interfaces are
exported with a qualified name derived from their full WIT interface id. For example, test:a/guest@1.0.0 and
test:b/guest@1.0.0 both have the short interface name guest, so they must be exported as:
export const testA100Guest = {
invoke: (a, b, c) => `${a}:${b}:${c}`,
};
export const testB100Guest = {
invoke: (a, b, c, d, e) => `${a}:${b}:${c}:${d}:${e}`,
};Interfaces whose JavaScript object names do not collide keep the short camelCase export shape.
Exported resources are implemented as classes in JS:
The following WIT example:
package demo:pkg;
interface iface {
resource example-resource {
constructor(name: string);
get-name: func() -> string;
compare: static func(h1: borrow<example-resource>, h2: borrow<example-resource>) -> s32;
merge: static func(h1: own<example-resource>, h2: own<example-resource>) -> hello;
}
}
world example {
export iface;
}Must be exported from JavaScript in the following way:
class Hello {
constructor(name) {
this.name = name;
}
// async to demonstrate it is possible
async getName() {
return this.name;
}
static compare(h1, h2) {
if (h1.name === h2.name) {
return 0;
} else if h1.name < h2.name) {
return -1;
} else {
return 1;
}
}
static merge(h1, h2) {
return new Hello(`${h1.name} & ${h2.name}`);
}
}
export const iface = {
Hello: Hello,
};The classes have a UpperCamelCase name and their methods are in camelCase. All methods and static methods can be either sync or async.
| Name | WIT | JS | Notes |
|---|---|---|---|
| Character | char |
string |
- |
| String | string |
string |
- |
| Signed 8-bit integer | s8 |
number |
- |
| Unsigned 8-bit integer | u8 |
number |
- |
| Signed 16-bit integer | s16 |
number |
- |
| Unsigned 16-bit integer | u16 |
number |
- |
| Signed 32-bit integer | s32 |
number |
- |
| Unsigned 32-bit integer | u32 |
number |
- |
| Signed 64-bit integer | s64 |
bigint |
- |
| Unsigned 64-bit integer | u64 |
bigint |
- |
| 32-bit float | f32 |
number |
- |
| 64-bit float | f64 |
number |
- |
| Optional type | option<T> |
T | undefined |
Nested options are encoded differently |
| List | list<T> |
T[] |
- |
| Result | result<T, E> |
{ tag: "ok": val: T } | { tag: "err", val: E } |
- |
| Tuple | tuple<A, B, C> |
Array | - |
| Enum | enum { a, b, c} |
"a" | "b" | "c" |
The strings match the WIT enum cases |
| Flags | flags { a, b, c } |
{ a: boolean, b: boolean, c: boolean } |
The object keys are camelCase |
| Record | record { .. } |
Object | Field names are camelCase |
| Variant | variant { .. } |
{ tag: "x", val: X } |
Tag names match the WIT variant case names; val is undefined for unit cases |
| Future | future<T> |
Promise<T> |
WASI Preview 3 (--target wasi-p3) only |
| Stream | stream<T> |
AsyncIterable<T> |
WASI Preview 3 (--target wasi-p3) only |
- Maximum number of function parameters is 26
- Anonymous interface exports/imports are not supported
- Imported individual functions into the world are not supported (only whole interfaces)
- Preview 3 synchronous exports cannot return
future<T>orstream<T>, directly or nested; useasync func - Preview 3 exported top-level
result<T, E>error arms cannot containfuture<T>orstream<T>
Console
If the logging feature flag is enabled in the generated crate, it depends on wasi:logging, otherwise just on the core WASI interfaces.
assert,clear,count,countReset,debug,dir,dirXml,error,group,groupCollapsed,groupEnd,info,log,table,time,timeEnd,timeLog,trace,warn
HTTP (fetch)
Only if the http feature flag is enabled in the generated crate. It depends on wasi:http.
fetch,Headers,Request,Response,FormData,Blob,File
URL
URL(createObjectURL,revokeObjectURL)URLSearchParams
Streams
Implemented by https://github.com/MattiasBuelens/web-streams-polyfill
ByteLengthQueuingStrategy,CountQueuingStrategyReadableStream,ReadableStreamDefaultReader,ReadableStreamBYOBReader,ReadableStreamDefaultController,ReadableByteStreamController,ReadableStreamBYOBRequestWritableStream,WritableStreamDefaultControllerTransformStream,TransformStreamDefaultController
Timers
setTimeout,clearTimeout,setInterval,clearInterval,setImmediate
Abort Controller
AbortController,AbortSignal,DOMException
Encoding
TextEncoder,TextDecoder,TextDecoderStream,TextEncoderStream
Messaging
MessageChannel,MessagePort
Events
Event,EventTarget,CustomEvent
Intl (Internationalization)
Minimal en-US implementation for library compatibility. All locale inputs are accepted but resolved to en-US.
Intl.DateTimeFormat—format(),formatToParts(),resolvedOptions(),supportedLocalesOf()Intl.NumberFormat—format(),formatToParts(),resolvedOptions(),supportedLocalesOf()Intl.Collator—compare(),resolvedOptions(),supportedLocalesOf()Intl.PluralRules—select(),selectRange(),resolvedOptions(),supportedLocalesOf()Intl.getCanonicalLocales(),Intl.supportedValuesOf()
When the timezone feature is enabled (default), DateTimeFormat supports all ~590 IANA timezones via chrono-tz.
Crypto (global)
crypto.randomUUID,crypto.getRandomValues
Structured Clone
Implemented by https://github.com/ungap/structured-clone — structuredClone
node:assert
ok,equal,notEqual,strictEqual,notStrictEqualdeepEqual,notDeepEqual,deepStrictEqual,notDeepStrictEqual,partialDeepStrictEqualthrows,doesNotThrow,rejects,doesNotRejectifError,match,doesNotMatch,failAssertionError,CallTrackerstrict— strict mode variant (re-mapsequal→strictEqual,deepEqual→deepStrictEqual, etc.)
node:async_hooks
AsyncLocalStorage—run,exit,getStore,enterWith,disable,snapshot,bindAsyncResource—runInAsyncScope,asyncId,triggerAsyncId,bindcreateHook— stub (returns enable/disable no-ops)executionAsyncId,triggerAsyncId,executionAsyncResource— stubs
Context propagation works through Promise.prototype.then/catch/finally and setTimeout/setInterval. Limitation: QuickJS await uses internal C-level perform_promise_then which bypasses JS-visible Promise.prototype.then, so context is not propagated across await boundaries.
node:buffer
Buffer,Blob,File,SlowBufferresolveObjectURL,isAscii,isUtf8INSPECT_MAX_BYTES,kMaxLength,kStringMaxLength,constants
node:child_process (stub)
Compatibility stubs — all spawn/exec functions throw ENOSYS since WASI does not support process creation.
ChildProcess,exec,execFile,fork,spawn,execSync,execFileSync,spawnSync
node:cluster (stub)
Compatibility stubs — clustering is not supported in WASM.
isPrimary,isMaster,isWorker,fork,disconnect,setupPrimary
node:constants
Merged constants from os.constants, fs.constants, and crypto.constants (signal numbers, errno values, file flags, etc.)
node:crypto
- Hashing:
createHash,createHmac,hash,getHashes - Ciphers:
createCipheriv,createDecipheriv,getCiphers- Supported: aes-128/256-cbc, aes-128/256-ctr, aes-128/256-gcm, aes-128/192/256-wrap, id-aes128/192/256-wrap, id-aes128/192/256-wrap-pad, des-ede3-cbc, des3-wrap, chacha20-poly1305
- Signing:
createSign,createVerify(Ed25519, ECDSA with P-256, P-384, secp256k1) - Keys:
createPublicKey,createPrivateKey,createSecretKey,KeyObject,generateKeyPairSync,generateKeyPair - ECDH:
createECDH,ECDH,diffieHellman,getCurves - Certificate:
Certificate(verifySpkac,exportPublicKey,exportChallenge) - Random:
randomBytes,randomFillSync,randomFill,randomInt,randomUUID,pseudoRandomBytes,prng,rng - KDF:
pbkdf2,pbkdf2Sync,scrypt,scryptSync,hkdf,hkdfSync - Primes:
generatePrime,generatePrimeSync,checkPrime,checkPrimeSync - Other:
timingSafeEqual,getFips,setFips,secureHeapUsed
node:dgram
UDP datagram sockets built on WASI sockets.
dgram.createSocket(type[, listener])— create a UDP socket (udp4orudp6)socket.bind,socket.send,socket.sendto,socket.connect,socket.disconnect,socket.closesocket.address(),socket.remoteAddress()socket.setTTL,socket.setRecvBufferSize/getRecvBufferSize,socket.setSendBufferSize/getSendBufferSizesocket.ref()/socket.unref()— no-op- Events:
message,listening,close,error,connect
Not supported: multicast operations (setBroadcast, setMulticastTTL, addMembership, etc.) throw ENOSYS.
node:diagnostics_channel
Publish/subscribe diagnostic messaging and tracing.
channel(name),subscribe(name, onMessage),unsubscribe(name, onMessage),hasSubscribers(name),tracingChannel(name)Channel—subscribe,unsubscribe,publish,bindStore,unbindStore,runStores,hasSubscribers,nameTracingChannel—subscribe,unsubscribe,hasSubscribers,traceSync,tracePromise,traceCallback
Built-in HTTP diagnostics channels: http.client.request.created, http.client.request.start, http.client.request.error, http.client.response.finish.
node:dns
DNS resolution via WASI sockets.
lookup,lookupService,resolve,resolve4,resolve6resolveAny,resolveCname,resolveCaa,resolveMx,resolveNaptr,resolveNs,resolvePtr,resolveSoa,resolveSrv,resolveTxt,resolveTlsareverse,setServers,getServers,setDefaultResultOrder,getDefaultResultOrderResolverclasspromises— promise-based API- Error constants:
NODATA,FORMERR,SERVFAIL,NOTFOUND,NOTIMP,REFUSED,BADQUERY,BADNAME,BADFAMILY,BADRESP,CONNREFUSED,TIMEOUT,EOF,FILE,NOMEM,DESTRUCTION,BADSTR,BADFLAGS,NONAME,BADHINTS,NOTINITIALIZED,LOADIPHLPAPI,ADDRGETNETWORKPARAMS,CANCELLED,ADDRCONFIG,V4MAPPED,ALL
node:domain
Deprecated error-handling domains (sync-only).
domain.create()/domain.createDomain(),domain.active,domain._stackDomainclass (extendsEventEmitter):run,add,remove,bind,intercept,enter,exit,dispose,members,parentprocess.domain— reflects active domain- Error decoration:
error.domain,error.domainEmitter,error.domainBound,error.domainThrown - EventEmitter integration and async propagation via
process.nextTick,setTimeout,setInterval
Limitation: No async context propagation via async_hooks — only synchronous errors and explicitly bound callbacks are captured.
node:events
EventEmitter—on,once,off,addListener,removeListener,removeAllListeners,emit,listenerCount,eventNames,listeners,rawListeners,prependListener,prependOnceListener,setMaxListeners,getMaxListeners- Static:
once,on,getEventListeners,getMaxListeners,setMaxListeners,addAbortListener,errorMonitor,captureRejections Event,EventTarget,CustomEvent
node:fs
Comprehensive filesystem API built on WASI filesystem.
- Sync:
readFileSync,writeFileSync,appendFileSync,openSync,closeSync,readSync,writeSync,ftruncateSync,fsyncSync,fdatasyncSync,statSync,lstatSync,fstatSync,statfsSync,readdirSync,accessSync,existsSync,realpathSync,truncateSync,copyFileSync,linkSync,symlinkSync,readlinkSync,chmodSync,fchmodSync,lchmodSync,chownSync,fchownSync,lchownSync,utimesSync,futimesSync,lutimesSync,unlinkSync,renameSync,mkdirSync,rmdirSync,rmSync,mkdtempSync,opendirSync,readvSync,writevSync,cpSync - Async (callback):
readFile,writeFile,appendFile,open,close,read,write,stat,lstat,fstat,statfs,ftruncate,fsync,fdatasync,readdir,access,exists,realpath,truncate,copyFile,link,symlink,readlink,chmod,fchmod,lchmod,chown,fchown,lchown,utimes,futimes,lutimes,unlink,rename,mkdir,rmdir,rm,mkdtemp,opendir,watch,watchFile,unwatchFile,readv,writev,cp,openAsBlob - Streams:
createReadStream,createWriteStream - Classes:
Stats,Dirent,Dir,FSWatcher,StatWatcher,ReadStream,WriteStream - Constants:
F_OK,R_OK,W_OK,X_OK,O_RDONLY,O_WRONLY,O_RDWR,O_CREAT,O_EXCL,O_TRUNC,O_APPEND, etc.
node:fs/promises
Promise-based filesystem API.
FileHandle,open,readFile,writeFile,appendFile,unlink,rename,mkdir,rmdir,rm,stat,lstat,readdir,opendir,access,realpath,truncate,copyFile,link,symlink,readlink,chmod,lchmod,chown,lchown,utimes,lutimes,mkdtemp,cp,watch,statfs,constants
node:http / node:https
Requires the http feature flag. Client requests use wasi:http (TLS handled transparently). Server support uses wasi:sockets for TCP-level HTTP/1.1 serving.
http.request(url|options[, callback]),http.get(url|options[, callback])http.METHODS,http.STATUS_CODES,http.maxHeaderSizehttp.validateHeaderName,http.validateHeaderValuehttp.Agent,http.globalAgenthttp.OutgoingMessage— base class for writable HTTP message objectshttp.ClientRequest—write,end,setHeader,getHeader,removeHeader,hasHeader,getHeaderNames,getHeaders,getRawHeaderNames,flushHeaders,setNoDelay,setSocketKeepAlive,abort,destroy,setTimeouthttp.IncomingMessage—statusCode,statusMessage,headers,rawHeaders,httpVersionhttps.request/https.get— delegates tohttp(WASI-HTTP handles TLS transparently)http.createServer([options][, requestListener])— create an HTTP/1.1 server (requireswasi:sockets)http.Server(extendsnet.Server):listen,close,closeAllConnections,closeIdleConnections,setTimeouthttp.ServerResponse(extendsEventEmitter):writeHead,setHeader,getHeader,removeHeader,hasHeader,getHeaders,getHeaderNames,getRawHeaderNames,write,end,flushHeaders,writeContinue,cork,uncork- Server-side
IncomingMessage(extendsstream.Readable):method,url,headers,headersDistinct,rawHeaders,httpVersion,socket,complete,aborted,trailers node:_http_common—_checkIsHttpToken,_checkInvalidHeaderChar- Supported features: keep-alive connections, chunked transfer encoding, content-length bodies, sequential request pipelining, idle connection cleanup
Not yet supported: HTTP Upgrade, 1xx informational events, server-side timeout enforcement, https.createServer() / HTTPS server, client lookup / autoSelectFamily options.
node:http2 (stub)
Compatibility stubs — HTTP/2 is not supported.
connect,createServer,createSecureServer,Http2ServerRequest,Http2ServerResponse
node:inspector (stub)
Compatibility stubs — no V8 inspector in WASM.
Session,open,close,url,waitForDebugger,console,Network
node:module
require,createRequire,builtinModules,isBuiltin,runMain,_nodeModulePaths
node:net
TCP sockets and servers built on WASI sockets.
net.createServer([options][, connectionListener]),net.createConnection(options[, connectListener]),net.connect(...)net.isIP(input)/net.isIPv4(input)/net.isIPv6(input)net.getDefaultAutoSelectFamily()/net.setDefaultAutoSelectFamily(value)— stubsnet.Socket(extendsstream.Duplex):connect,write,end,destroy,resetAndDestroy,setTimeout,setNoDelay,setKeepAlive,address,ref,unref- Properties:
remoteAddress,remotePort,remoteFamily,localAddress,localPort,localFamily,bytesRead,bytesWritten,connecting,pending,readyState - Events:
connect,ready,data,end,close,error,timeout,drain,lookup
- Properties:
net.Server(extendsEventEmitter):listen,close,address,getConnections,ref,unref- Properties:
listening,maxConnections - Events:
listening,connection,close,error,drop
- Properties:
net.BlockList,net.SocketAddress,net.Stream
Not supported: IPC/Unix domain sockets, Happy Eyeballs/autoSelectFamily (stubbed), cluster integration.
node:os
arch,platform,type,release,version,machine,hostname,homedir,tmpdir,endiannesscpus,loadavg,freemem,totalmem,uptime,availableParallelismnetworkInterfaces,userInfo,getPriority,setPriorityEOL,devNull,constants(signals, errno, priority)
node:path
sep,delimiter,basename,dirname,extname,isAbsolute,join,normalize,relative,resolve,parse,format,matchesGlob,toNamespacedPath,posix
node:perf_hooks
performance—now(),timeOrigin,mark(),measure(),getEntries(),getEntriesByName(),getEntriesByType(),clearMarks(),clearMeasures(),toJSON()PerformanceEntry,PerformanceObservermonitorEventLoopDelay,createHistogram,constants
node:process
- Properties:
argv,argv0,env,pid,ppid,platform('wasi'),arch('wasm32'),version,versions,config,features,execArgv,execPath,exitCode,stdout,stderr - Methods:
exit(code),cwd(),nextTick(callback, ...args),hrtime(),hrtime.bigint(),uptime(),cpuUsage(),memoryUsage(),kill(pid, signal),abort(),emitWarning() - User/Group:
getuid,getgid,geteuid,getegid,getgroups,setuid,setgid - Inherits from
EventEmitter— supportson('uncaughtException'),on('unhandledRejection'), etc.
node:punycode
decode,encode,toASCII,toUnicode,ucs2,version
node:querystring
stringify/encode,parse/decode,escape,unescape,unescapeBuffer
node:readline
createInterface,Interface,clearLine,clearScreenDown,cursorTo,moveCursor,emitKeypressEventsreadline/promises— promise-based API
node:repl (stub)
start,REPLServer,Recoverable,builtinModules
node:sqlite
Requires the sqlite feature flag. Provides a synchronous SQLite database API with an embedded SQLite engine.
DatabaseSync—prepare,exec,close,open,isOpen,isTransaction,createSession,applyChangeset,enableLoadExtension,function,aggregate,backupStatementSync—run,get,all,iterate,columns,setReadBigInts,setAllowBareNamedParameters,sourceSQL,expandedSQLSession—changeset,patchset,close- Constants:
SQLITE_CHANGESET_OMIT,SQLITE_CHANGESET_REPLACE,SQLITE_CHANGESET_ABORT
Not supported: loadExtension() (throws — native extensions cannot be loaded in WASM).
node:stream
Readable(withfrom,fromWeb,toWeb,wrap, and functional methods:map,filter,flatMap,take,drop,toArray,forEach,reduce,some,every,find)Writable,Duplex,Transform,PassThrough,Streampipeline,finished,compose,duplexPair,addAbortSignalgetDefaultHighWaterMark,setDefaultHighWaterMark,isDisturbed,destroystream/consumers(arrayBuffer,blob,buffer,json,text)stream/promises— promise-basedpipelineandfinished
node:string_decoder
StringDecoder
node:test
Built-in test runner.
test,describe/suite,it,before,after,beforeEach,afterEachmock— function mocking utilitiesrun— programmatic test execution
node:timers
setTimeout,setInterval,setImmediate,clearTimeout,clearIntervaltimers/promises— promise-basedsetTimeout,setInterval,setImmediate
node:tls (stub)
Compatibility stubs — TLS is handled transparently by the WASI-HTTP layer.
SecureContext,TLSSocket,Server,connect,createServer,createSecureContext,checkServerIdentity,getCiphers,rootCertificatesDEFAULT_MIN_VERSION,DEFAULT_MAX_VERSION,DEFAULT_ECDH_CURVE
node:trace_events
Partial compatibility API to unblock modules that inspect tracing state.
createTracing({ categories: string[] })— creates aTracinghandleTracing#enable()/Tracing#disable()— toggles local tracing stateTracing#enabled/Tracing#categories— read tracing configurationgetEnabledCategories()— returns currently enabled categories as a comma-separated string
Limitation: No native trace sink; API-surface compatibility only.
node:tty
isatty,ReadStream,WriteStream
node:url
URL,URLSearchParamsparse,resolve,format(legacy API)fileURLToPath,pathToFileURL,urlToHttpOptions
node:util
format,inspect,deprecate,debugLog,log- Type checks:
isArray,isBoolean,isNull,isNullOrUndefined,isNumber,isString,isSymbol,isUndefined,isRegExp,isObject,isDate,isError,isFunction,isPrimitive,isBuffer promisify,callbackifyparseEnv,styleText,getCallSite,getCallSites,toUSVString,_extendTextEncoder,TextDecoder
node:v8
getHeapStatistics,getHeapSpaceStatistics,getHeapSnapshot,getHeapCodeStatisticssetFlagsFromString,writeHeapSnapshot,takeCoverage,stopCoverageserialize,deserialize,Serializer,Deserializer,DefaultSerializer,DefaultDeserializer
node:vm
runInNewContext,runInContext,runInThisContext,createContext,isContext,compileFunctionScript,createScriptSourceTextModule(experimental, limitedexport const/export let/export varsupport)
node:worker_threads (stub)
Compatibility stubs — workers are not supported in single-threaded WASM.
isMainThread,parentPort,workerData,threadId,resourceLimitsWorker,BroadcastChannel,MessagePort,MessageChannelmarkAsUntransferable,moveMessagePortToContext,receiveMessageOnPortgetEnvironmentData,setEnvironmentData
node:zlib
- Classes:
Deflate,Inflate,Gzip,Gunzip,DeflateRaw,InflateRaw,Unzip,BrotliCompress,BrotliDecompress - Factory:
createGzip,createGunzip,createDeflate,createInflate,createDeflateRaw,createInflateRaw,createUnzip,createBrotliCompress,createBrotliDecompress - Async:
gzip,gunzip,deflate,inflate,deflateRaw,inflateRaw,unzip,brotliCompress,brotliDecompress - Sync:
gzipSync,gunzipSync,deflateSync,inflateSync,deflateRawSync,inflateRawSync,unzipSync,brotliCompressSync,brotliDecompressSync crc32,constants,codes
Additional internal modules
internal/url—isURLinternal/http—kOutHeaderssymbolbase64-js—byteLength,toByteArray,fromByteArrayieee754—read,write
- NPM Library Compatibility Tracker — test results for popular npm packages
- Node.js v22 Compatibility Report — per-test results for vendored Node.js test suite
-
Global:
parseIntparseFloatisNaNisFinitequickMicrotaskdecodeURIdecodeURIComponentencodeURIencodeURIComponentescapeunescapeInfinityNaNundefined[Symbol.toStringTag]
-
Object- static methods and properties:
creategetPrototypeOfsetPrototypeOfdefinePropertydefinePropertiesgetOwnPropertyNamesgetOwnPropertySymbolsgroupBykeysvaluesentriesisExtensiblepreventExtensionsgetOwnPropertyDescriptorgetOwnPropertyDescriptorsisassignsealfreezeisSealedisFrozenfromEntrieshasOwn
- methods and properties:
toStringtoLocaleStringvalueOfhasOwnPropertyisPrototypeOfpropertyIsEnumerable__proto____defineGetter____defineSetter____lookupGetter____lookupSetter__
- static methods and properties:
-
Function- methods and properties:
callapplybindtoString[Symbol.hasInstance]fileNamelineNumbercolumnNumber
- methods and properties:
-
Error- methods and properties:
namemessagetoString
- static methods and properties:
isErrorcaptureStackTracestackTraceLimitprepareStackTrace
- methods and properties:
-
Generator- methods and properties:
nextreturnthrow[Symbol.toStringTag]
- static methods and properties:
from
- methods and properties:
-
Iterator- static methods and properties:
from
- methods and properties:
dropfilterflatMapmaptakeeveryfindforEachsomereducetoArray[Symbol.iterator][Symbol.toStringTag]
- static methods and properties:
-
Array- static methods and properties:
isArrayfromof[Symbol.species]
- methods and properties:
atwithconcateverysomeforEachmapfilterreducereduceRightfillfindfindIndexfindLastfindLastIndexindexOflastIndexOfincludesjointoStringtoLocaleStringpoppushshiftunshiftreversetoReversedsorttoSortedslicesplicetoSplicedcopyWithinflatMapflatvalues[Symbol.iterator]keysentries
- static methods and properties:
-
Number- static methods and properties:
parseIntparseFloatisNaNisFiniteisIntegerisSafeIntegerMAX_VALUEMIN_VALUENaNNEGATIVE_INFINITYPOSITIVE_INFINITYEPSILONMAX_SAFE_INTEGERMIN_SAFE_INTEGER
- methods and properties:
toExponentialtoFixedtoPrecisiontoStringtoLocaleStringvalueOf
- static methods and properties:
-
Boolean- methods and properties:
toStringvalueOf
- methods and properties:
-
String- static methods and properties:
fromCharCodefromCodePointraw
- methods and properties:
lengthatcharCodeAtcharAtconcatcodePointAtisWellFormedtoWellFormedindexOflastIndexOfincludesendsWithstartsWithmatchmatchAllsearchsplitsubstringsubstrslicerepeatreplacereplaceAllpadEndpadStarttrimtrimEndtrimRighttrimStarttrimLefttoStringvalueOflocaleComparenormalizetoLowerCasetoUpperCasetoLocaleLowerCasetoLocaleUpperCase[Symbol.iterator]anchorbigblinkboldfixedfontcolorfontsizeitalicslinksmallstrikesubsup
- static methods and properties:
-
Symbol- static methods and properties:
forkeyFor
- methods and properties:
toStringvalueOfdescription[Symbol.toPrimitive][Symbol.toStringTag]
- static methods and properties:
-
Map- static methods and properties:
groupBy[Symbol.species]
- methods and properties:
setgethasdeleteclearsizeforEachvalueskeysentries[Symbol.iterator][Symbol.toStringTag]
- static methods and properties:
-
Set- static methods and properties:
[Symbol.species]
- methods and properties:
addhasdeleteclearsizeforEachisDisjointFromisSubsetOfisSupersetOfintersectiondifferencesymmetricDifferenceunionvalueskeys[Symbol.iterator]entries[Symbol.toStringTag]
- static methods and properties:
-
WeakMap- methods and properties:
setgethasdelete[Symbol.toStringTag]
- methods and properties:
-
WeakSet- methods and properties:
addhasdelete[Symbol.toStringTag]
- methods and properties:
-
GeneratorFunction- methods and properties:
[Symbol.toStringTag]
- methods and properties:
-
Math- static methods and properties:
minmaxabsfloorceilroundsqrtacosasinatanatan2cosexplogpowsintantruncsigncoshsinhtanhacoshasinhatanhexpm1log1plog2log10cbrthypotrandomf16roundfroundimulclz32sumPrecise[Symbol.toStringTag]ELN10LN2LOG2ELOG10EPISQRT1_2SQRT2
- static methods and properties:
-
Reflect- static methods and properties:
applyconstructdefinePropertydeletePropertygetgetOwnPropertyDescriptorgetPrototypeOfhasisExtensibleownKeyspreventExtensionssetsetPrototypeOf[Symbol.toStringTag]
- static methods and properties:
-
RegExp- static methods and properties:
escape[Symbol.species]
- methods and properties:
flagssourceglobalignoreCasemultilinedotAllunicodeunicodeSetsstickyhasIndicesexeccompiletesttoString[Symbol.replace][Symbol.match][Symbol.matchAll][Symbol.search][Symbol.split]
- static methods and properties:
-
JSON- static methods and properties:
parsestringify[Symbol.toStringTag]
- static methods and properties:
-
Promise- static methods and properties:
resolverejectallallSettledanytryracewithResolvers[Symbol.species]
- methods and properties:
thencatchfinally[Symbol.toStringTag]
- static methods and properties:
-
AsyncFunction- methods and properties:
[Symbol.toStringTag]
- methods and properties:
-
AsyncIterator- methods and properties:
nextreturnthrow
- methods and properties:
-
AsyncGeneratorFunction- methods and properties:
[Symbol.toStringTag]
- methods and properties:
-
AsyncGenerator- methods and properties:
nextreturnthrow[Symbol.toStringTag]
- methods and properties:
-
Date- static methods and properties:
nowparseUTC
- methods and properties:
valueOftoString[Symbol.toPrimitive]toUTCStringtoGMTStringtoISOStringtoDateStringtoTimeStringtoLocaleStringtoLocaleDateStringtoLocaleTimeStringgetTimezoneOffsetgetTimegetYeargetFullYeargetUTCFullYeargetMonthgetUTCMonthgetDategetUTCDategetHoursgetUTCHoursgetMinutesgetUTCMinutesgetSecondsgetUTCSecondsgetMillisecondsgetUTCMillisecondsgetDaygetUTCDaysetTimesetMillisecondssetUTCMillisecondssetSecondssetUTCSecondssetMinutessetUTCMinutessetHourssetUTCHourssetDatesetUTCDatesetMonthsetUTCMonthsetYearsetFullYearsetUTCFullYeartoJSON
- static methods and properties:
-
BigInt- static methods and properties:
asIntNasUintN
- methods and properties:
toStringvalueOf[Symbol.toStringTag]
- static methods and properties:
-
ArrayBuffer- static methods and properties:
isView[Symbol.species
- methods and properties:
byteLengthmaxByteLengthresizeabledetachedresizeslicetransfertransferToFixedLength[Symbol.toStringTag]
- static methods and properties:
-
SharedArrayBuffer- static methods and properties:
[Symbol.species]
- methods and properties:
byteLengthmaxByteLengthgrowablegrowslice[Symbol.toStringTag]
- static methods and properties:
-
Typed arrays (
Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,BigInt64Array,BigUint64Array,Float32Array,Float64Array,Float16Array)- static methods and properties:
fromof[Symbol.species]
- methods and properties:
lengthatwithbufferbyteLengthsetbyteOffsetvalues[Symbol.iterator]keysentries[Symbol.toStringTag]copyWithineverysomeforEachmapfilterreducereduceRightfillfindfindIndexfindLastfindLastIndexreversetoReversedslicesubarraysorttoSortedjointoLocaleStringindexOflastIndexOfincludes
- static methods and properties:
-
DataView- methods and properties:
bufferbyteLengthbyteOffsetgetInt8getUint8getInt16getUint16getInt32getUint32getBigInt64getBigUint64getFloat16getFloat32getFloat64setInt8setUint8setInt16setUint16setInt32setUint32setBigInt64setBigUint64setFloat16setFloat32setFloat64[Symbol.toStringTag]
- methods and properties:
-
Atomics- static methods and properties:
addandorsubxorexchangecompareExchangeloadstoreisLockFreepausewaitnotify[Symbol.toStringTag]
- static methods and properties:
-
Performance- methods and properties:
now
- methods and properties:
-
WeakRef- methods and properties:
deref[Symbol.toStringTag]
- methods and properties:
-
FinalizationRegistry- methods and properties:
registerunregister[Symbol.toStringTag]
- methods and properties:
-
Callsite- methods and properties:
-
isNativegetFileNamegetFunctiongetFunctionNamegetColumnNumbergetLineNumber[Symbol.toStringTag]
- methods and properties:
-
-
Proxy
There are a few important things to keep in mind when working on the project:
-
The
skeletoncrate can be opened and compiled separately when working on the APIs provided for JavaScript. Unfortunately we cannot use theCargo.tomlfile name in it because that breaks Rust packaging - so before working on it, it has to be renamed toCargo.tomland before committing back it has to be renamed back toCargo.toml_. -
If the
skeletoncrate was compiled for testing, and thenwasm-rquickjsis compiled, theinclude_dir!macro is embedding everything from theskeletondirectory including thetargetdirectory, resulting in slow compilation times and huge resulting binaries. Use thecleanup-skeleton.shscript to quickly remove thetargetdirectory from theskeletoncrate.
The builtin JS modules are based on the work of several other projects: