You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.4 KiB
58 lines
1.4 KiB
'use strict'; |
|
const fs = require('fs'); |
|
const stream = require('stream'); |
|
const zlib = require('zlib'); |
|
const {promisify} = require('util'); |
|
const duplexer = require('duplexer'); |
|
|
|
const getOptions = options => ({level: 9, ...options}); |
|
const gzip = promisify(zlib.gzip); |
|
|
|
module.exports = async (input, options) => { |
|
if (!input) { |
|
return 0; |
|
} |
|
|
|
const data = await gzip(input, getOptions(options)); |
|
return data.length; |
|
}; |
|
|
|
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);
|
|
|