blob: 4c735b41a59ed01c7f5eef6d67ba206f4f7e4758 [file] [log] [blame]
'use strict';
// See https://github.com/jshint/jshint/issues/1747 for context
/* global -Promise */
var Promise = require('es6-Promise').Promise;
var fs = require('fs');
var uuid = require('node-uuid');
var zipFolder = require('zip-folder');
var temporary = require('temporary');
module.exports = function(options) {
options = options || {};
var appPath = options.appPath;
var client = options.client;
return new Promise(function(resolve, reject) {
if (appPath === undefined || client === undefined) {
return reject(new Error('App path and client are required to install an app'));
}
// TODO: we can also install hosted apps using the client!
// TODO: do we need to uninstall the app? (it's an unexpected side effect!)
// TODO: optionally launch app
Promise.all([ zipApp(appPath), getWebAppsActor(client) ]).then(function(results) {
var packagedAppPath = results[0];
var webAppsActor = results[1];
var appId = uuid.v1();
installApp(webAppsActor, packagedAppPath, appId).then(function(result) {
resolve(result);
deleteFile(packagedAppPath);
}, function(err) {
reject(err);
deleteFile(packagedAppPath);
});
});
});
};
function zipApp(appPath) {
var zipPath = new temporary.File().path;
return new Promise(function(resolve, reject) {
zipFolder(appPath, zipPath, function(err) {
if (err) {
reject(err);
} else {
resolve(zipPath);
}
});
});
}
function getWebAppsActor(client) {
return new Promise(function(resolve, reject) {
client.getWebapps(function(err, webAppsActor) {
if (err) {
return reject(err);
}
resolve(webAppsActor);
});
});
}
function installApp(webAppsActor, packagedAppPath, appId) {
return new Promise(function(resolve, reject) {
webAppsActor.installPackaged(packagedAppPath, appId, function(err, actualAppId) {
if (err) {
return reject(err);
}
resolve(actualAppId);
});
});
}
function deleteFile(filePath) {
fs.unlinkSync(filePath);
}