@@ -3,12 +3,6 @@ var Buffer = require('safe-buffer').Buffer
3
3
var Transform = require ( 'stream' ) . Transform
4
4
var inherits = require ( 'inherits' )
5
5
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
-
12
6
function HashBase ( blockSize ) {
13
7
Transform . call ( this )
14
8
@@ -44,10 +38,59 @@ HashBase.prototype._flush = function (callback) {
44
38
callback ( error )
45
39
}
46
40
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 <6.3.1, 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 (
79
+ Buffer . isBuffer ( data ) &&
80
+ data . constructor &&
81
+ typeof data . constructor . isBuffer === 'function' &&
82
+ data . constructor . isBuffer ( data )
83
+ ) {
84
+ return Buffer . from ( data )
85
+ }
86
+
87
+ throw new TypeError ( 'The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView.' )
88
+ }
89
+
47
90
HashBase . prototype . update = function ( data , encoding ) {
48
- throwIfNotStringOrBuffer ( data , 'Data' )
49
91
if ( this . _finalized ) throw new Error ( 'Digest already called' )
50
- if ( ! Buffer . isBuffer ( data ) ) data = Buffer . from ( data , encoding )
92
+
93
+ data = toBuffer ( data , encoding ) // asserts correct input type
51
94
52
95
// consume data
53
96
var block = this . _block
0 commit comments