@@ -3,12 +3,6 @@ var Buffer = require('safe-buffer').Buffer
33var Transform = require ( 'stream' ) . Transform
44var inherits = require ( 'inherits' )
55
6- function throwIfNotStringOrBuffer ( val , prefix ) {
7- if ( ! Buffer . isBuffer ( val ) && typeof val !== 'string' ) {
8- throw new TypeError ( prefix + ' must be a string or a buffer' )
9- }
10- }
11-
126function HashBase ( blockSize ) {
137 Transform . call ( this )
148
@@ -44,10 +38,56 @@ HashBase.prototype._flush = function (callback) {
4438 callback ( error )
4539}
4640
41+ var useUint8Array = typeof Uint8Array !== 'undefined'
42+ var useArrayBuffer = typeof ArrayBuffer !== 'undefined' &&
43+ typeof Uint8Array !== 'undefined' &&
44+ ArrayBuffer . isView &&
45+ ( Buffer . prototype instanceof Uint8Array || Buffer . TYPED_ARRAY_SUPPORT )
46+
47+ function toBuffer ( data , encoding ) {
48+ // No need to do anything for exact instance
49+ // This is only valid when safe-buffer.Buffer === buffer.Buffer, i.e. when Buffer.from/Buffer.alloc existed
50+ if ( data instanceof Buffer ) return data
51+
52+ // Convert strings to Buffer
53+ if ( typeof data === 'string' ) return Buffer . from ( data , encoding )
54+
55+ /*
56+ * Wrap any TypedArray instances and DataViews
57+ * Makes sense only on engines with full TypedArray support -- let Buffer detect that
58+ */
59+ if ( useArrayBuffer && ArrayBuffer . isView ( data ) ) {
60+ if ( data . byteLength === 0 ) return Buffer . alloc ( 0 ) // Bug in Node.js v5.12, which treats this as out-of-bounds
61+ var res = Buffer . from ( data . buffer , data . byteOffset , data . byteLength )
62+ // Recheck result size, as offset/length doesn't work on Node.js <5.10
63+ // We just go to Uint8Array case if this fails
64+ if ( res . byteLength === data . byteLength ) return res
65+ }
66+
67+ /*
68+ * Uint8Array in engines where Buffer.from might not work with ArrayBuffer, just copy over
69+ * Doesn't make sense with other TypedArray instances
70+ */
71+ if ( useUint8Array && data instanceof Uint8Array ) return Buffer . from ( data )
72+
73+ /*
74+ * Old Buffer polyfill on an engine that doesn't have TypedArray support
75+ * Also, this is from a different Buffer polyfill implementation then we have, as instanceof check failed
76+ * Convert to our current Buffer implementation
77+ */
78+ if ( Buffer . isBuffer ( data ) &&
79+ data . constructor &&
80+ typeof data . constructor . isBuffer === 'function' &&
81+ data . constructor . isBuffer ( data )
82+ ) return Buffer . from ( data )
83+
84+ throw new TypeError ( 'The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView.' )
85+ }
86+
4787HashBase . prototype . update = function ( data , encoding ) {
48- throwIfNotStringOrBuffer ( data , 'Data' )
4988 if ( this . _finalized ) throw new Error ( 'Digest already called' )
50- if ( ! Buffer . isBuffer ( data ) ) data = Buffer . from ( data , encoding )
89+
90+ data = toBuffer ( data , encoding ) // asserts correct input type
5191
5292 // consume data
5393 var block = this . _block
0 commit comments