ZXC WebAssembly

April 13, 2026 · View on GitHub

High-performance lossless compression for the browser and Node.js via WebAssembly.

Features

  • Buffer API: Compress and decompress Uint8Array buffers
  • Reusable Contexts: Amortise allocation overhead across multiple operations
  • All Levels: Compression levels 1–5
  • Checksum Support: Optional integrity verification
  • Tiny Footprint: ~60 KB .wasm file (scalar build, no SIMD)

Quick Start

Browser (ES Module)

import createZXC from './zxc_wasm.js';

const zxc = await createZXC();

// Compress
const input = new TextEncoder().encode('Hello, World!');
const compressed = zxc.compress(input, { level: 3 });

// Decompress
const output = zxc.decompress(compressed);
console.log(new TextDecoder().decode(output)); // "Hello, World!"

Node.js

import createZXC from 'zxc-wasm';
import { readFileSync } from 'fs';

const zxc = await createZXC();
const data = new Uint8Array(readFileSync('input.bin'));

const compressed = zxc.compress(data, { level: 5, checksum: true });
const decompressed = zxc.decompress(compressed, { checksum: true });

API Reference

createZXC(moduleOverrides?) → Promise<ZXC>

Initialise the WASM module. Returns a frozen API object.

zxc.compress(data, opts?) → Uint8Array

OptionTypeDefaultDescription
levelnumber3Compression level (1–5)
checksumbooleanfalseEnable integrity checksums

zxc.decompress(data, opts?) → Uint8Array

OptionTypeDefaultDescription
checksumbooleanfalseVerify integrity checksums

zxc.compressBound(inputSize) → number

Maximum compressed output size for a given input size.

zxc.getDecompressedSize(data) → number

Read the original size from a compressed buffer without decompressing.

zxc.createCompressContext(opts?) → CompressContext

Create a reusable compression context (avoids per-call allocation).

const ctx = zxc.createCompressContext({ level: 3 });
const c1 = ctx.compress(data1);
const c2 = ctx.compress(data2);
ctx.free(); // Release WASM memory

zxc.createDecompressContext() → DecompressContext

Create a reusable decompression context.

const ctx = zxc.createDecompressContext();
const d1 = ctx.decompress(compressed1);
const d2 = ctx.decompress(compressed2);
ctx.free();

Properties

PropertyTypeDescription
versionstringLibrary version (e.g. "0.10.0")
minLevelnumberMinimum compression level (1)
maxLevelnumberMaximum compression level (5)
defaultLevelnumberDefault compression level (3)

Building from Source

Requires Emscripten SDK.

# Configure
emcmake cmake -B build-wasm -DCMAKE_BUILD_TYPE=Release

# Build
cmake --build build-wasm

# Test
BUILD_DIR=build-wasm node wrappers/wasm/test.mjs

The build produces build-wasm/zxc.js and build-wasm/zxc.wasm.

License

BSD 3-Clause. See LICENSE.