UNPKG

node-zopfli

Version:

Bindings for Zopfli compressing lib. Compress gzip files 5% better than gzip.

110 lines (91 loc) 2.66 kB
'use strict'; 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;