domotz-remote-pawn
Version:
Domotz Agent
80 lines (69 loc) • 2.02 kB
JavaScript
;
var util = require ("util");
var stream = require ("stream");
var crypto = require ("crypto");
var Reader = require ("../../protocol/client/reader");
var GetStream = module.exports = function (remote, globalOptions, getOptions){
getOptions = getOptions || {};
stream.Readable.call (this);
//Prefer sha1 over md5 if both sums are given
var sum;
if (getOptions.sha1){
sum = crypto.createHash ("sha1");
}else if (getOptions.md5){
sum = crypto.createHash ("md5");
}
var me = this;
this._reader = new Reader ({
file: remote,
globalOptions: globalOptions,
opOptions: getOptions
});
this._reader.onError = function (error){
me.emit ("close");
me.emit ("error", error);
};
this._reader.onAbort = function (){
me.emit ("close");
me.emit ("abort");
};
this._reader.onClose = function (){
me.emit ("close");
if (sum){
var digest = sum.digest ("hex");
if (getOptions.sha1){
if (getOptions.sha1.toLowerCase () !== digest){
return me.emit ("error", new Error ("Invalid SHA1 sum, the file " +
"is corrupted"));
}
}else if (getOptions.md5){
if (getOptions.md5.toLowerCase () !== digest){
return me.emit ("error", new Error ("Invalid MD5 sum, the file " +
"is corrupted"));
}
}
}
me.push (null);
};
this._reader.onStats = function (stats){
me.emit ("stats", stats);
};
this._reader.onData = function (data){
//The reader emits data chunks with the appropiate order. It guarantees
//that the chunks are ready to be processed by the user
//It decouples the pure implementation of the protocol and the Node.js
//streaming part
if (sum) sum.update (data);
me.push (data);
};
};
util.inherits (GetStream, stream.Readable);
GetStream.prototype._read = function (){
//no-op
};
GetStream.prototype.abort = function (error){
this._reader.abort (error);
};
GetStream.prototype.close = function (){
this._reader.close ();
};