node-zopfli
Version:
Bindings for Zopfli compressing lib. Compress gzip files 5% better than gzip.
110 lines (91 loc) • 2.66 kB
JavaScript
;
const zopfli = require('../build/Release/node-zopfli.node');
const defaults = require('defaults');
const util = require('util');
const Transform = require('stream').Transform;
/* Streaming part */
const defaultOptions = {
verbose: false,
verbose_more: false,
numiterations: 15,
blocksplitting: true,
blocksplittinglast: false,
blocksplittingmax: 15
};
function Zopfli(format, options) {
this.first = true;
this.adler = 0x01;
this.crc = null;
this.format = format || 'deflate';
this.options = defaults(options, defaultOptions);
this.in = new Buffer.alloc(0);
Transform.prototype.constructor.apply(this, arguments);
}
util.inherits(Zopfli, Transform);
Zopfli.prototype._transform = function(chunk, encoding, done) {
this.in = Buffer.concat([this.in, chunk]);
done();
};
Zopfli.prototype._flush = function(done) {
const transform = this;
const inBuffer = Buffer.from(this.in);
zopfli.deflate(inBuffer, this.format, this.options, function(err, outbuf) {
if (err) {
done(err);
} else {
transform.push(outbuf);
done();
}
});
};
/* Stream */
Zopfli.createGzip = function(options) {
return new Zopfli('gzip', options);
};
Zopfli.createZlib = function(options) {
return new Zopfli('zlib', options);
};
Zopfli.createDeflate = function(options) {
return new Zopfli('deflate', options);
};
/* Buffer */
Zopfli.compress = function(buffer, type, options, callback) {
if (typeof callback === 'undefined' && typeof options === 'function') {
callback = options;
options = {};
}
options = options || {};
if (typeof callback === 'function') {
zopfli.deflate(buffer, type, options, callback);
} else {
return new Promise(function(resolve, reject) {
zopfli.deflate(buffer, type, options, function(err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
};
Zopfli.gzip = function(buffer, options, callback) {
return Zopfli.compress(buffer, 'gzip', options, callback);
};
Zopfli.zlib = function(buffer, options, callback) {
return Zopfli.compress(buffer, 'zlib', options, callback);
};
Zopfli.deflate = function(buffer, options, callback) {
return Zopfli.compress(buffer, 'deflate', options, callback);
};
/* Sync buffer */
Zopfli.gzipSync = function(buffer, options) {
return zopfli.deflateSync(buffer, 'gzip', options);
};
Zopfli.zlibSync = function(buffer, options) {
return zopfli.deflateSync(buffer, 'zlib', options);
};
Zopfli.deflateSync = function(buffer, options) {
return zopfli.deflateSync(buffer, 'deflate', options);
};
module.exports = Zopfli;