| '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); |