pako Documentation

High speed zlib port to javascript, works in browser & node.js

6,123 stars JavaScript JavaScript 3 files ยท ~1,255 tokens #zlib#zlib-port
RAW Doc

Technical Documentation: nodeca/pako

โ„น๏ธ Provenance: Multi-Tier Ingestion ยท CodeWiki Reference

Overview (`README.md`)

pako


Very fast zlib-compatible compression for JavaScript.

Why pako is cool

  • Binary-equivalent output. Pako can produce the same deflate/gzip bytes as
    original zlib (1.3.2) and Node.js' patched zlib.
  • Tiny browser bundles. Full minified bundle is under 15K gzipped.
    Deflate-only and inflate-only builds are smaller.
  • Very fast. Performance is comparable with native zlib in modern JavaScript
    engines (see benchmarks).

Benchmarks

node v24, 1 MB input sample:

text
deflate-pako x 14.27 ops/sec ยฑ3.41% (37 runs sampled)
deflate-pako-zlib-hash x 10.60 ops/sec ยฑ0.50% (29 runs sampled)
deflate-zlib x 30.30 ops/sec ยฑ0.61% (51 runs sampled)
gzip-pako x 13.48 ops/sec ยฑ0.50% (36 runs sampled)
inflate-pako x 138 ops/sec ยฑ1.26% (75 runs sampled)
inflate-zlib x 397 ops/sec ยฑ1.37% (81 runs sampled)
ungzip-pako x 125 ops/sec ยฑ1.46% (73 runs sampled)

Install

text
npm install pako

[!NOTE]
For a quick look at dist/ folder contents, see
https://unpkg.com/pako@latest/.

Examples / API

Full docs - http://nodeca.github.io/pako/

javascript
import { Deflate, Inflate, deflate, inflate } from 'pako';

// Deflate
//
const input = new Uint8Array();
//... fill input data here
const output = deflate(input);

// Inflate (simple wrapper can throw exception on broken stream)
//
const compressed = new Uint8Array();
//... fill data to uncompress here
try {
  const result = inflate(compressed);
  // ... continue processing
} catch (err) {
  console.log(err);
}

//
// Alternate interface for chunking & without exceptions
//

const deflator = new Deflate();

deflator.push(chunk1, false);
deflator.push(chunk2); // second param is false by default.
...
deflator.push(chunk_last, true); // `true` says this chunk is last

if (deflator.err) {
  console.log(deflator.msg);
}

const output = deflator.result;


const inflator = new Inflate();

inflator.push(chunk1);
inflator.push(chunk2);
...
inflator.push(chunk_last); // no second param because end is auto-detected

if (inflator.err) {
  console.log(inflator.msg);
}

const output = inflator.result;

For CommonJS:

javascript
const { deflate, inflate } = require('pako');

If you need the whole API as an object, use namespace import:

javascript
import * as pako from 'pako';

Sometimes you may wish to work with strings โ€” for example, to send
stringified objects to a server. Pako's deflate detects the input data type and
automatically recodes strings to utf-8 prior to compression. High-level inflate
helpers can decode utf-8 output back to JavaScript strings with toText: true.

javascript
import { deflate, inflate } from 'pako';

const test = { my: 'super', puper: [456, 567], awesome: 'pako' };

const compressed = deflate(JSON.stringify(test));

const restored = JSON.parse(inflate(compressed, { toText: true }));

Notes

Pako does not contain some specific zlib functions:

  • deflate - methods deflateCopy, deflateBound, deflateParams,
    deflatePending, deflatePrime, deflateTune.
  • inflate - methods inflateCopy, inflateMark,
    inflatePrime, inflateGetDictionary, inflateSync, inflateSyncPoint, inflateUndermine.
  • High level inflate/deflate wrappers (classes) may not support some flush
    modes.

Authors

Personal thanks to:

  • Vyacheslav Egorov (@mraleph) for his awesome
    tutorials about optimising JS code for v8, IRHydra
    tool and his advices.
  • David Duponchel (@dduponchel) for help with
    testing.

Original implementation (in C):

  • zlib by Jean-loup Gailly and Mark Adler.

License

  • MIT - all files, except /src/zlib folder
  • ZLIB - /src/zlib content

Overview (`benchmark/README.md`)

Dev sandbox

Helpers to measure performance & create benchmarks.

Setup

sh
npm i

Benchmarking

sh
./benchmark.js

Profiling

sh
node --prof profile.js
node --prof-process isolate-0xnnnnnnnnnnnn-v8.log

Overview (`examples/browser-to-server/README.md`)

Browser to server

This example sends compressed JSON from a browser to a Node.js server.

Run node server.mjs and open http://localhost:8000/.

Warning! This is the sample only, to show data reencoding steps. It does
not have error checks and so on. Don't copy-paste to production code "as is".


--- METRICS ---