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.
		
		
		
		
			
				
					57 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					57 lines
				
				1.4 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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);
							 |