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.
		
		
		
		
		
			
		
			
				
					
					
						
							56 lines
						
					
					
						
							1.4 KiB
						
					
					
				
			
		
		
	
	
							56 lines
						
					
					
						
							1.4 KiB
						
					
					
				'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);
 | 
						|
 |