Fix
Reverts the custom radix-2 FFT back to fft.js (radix-4) and removes the unnecessary Buffer.from(rawData) copy introduced in v1.2.0.
Root cause: At N=2048 (the common production FFT size), radix-2 has 2× more butterfly iterations than radix-4 (11,264 vs 5,632). The Float32Array memory layout advantage does not compensate at small sizes. Additionally, Buffer.from(rawData) was copying the entire dongle IQ buffer (~65 KB × 73 times/sec = 4.8 MB/sec) on every chunk, even though both IQ extraction and FFT ring buffer ingestion run synchronously before the first await.
Result: CPU usage returns from ~50% to the original ~23–25% baseline for 1 WFM client. All other v1.2.0 optimizations (NCO tables, fastAtan2, Float32 SimpleFir, async deflate, ADPCM pre-alloc, audio pop fixes) remain in place.
⚠️ Final Node.js Backend Release
This is the last release of the Node.js (Hono/TypeScript) backend.
Active development has moved to a new Go backend (serverng/) which brings:
- Native concurrency — goroutines replace async/await throughout the hot path
- Lower CPU usage and single-binary deployment
- Same WebSocket binary protocol and REST API — client is unchanged
- Full feature parity: all demodulators (WFM/NFM/AM/SSB/SAM/CW), all codecs (ADPCM/Opus/deflate), bandwidth control, RDS, noise blanker
The Go backend will be released as v2.0.0. The Node.js server code remains in the server/ directory as a reference implementation.