57 lines
1.4 KiB
JavaScript
57 lines
1.4 KiB
JavaScript
|
'use strict';
|
||
|
const fs = require('fs');
|
||
|
const stream = require('stream');
|
||
|
const zlib = require('zlib');
|
||
|
const duplexer = require('duplexer');
|
||
|
const pify = require('pify');
|
||
|
|
||
|
const getOptions = options => Object.assign({level: 9}, options);
|
||
|
|
||
|
module.exports = (input, options) => {
|
||
|
if (!input) {
|
||
|
return Promise.resolve(0);
|
||
|
}
|
||
|
|
||
|
return pify(zlib.gzip)(input, getOptions(options)).then(data => data.length).catch(_ => 0);
|
||
|
};
|
||
|
|
||
|
module.exports.sync = (input, options) => zlib.gzipSync(input, getOptions(options)).length;
|
||
|
|
||
|
module.exports.stream = options => {
|
||
|
const input = new stream.PassThrough();
|
||
|
const output = new stream.PassThrough();
|
||
|
const wrapper = duplexer(input, output);
|
||
|
|
||
|
let gzipSize = 0;
|
||
|
const gzip = zlib.createGzip(getOptions(options))
|
||
|
.on('data', buf => {
|
||
|
gzipSize += buf.length;
|
||
|
})
|
||
|
.on('error', () => {
|
||
|
wrapper.gzipSize = 0;
|
||
|
})
|
||
|
.on('end', () => {
|
||
|
wrapper.gzipSize = gzipSize;
|
||
|
wrapper.emit('gzip-size', gzipSize);
|
||
|
output.end();
|
||
|
});
|
||
|
|
||
|
input.pipe(gzip);
|
||
|
input.pipe(output, {end: false});
|
||
|
|
||
|
return wrapper;
|
||
|
};
|
||
|
|
||
|
module.exports.file = (path, options) => {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
const stream = fs.createReadStream(path);
|
||
|
stream.on('error', reject);
|
||
|
|
||
|
const gzipStream = stream.pipe(module.exports.stream(options));
|
||
|
gzipStream.on('error', reject);
|
||
|
gzipStream.on('gzip-size', resolve);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
module.exports.fileSync = (path, options) => module.exports.sync(fs.readFileSync(path), options);
|