Limitations & gotchas

An honest list of what NodeAmiga doesn't do (yet) and where it differs from Node.js running on a modern PC. Read this before porting something and wondering why it misbehaves.

On this page

Language features not supported

FeatureStatus / workaround
Proxy Not implemented. Use a plain object + explicit getter/setter methods.
Reflect Not implemented. Use Object.* statics.
Spec-compliant with statement Parses, but behaves as if the with wrapper doesn't exist — body runs in the current scope.
Real async/await concurrency await spin-waits the event loop synchronously. Execution of other tasks while a Promise is pending doesn't really interleave — the awaiting function just sits there draining microtasks/timers.
Tail-call optimization Not implemented; deep recursion hits the 512-frame call-stack limit (RangeError).
Named regex capture groups Syntax (?<name>...) parses (the name is consumed) but the name mapping isn't exposed on matches — captures are still indexed numerically.
UTF-16 surrogate pairs in some spots String.fromCharCode(cp) for cp > 0xFFFF produces only the low byte. The parser handles "\u{1F600}" correctly. punycode.ucs2 and string_decoder also don't handle surrogate pairs.
Private class fields with # Parses as regular identifiers — no actual access restriction. Convention only.
Decorators Not implemented (not finalized in ES anyway).
Web Workers / threads AmigaOS is single-tasking per process in the Node sense. Use child_process+execSync for sub-processes.

Performance

Not built for speed on a stock A500

On a 7 MHz 68000 with software-emulated floats, a tight loop that does trig will be orders of magnitude slower than modern Node.js. NodeAmiga is usable on an A500 for CLI tools, text processing, and small GUIs — but not for anything CPU-bound. Accelerators (68030+, 68040, 68060, Vampire) make a dramatic difference because floats hit the FPU.

Memory model

Timers & async

Networking

Text & encoding

Module-specific differences

ModuleWhere it differs from Node.js
fsSync-first; async versions call synchronously. Read streams read the whole file up front (highWaterMark only sets chunk size for emission).
httpHTTP/1.0 only; no chunked encoding; 10s timeout; servers max 8 clients.
netCurrently a thin alias over http. No net.Socket / net.Server classes.
zlibdeflate doesn't compress (stored blocks). Decoder is fine.
cryptoOnly md5 and sha256. No HMAC, no ciphers, no key exchange. Encoding is hex only.
streamComplete API, but implemented in JS on top of EventEmitter — not backed by native buffers. Readable.push in flowing mode emits synchronously.
eventsemit passes at most 5 arguments to listeners. once wrappers don't preserve this.
ostotalmem() == freemem(). uptime() returns 0. networkInterfaces() returns {}. CPU speed is 0.
assertdeepEqual is as strict as deepStrictEqual. Array/object replacers in JSON aren't supported.
urlnew URL(...) doesn't throw on invalid input (parses permissively). URLSearchParams.keys/values/entries return arrays, not iterators.
child_processOnly exec and execSync. No spawn, no pipes, no fork. stderr is always empty.
dnsOnly IPv4. All methods are synchronous internally.
readlineNo line-editing / history in the module itself.
punycode, string_decoderDon't handle UTF-16 surrogate pairs.

AmigaOS-specific quirks

Node.js compatibility summary

If you're porting a Node.js library:

Reporting issues

Found a bug or missing feature that bites you? Drop a note to the author at biuro@cdlabel.info. This list grows and shrinks with every release.