Web & Node.js compatibility

This page is generated from the compatibility test baselines in the repository (tools/compat/gen-compat-docs.py). Three suites gate every change in CI: a WinterTC Minimum Common Web Platform API surface scan, a vendored web-platform-tests subset, and a vendored subset of Node.js core tests running against the node: compatibility modules.

WinterTC Minimum Common API

54 / 54 globals present.

Global Status
AbortController
AbortSignal
Blob
ByteLengthQueuingStrategy
CompressionStream
CountQueuingStrategy
Crypto
CryptoKey
CustomEvent
DOMException
DecompressionStream
ErrorEvent
Event
EventTarget
File
FormData
Headers
MessageChannel
MessageEvent
MessagePort
Performance
PromiseRejectionEvent
ReadableStream
ReadableStreamBYOBReader
ReadableStreamDefaultReader
Request
Response
SubtleCrypto
TextDecoder
TextDecoderStream
TextEncoder
TextEncoderStream
TransformStream
URL
URLPattern
URLSearchParams
WebAssembly
WritableStream
WritableStreamDefaultWriter
atob
btoa
clearInterval
clearTimeout
console
crypto
fetch
navigator
performance
queueMicrotask
reportError
self
setInterval
setTimeout
structuredClone

Web Platform Tests (wpt@0cc6a7e19)

222 / 224 vendored test files fully passing (2 with recorded subtest failures — 3 individual subtests — and 0 failing wholesale).

Suite Fully passing Partial Failing
FileAPI 14 0 0
WebCryptoAPI 3 0 0
compression 18 0 0
console 6 0 0
dom 13 0 0
encoding 6 0 0
fetch 8 0 0
hr-time 2 0 0
html 11 1 0
streams 65 1 0
url 21 0 0
urlpattern 3 0 0
wasm 43 0 0
xhr 9 0 0

Every entry is pinned in server/tests/wpt/expectations.json; CI fails on drift in either direction, so the file doubles as the compatibility changelog.

Node.js core tests (node v22.14.0)

35 / 35 vendored tests passing. The node: modules served by the module loader:

Module Implementation
node:assert (+/strict) purpose-written subset
node:buffer feross/buffer (the npm Buffer polyfill)
node:console the global console, plus a Console class over writable streams
node:crypto hash/HMAC/randomness subset over the sandbox crypto ops
node:dns pass-through resolver (resolution happens host-side in the transports)
node:events Node's own lib source over a primordials shim
node:fs (+/promises) import-compatible stubs; the real surface is the policy-gated fs global
node:http import-compatible stub; HTTP/1 is fetch()
node:http2 client subset over the policy-gated http2 ops (gRPC transport)
node:https import-compatible stub; use fetch() or node:http2
node:module createRequire/builtinModules over the builtin registry
node:net address helpers; sockets are inert (transports are policy-gated)
node:os fixed sandbox values
node:path Node's own lib source over a primordials shim
node:process fixed sandbox values; no host env
node:querystring Node's own lib source over a primordials shim
node:stream purpose-written subset (legacy Stream base + Readable/Writable/Duplex/Transform)
node:stream/web the runtime's WHATWG streams globals re-exported
node:timers (+/promises) the runtime timer globals, plus promisified forms with AbortSignal
node:tls option plumbing; TLS terminates host-side in the transports
node:url WHATWG URL + file-URL helpers
node:util purpose-written subset
node:zlib one-shot gzip/deflate over CompressionStream / DecompressionStream

Skipped tests (with reasons):

  • test-events-once.js — pokes node-internal module internal/event_target
  • test-path-resolve.js — requires child_process for cwd checks

Known limitations

  • SubtleCrypto implements digest and raw-HMAC operations; asymmetric keys, AES, and key derivation reject with NotSupportedError.
  • node:crypto covers hashes (md5/sha1/sha2 family), HMAC, randomness, and timingSafeEqual; ciphers, sign/verify, key objects, and KDFs are not exported.
  • Deep IDNA conformance (WPT IdnaTestV2) tracks the Rust idna crate and is not vendored.
  • fetch() network behavior is governed by the engine's policy layer; the WPT fetch suites covered here are the compute-only ones.

Tracking issue: #237.