--- /dev/null
+'use strict';
+var duplexer = require('duplexer');
+var stream = require('stream');
+var zlib = require('zlib');
+var opts = {level: 9};
+
+module.exports = function (str, cb) {
+ if (!str) {
+ cb(null, 0);
+ return;
+ }
+
+ zlib.gzip(str, opts, function (err, data) {
+ if (err) {
+ cb(err, 0);
+ return;
+ }
+
+ cb(err, data.length);
+ });
+};
+
+module.exports.sync = function (str) {
+ return zlib.gzipSync(str, opts).length;
+};
+
+module.exports.stream = function () {
+ var input = new stream.PassThrough();
+ var output = new stream.PassThrough();
+ var wrapper = duplexer(input, output);
+
+ var gzipSize = 0;
+ var gzip = zlib.createGzip(opts)
+ .on('data', function (buf) {
+ gzipSize += buf.length;
+ })
+ .on('error', function () {
+ wrapper.gzipSize = 0;
+ })
+ .on('end', function () {
+ wrapper.gzipSize = gzipSize;
+ wrapper.emit('gzip-size', gzipSize);
+ output.end();
+ });
+
+ input.pipe(gzip);
+ input.pipe(output, {end: false});
+
+ return wrapper;
+};