ZSTD (Zstandard) decoder for Web and Node.js, using WebAssembly.
npm install --save zstddec
import { ZSTDDecoder } from 'zstddec';
const decoder = new ZSTDDecoder();
await decoder.init();
const decompressedArray = decoder.decode( compressedArray, uncompressedSize );
Limitations: The decoder may fail with the error
wasm function signature contains illegal type
when theuncompressedSize
is not known in advance and given to thedecode()
method. This is presumably a bug in the WASM bindings, which I am not yet sure how to fix.
To build the project locally, run:
yarn install
yarn build
To test changes:
yarn test
Compiled from https://github.com/facebook/zstd/tree/dev/build/single_file_libs, with the following steps:
# build zstd
make
cd build/single_file_libs
./create_single_file_decoder.sh
# build wasm
emcc zstddeclib.c -s EXPORTED_FUNCTIONS="['_ZSTD_decompress', '_ZSTD_findDecompressedSize', '_ZSTD_isError', '_malloc', '_free']" -Wl,--no-entry -s WASM=1 -Oz -g0 -flto -s ALLOW_MEMORY_GROWTH=1 -s FILESYSTEM=0 -s STANDALONE_WASM=1 -DNDEBUG=1 -s PURE_WASI=0 -o zstddec.wasm
# build streaming wasm
emcc zstddeclib.c -s EXPORTED_FUNCTIONS="['_ZSTD_decompress', '_ZSTD_findDecompressedSize', '_ZSTD_createDCtx', '_ZSTD_decompressStream', '_ZSTD_freeDCtx', '_ZSTD_DStreamInSize', '_ZSTD_DStreamOutSize', '_malloc', '_free']" -Wl,--no-entry -s WASM=1 -Oz -g0 -flto -s ALLOW_MEMORY_GROWTH=1 -s FILESYSTEM=0 -s STANDALONE_WASM=1 -DNDEBUG=1 -s PURE_WASI=0 -o zstddec-stream.wasm
# encode WASM to base64
base64 -i zstddec.wasm > zstddec.txt
base64 -i zstddec-stream.wasm > zstddec-stream.txt
The base64 string written to zstddec.txt
is embedded as the wasm
variable at the bottom
of the source file. The rest of the file is written by hand, in order to avoid an additional JS
wrapper generated by Emscripten.
Last built June 2025, zstd v1.5.7 (f8745da6
), emscc v4.0.10.
JavaScript wrapper is provided under the MIT License, and the WASM ZSTD decoder is provided by Facebook under the BSD 3-Clause License.