silk-gui
Version:
GUI for developers and Node OS
170 lines (148 loc) • 4.54 kB
JavaScript
var Silk = require('silk-api');
console.dir(Silk);
var path = require('path');
var apps = [];
var appsFolder = __dirname.split(path.sep);
appsFolder = appsFolder.slice(0, appsFolder.length - 1);
appsFolder = appsFolder.join(path.sep);
module.exports = {
"apps/remove": function (data) {
send(void(0), "Deleting...");
var file = data.folder;
var folder = appsFolder + path.sep + file;
var deleteFolderRecursive = function (path) {
if (fs.existsSync(path)) {
fs.readdirSync(path).forEach(function (file, index) {
var curPath = path + "/" + file;
if (fs.lstatSync(curPath).isDirectory()) { // recurse
deleteFolderRecursive(curPath);
} else { // delete file
fs.unlinkSync(curPath);
}
});
fs.rmdirSync(path);
console.log("Finished removing " + file);
send(void(0), " ");
}
};
deleteFolderRecursive(folder);
},
"list": function () {
var context = this;
context.async = true;
console.log("called list");
Silk.call('apps/list', {}, function (err, data) {
console.log("received list");
if (err) {
return context.return(err);
}
console.log(data);
context.return(data);
});
},
"apps/install": startInstall
};
function startInstall(data) {
var path = data.url;
// check if path is local or a github repository
var localPath = false;
if (path.indexOf('/') === 0) {
localPath = true;
} else if (path.indexOf('~/') === 0) {
localPath = true;
}
if (localPath === false) {
download(data, call_obj, send);
} else {
console.log('adding external app');
Silk.call('apps/external/add', data.url, function (err, result) {
console.log('added external app', err, result);
});
}
}
function download(data, call_ob, send) {
fs.exists(appsFolder + path.sep + data.url.replace("/", "-"), function (exists) {
if (exists === true) {
send(new Error("App already exists"));
return;
}
if (data.url === "") {
send(new Error("Url can not be empty"));
}
var repo = data.url;
var url = "https://api.github.com/repos/" + repo + "/zipball";
var options = {
url: url,
headers: {
'User-Agent': 'silk-gui'
}
};
send(void(0), "Downloading...");
request(options).on('response', function (response) {
}).on('error', function (err) {
send(err)
}).on("end", function () {
send(void(0), "pending");
install(data, call_ob, send)
}).pipe(fs.createWriteStream(__dirname + path.sep + 'test.zip'));
});
}
function install(data, call_ob, send) {
send(void(0), "Installing ...");
var extractTo = appsFolder + path.sep + data.url.replace("/", "-");
try {
yauzl.open(__dirname + path.sep + 'test.zip', function (err, zipfile) {
if (err) {
send(err);
return;
}
zipfile.once('end', function () {
Silk.call('apps/start', data.url.replace('/', '-'), function (err, data) {
console.log(error);
send(void(0), "Finished installing!")
});
send(void(0), 'Starting App');
fs.unlink(__dirname + path.sep + 'test.zip', function (err) {
if (err) {
send(err);
}
console.log('Installed ' + data.url);
send(void(0), " ");
})
});
zipfile.on("entry", function (entry) {
if (/\/$/.test(entry.fileName)) {
// directory file names end with '/'
return;
}
var fileName = entry.fileName;
fileName = fileName.split(path.sep);
fileName = fileName.splice(1, fileName.length)
fileName = fileName.join(path.sep);
entry.fileName = fileName;
var dest = path.join(extractTo, entry.fileName)
var destDir = path.dirname(dest)
// dest = dest.split(path.sep);
// dest = dest.slice(0, dest.length - 1);
zipfile.openReadStream(entry, function (err, readStream) {
if (err) {
send(err);
return;
}
mkdirp(destDir, function (err) {
if (err) {
send(err);
}
//entry.fileName = data.url.replace("/", "-");
// ensure parent directory exists, and then:
readStream.pipe(fs.createWriteStream(dest).on("error", function (err) {
send(err)
}))
});
});
});
});
} catch (e) {
send(e);
}
}