diff --git a/lib/crypto.js b/lib/crypto.js index 01d4b7125bd..9c7dd64aed6 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -150,15 +150,33 @@ exports.createCredentials = function(options, context) { }; +function LazyTransform(options) { + this._options = options; +} +util.inherits(LazyTransform, stream.Transform); + +['read', 'write', 'end'].forEach(function(action, i, actions) { + LazyTransform.prototype[action] = function() { + stream.Transform.call(this, this._options); + + actions.forEach(function(action) { + this[action] = stream.Transform.prototype[action]; + }, this); + + return this[action].apply(this, arguments); + }; +}); + + exports.createHash = exports.Hash = Hash; function Hash(algorithm, options) { if (!(this instanceof Hash)) return new Hash(algorithm); this._binding = new binding.Hash(algorithm); - stream.Transform.call(this, options); + LazyTransform.call(this, options); } -util.inherits(Hash, stream.Transform); +util.inherits(Hash, LazyTransform); Hash.prototype._transform = function(chunk, encoding, callback) { this._binding.update(chunk, encoding); @@ -194,10 +212,10 @@ function Hmac(hmac, key, options) { return new Hmac(hmac, key); this._binding = new binding.Hmac(); this._binding.init(hmac, toBuf(key)); - stream.Transform.call(this, options); + LazyTransform.call(this, options); } -util.inherits(Hmac, stream.Transform); +util.inherits(Hmac, LazyTransform); Hmac.prototype.update = Hash.prototype.update; Hmac.prototype.digest = Hash.prototype.digest; @@ -221,10 +239,10 @@ function Cipher(cipher, password, options) { this._binding.init(cipher, toBuf(password)); this._decoder = null; - stream.Transform.call(this, options); + LazyTransform.call(this, options); } -util.inherits(Cipher, stream.Transform); +util.inherits(Cipher, LazyTransform); Cipher.prototype._transform = function(chunk, encoding, callback) { this.push(this._binding.update(chunk, encoding)); @@ -280,10 +298,10 @@ function Cipheriv(cipher, key, iv, options) { this._binding.initiv(cipher, toBuf(key), toBuf(iv)); this._decoder = null; - stream.Transform.call(this, options); + LazyTransform.call(this, options); } -util.inherits(Cipheriv, stream.Transform); +util.inherits(Cipheriv, LazyTransform); Cipheriv.prototype._transform = Cipher.prototype._transform; Cipheriv.prototype._flush = Cipher.prototype._flush; @@ -302,10 +320,10 @@ function Decipher(cipher, password, options) { this._binding.init(cipher, toBuf(password)); this._decoder = null; - stream.Transform.call(this, options); + LazyTransform.call(this, options); } -util.inherits(Decipher, stream.Transform); +util.inherits(Decipher, LazyTransform); Decipher.prototype._transform = Cipher.prototype._transform; Decipher.prototype._flush = Cipher.prototype._flush; @@ -325,10 +343,10 @@ function Decipheriv(cipher, key, iv, options) { this._binding.initiv(cipher, toBuf(key), toBuf(iv)); this._decoder = null; - stream.Transform.call(this, options); + LazyTransform.call(this, options); } -util.inherits(Decipheriv, stream.Transform); +util.inherits(Decipheriv, LazyTransform); Decipheriv.prototype._transform = Cipher.prototype._transform; Decipheriv.prototype._flush = Cipher.prototype._flush;