'use strict';
|
const fs = require('fs');
|
const crypto = require('crypto');
|
const isStream = require('is-stream');
|
|
const hasha = (input, opts) => {
|
opts = opts || {};
|
|
let outputEncoding = opts.encoding || 'hex';
|
|
if (outputEncoding === 'buffer') {
|
outputEncoding = undefined;
|
}
|
|
const hash = crypto.createHash(opts.algorithm || 'sha512');
|
|
const update = buf => {
|
const inputEncoding = typeof buf === 'string' ? 'utf8' : undefined;
|
hash.update(buf, inputEncoding);
|
};
|
|
if (Array.isArray(input)) {
|
input.forEach(update);
|
} else {
|
update(input);
|
}
|
|
return hash.digest(outputEncoding);
|
};
|
|
hasha.stream = opts => {
|
opts = opts || {};
|
|
let outputEncoding = opts.encoding || 'hex';
|
|
if (outputEncoding === 'buffer') {
|
outputEncoding = undefined;
|
}
|
|
const stream = crypto.createHash(opts.algorithm || 'sha512');
|
stream.setEncoding(outputEncoding);
|
return stream;
|
};
|
|
hasha.fromStream = (stream, opts) => {
|
if (!isStream(stream)) {
|
return Promise.reject(new TypeError('Expected a stream'));
|
}
|
|
opts = opts || {};
|
|
return new Promise((resolve, reject) => {
|
stream
|
.on('error', reject)
|
.pipe(hasha.stream(opts))
|
.on('error', reject)
|
.on('finish', function () {
|
resolve(this.read());
|
});
|
});
|
};
|
|
hasha.fromFile = (fp, opts) => hasha.fromStream(fs.createReadStream(fp), opts);
|
|
hasha.fromFileSync = (fp, opts) => hasha(fs.readFileSync(fp), opts);
|
|
module.exports = hasha;
|