113 lines
2.7 KiB
JavaScript
113 lines
2.7 KiB
JavaScript
'use strict';
|
|
|
|
var binary = require('node-pre-gyp');
|
|
var path = require('path');
|
|
var defaults = require('defaults');
|
|
var binding_path = binary.find(path.join(__dirname, '../package.json'));
|
|
var zopfli = require(binding_path);
|
|
|
|
var util = require('util');
|
|
var Transform = require('stream').Transform;
|
|
|
|
/* Streaming part */
|
|
var 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(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) {
|
|
var transform = this;
|
|
var inBuffer = new Buffer(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;
|