Fix vfs not always connecting if first node binary in list doesn't exist

We'd first get a EPIPE and then an ENOENT in this scenario,
breaking our retry behavior.
pull/223/head
Lennart Kats 2015-11-04 11:18:22 +00:00
rodzic 72a9eb5d4a
commit 4d49d34712
1 zmienionych plików z 23 dodań i 10 usunięć

33
node_modules/vfs-child/parent.js wygenerowano vendored
Wyświetl plik

@ -1,6 +1,7 @@
var Consumer = require('vfs-socket/consumer').Consumer;
var inherits = require('util').inherits;
var spawn = require('child_process').spawn;
var fs = require("fs");
exports.Parent = Parent;
@ -23,27 +24,39 @@ function Parent(fsOptions) {
// Override Consumer's connect since the transport logic is internal to this module
this.connect = connect.bind(this);
function connect(callback) {
var _self = this;
try {
// Check if file exists first; spawn's ENOENT may arrive after other errors
if (!fs.existsSync(nodeBin[0]))
return tryNext(new Error("Couldn't find valid node binary"));
child = spawn(nodeBin[0], args, options).on("error", tryNext);
}
catch (e) {
return tryNext(e);
return done(e);
}
child.stdin.readable = true;
Consumer.prototype.connect.call(this, [child.stdout, child.stdin], tryNext);
Consumer.prototype.connect.call(this, [child.stdout, child.stdin], done);
child.on("exit", disconnect);
child.stdin.resume();
var _self = this;
// try all possible locations of node before giving up
function tryNext(err, vfs) {
if (!child) return;
child.removeListener("error", tryNext);
child.on("error", function ignore() {});
if (err && err.code == "ENOENT" && nodeBin.length > 1) {
child = null;
function tryNext(err) {
if (nodeBin.length > 1) {
nodeBin.shift();
_self.emit("error", err);
_self.connect(callback);
} else {
return done(err);
}
}
function done(err, vfs) {
if (!child) return;
child.removeListener("error", done);
child.on("error", function ignore(err) {});
child = null;
if (err && err.code == "ENOENT") {
tryNext(err);
} else {
callback(err, vfs);
}