/** | |
* node-crc32-stream | |
* | |
* Copyright (c) 2014 Chris Talkington, contributors. | |
* Licensed under the MIT license. | |
* https://github.com/archiverjs/node-crc32-stream/blob/master/LICENSE-MIT | |
*/ | |
var zlib = require('zlib'); | |
var inherits = require('util').inherits; | |
var crc32 = require('buffer-crc32'); | |
var DeflateCRC32Stream = module.exports = function (options) { | |
zlib.DeflateRaw.call(this, options); | |
this.checksum = new Buffer(4); | |
this.checksum.writeInt32BE(0, 0); | |
this.rawSize = 0; | |
this.compressedSize = 0; | |
// BC v0.8 | |
if (typeof zlib.DeflateRaw.prototype.push !== 'function') { | |
this.on('data', function(chunk) { | |
if (chunk) { | |
this.compressedSize += chunk.length; | |
} | |
}); | |
} | |
}; | |
inherits(DeflateCRC32Stream, zlib.DeflateRaw); | |
DeflateCRC32Stream.prototype.push = function(chunk, encoding) { | |
if (chunk) { | |
this.compressedSize += chunk.length; | |
} | |
return zlib.DeflateRaw.prototype.push.call(this, chunk, encoding); | |
}; | |
DeflateCRC32Stream.prototype.write = function(chunk, cb) { | |
if (chunk) { | |
this.checksum = crc32(chunk, this.checksum); | |
this.rawSize += chunk.length; | |
} | |
return zlib.DeflateRaw.prototype.write.call(this, chunk, cb); | |
}; | |
DeflateCRC32Stream.prototype.digest = function() { | |
return crc32.unsigned(0, this.checksum); | |
}; | |
DeflateCRC32Stream.prototype.hex = function() { | |
return this.digest().toString(16).toUpperCase(); | |
}; | |
DeflateCRC32Stream.prototype.size = function(compressed) { | |
compressed = compressed || false; | |
if (compressed) { | |
return this.compressedSize; | |
} else { | |
return this.rawSize; | |
} | |
}; |