2017-12-10 21:51:33 +01:00
|
|
|
pako
|
2017-05-03 15:35:00 +02:00
|
|
|
==========================================
|
|
|
|
|
|
|
|
[![Build Status](https://travis-ci.org/nodeca/pako.svg?branch=master)](https://travis-ci.org/nodeca/pako)
|
|
|
|
[![NPM version](https://img.shields.io/npm/v/pako.svg)](https://www.npmjs.org/package/pako)
|
|
|
|
|
2017-12-10 21:51:33 +01:00
|
|
|
> zlib port to javascript, very fast!
|
|
|
|
|
2017-05-03 15:35:00 +02:00
|
|
|
__Why pako is cool:__
|
|
|
|
|
|
|
|
- Almost as fast in modern JS engines as C implementation (see benchmarks).
|
|
|
|
- Works in browsers, you can browserify any separate component.
|
|
|
|
- Chunking support for big blobs.
|
2017-12-10 21:51:33 +01:00
|
|
|
- Results are binary equal to well known [zlib](http://www.zlib.net/) (now contains ported zlib v1.2.8).
|
2017-05-03 15:35:00 +02:00
|
|
|
|
|
|
|
This project was done to understand how fast JS can be and is it necessary to
|
|
|
|
develop native C modules for CPU-intensive tasks. Enjoy the result!
|
|
|
|
|
|
|
|
|
|
|
|
__Famous projects, using pako:__
|
|
|
|
|
|
|
|
- [browserify](http://browserify.org/) (via [browserify-zlib](https://github.com/devongovett/browserify-zlib))
|
|
|
|
- [JSZip](http://stuk.github.io/jszip/)
|
|
|
|
- [mincer](https://github.com/nodeca/mincer)
|
|
|
|
- [JS-Git](https://github.com/creationix/js-git) and
|
|
|
|
[Tedit](https://chrome.google.com/webstore/detail/tedit-development-environ/ooekdijbnbbjdfjocaiflnjgoohnblgf)
|
2017-12-10 21:51:33 +01:00
|
|
|
by [@creationix](https://github.com/creationix)
|
2017-05-03 15:35:00 +02:00
|
|
|
|
|
|
|
|
|
|
|
__Benchmarks:__
|
|
|
|
|
|
|
|
```
|
|
|
|
node v0.10.26, 1mb sample:
|
|
|
|
|
|
|
|
deflate-dankogai x 4.73 ops/sec ±0.82% (15 runs sampled)
|
|
|
|
deflate-gildas x 4.58 ops/sec ±2.33% (15 runs sampled)
|
|
|
|
deflate-imaya x 3.22 ops/sec ±3.95% (12 runs sampled)
|
|
|
|
! deflate-pako x 6.99 ops/sec ±0.51% (21 runs sampled)
|
|
|
|
deflate-pako-string x 5.89 ops/sec ±0.77% (18 runs sampled)
|
|
|
|
deflate-pako-untyped x 4.39 ops/sec ±1.58% (14 runs sampled)
|
|
|
|
* deflate-zlib x 14.71 ops/sec ±4.23% (59 runs sampled)
|
|
|
|
inflate-dankogai x 32.16 ops/sec ±0.13% (56 runs sampled)
|
|
|
|
inflate-imaya x 30.35 ops/sec ±0.92% (53 runs sampled)
|
|
|
|
! inflate-pako x 69.89 ops/sec ±1.46% (71 runs sampled)
|
|
|
|
inflate-pako-string x 19.22 ops/sec ±1.86% (49 runs sampled)
|
|
|
|
inflate-pako-untyped x 17.19 ops/sec ±0.85% (32 runs sampled)
|
|
|
|
* inflate-zlib x 70.03 ops/sec ±1.64% (81 runs sampled)
|
|
|
|
|
|
|
|
node v0.11.12, 1mb sample:
|
|
|
|
|
|
|
|
deflate-dankogai x 5.60 ops/sec ±0.49% (17 runs sampled)
|
|
|
|
deflate-gildas x 5.06 ops/sec ±6.00% (16 runs sampled)
|
|
|
|
deflate-imaya x 3.52 ops/sec ±3.71% (13 runs sampled)
|
|
|
|
! deflate-pako x 11.52 ops/sec ±0.22% (32 runs sampled)
|
|
|
|
deflate-pako-string x 9.53 ops/sec ±1.12% (27 runs sampled)
|
|
|
|
deflate-pako-untyped x 5.44 ops/sec ±0.72% (17 runs sampled)
|
|
|
|
* deflate-zlib x 14.05 ops/sec ±3.34% (63 runs sampled)
|
|
|
|
inflate-dankogai x 42.19 ops/sec ±0.09% (56 runs sampled)
|
|
|
|
inflate-imaya x 79.68 ops/sec ±1.07% (68 runs sampled)
|
|
|
|
! inflate-pako x 97.52 ops/sec ±0.83% (80 runs sampled)
|
|
|
|
inflate-pako-string x 45.19 ops/sec ±1.69% (57 runs sampled)
|
|
|
|
inflate-pako-untyped x 24.35 ops/sec ±2.59% (40 runs sampled)
|
|
|
|
* inflate-zlib x 60.32 ops/sec ±1.36% (69 runs sampled)
|
|
|
|
```
|
|
|
|
|
2017-12-10 21:51:33 +01:00
|
|
|
zlib's test is partially affected by marshalling (that make sense for inflate only).
|
2017-05-03 15:35:00 +02:00
|
|
|
You can change deflate level to 0 in benchmark source, to investigate details.
|
|
|
|
For deflate level 6 results can be considered as correct.
|
|
|
|
|
|
|
|
__Install:__
|
|
|
|
|
|
|
|
node.js:
|
|
|
|
|
|
|
|
```
|
|
|
|
npm install pako
|
|
|
|
```
|
|
|
|
|
|
|
|
browser:
|
|
|
|
|
|
|
|
```
|
|
|
|
bower install pako
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Example & API
|
|
|
|
-------------
|
|
|
|
|
|
|
|
Full docs - http://nodeca.github.io/pako/
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
var pako = require('pako');
|
|
|
|
|
|
|
|
// Deflate
|
|
|
|
//
|
|
|
|
var input = new Uint8Array();
|
|
|
|
//... fill input data here
|
|
|
|
var output = pako.deflate(input);
|
|
|
|
|
|
|
|
// Inflate (simple wrapper can throw exception on broken stream)
|
|
|
|
//
|
|
|
|
var compressed = new Uint8Array();
|
|
|
|
//... fill data to uncompress here
|
|
|
|
try {
|
|
|
|
var result = pako.inflate(compressed);
|
|
|
|
} catch (err) {
|
|
|
|
console.log(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Alternate interface for chunking & without exceptions
|
|
|
|
//
|
|
|
|
|
|
|
|
var inflator = new pako.Inflate();
|
|
|
|
|
|
|
|
inflator.push(chunk1, false);
|
|
|
|
inflator.push(chunk2, false);
|
|
|
|
...
|
|
|
|
inflator.push(chunkN, true); // true -> last chunk
|
|
|
|
|
|
|
|
if (inflator.err) {
|
|
|
|
console.log(inflator.msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
var output = inflator.result;
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
Sometime you can wish to work with strings. For example, to send
|
|
|
|
big objects as json to server. Pako detects input data type. You can
|
|
|
|
force output to be string with option `{ to: 'string' }`.
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
var pako = require('pako');
|
|
|
|
|
|
|
|
var test = { my: 'super', puper: [456, 567], awesome: 'pako' };
|
|
|
|
|
|
|
|
var binaryString = pako.deflate(JSON.stringify(test), { to: 'string' });
|
|
|
|
|
|
|
|
//
|
|
|
|
// Here you can do base64 encode, make xhr requests and so on.
|
|
|
|
//
|
|
|
|
|
|
|
|
var restored = JSON.parse(pako.inflate(binaryString, { to: 'string' }));
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
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. Those should work: Z_NO_FLUSH, Z_FINISH, Z_SYNC_FLUSH.
|
|
|
|
|
|
|
|
|
|
|
|
Authors
|
|
|
|
-------
|
|
|
|
|
|
|
|
- Andrey Tupitsin [@anrd83](https://github.com/andr83)
|
|
|
|
- Vitaly Puzrin [@puzrin](https://github.com/puzrin)
|
|
|
|
|
|
|
|
Personal thanks to:
|
|
|
|
|
|
|
|
- Vyacheslav Egorov ([@mraleph](https://github.com/mraleph)) for his awesome
|
|
|
|
tutorials about optimising JS code for v8, [IRHydra](http://mrale.ph/irhydra/)
|
|
|
|
tool and his advices.
|
|
|
|
- David Duponchel ([@dduponchel](https://github.com/dduponchel)) for help with
|
|
|
|
testing.
|
|
|
|
|
2017-12-10 21:51:33 +01:00
|
|
|
Original implementation (in C):
|
|
|
|
|
|
|
|
- [zlib](http://zlib.net/) by Jean-loup Gailly and Mark Adler.
|
|
|
|
|
2017-05-03 15:35:00 +02:00
|
|
|
|
|
|
|
License
|
|
|
|
-------
|
|
|
|
|
|
|
|
MIT
|