2 var fs = require('fs');
3 var crypto = require('crypto');
4 var isStream = require('is-stream');
5 var Promise = require('pinkie-promise');
7 var hasha = module.exports = function (input, opts) {
10 var outputEncoding = opts.encoding || 'hex';
12 if (outputEncoding === 'buffer') {
13 outputEncoding = undefined;
16 var hash = crypto.createHash(opts.algorithm || 'sha512');
18 var update = function (buf) {
19 var inputEncoding = typeof buf === 'string' ? 'utf8' : undefined;
20 hash.update(buf, inputEncoding);
23 if (Array.isArray(input)) {
24 input.forEach(update);
29 return hash.digest(outputEncoding);
32 hasha.stream = function (opts) {
35 var outputEncoding = opts.encoding || 'hex';
37 if (outputEncoding === 'buffer') {
38 outputEncoding = undefined;
41 var stream = crypto.createHash(opts.algorithm || 'sha512');
42 stream.setEncoding(outputEncoding);
46 hasha.fromStream = function (stream, opts) {
47 if (!isStream(stream)) {
48 return Promise.reject(new TypeError('Expected a stream'));
53 return new Promise(function (resolve, reject) {
56 .pipe(hasha.stream(opts))
58 .on('finish', function () {
64 hasha.fromFile = function (fp, opts) {
65 return hasha.fromStream(fs.createReadStream(fp), opts);
68 hasha.fromFileSync = function (fp, opts) {
69 return hasha(fs.readFileSync(fp), opts);