UNPKG

cozy-proxy

Version:

Cozy Proxy redirects requests properly to the right application of the Cozy platform depending on given path. It also handles authentication to the Cozy for users and devices.

122 lines (110 loc) 3.46 kB
// Generated by CoffeeScript 1.10.0 var AppManager, Client, logger, urlHelper; Client = require('request-json').JsonClient; urlHelper = require('cozy-url-sdk'); logger = require('printit')({ date: false, prefix: 'lib:app_manager' }); AppManager = (function() { AppManager.prototype.isStarting = []; function AppManager() { this.client = new Client(urlHelper.home.url()); this.router = require('./router'); } AppManager.prototype.ensureStarted = function(slug, shouldStart, callback) { var routes, state; routes = this.router.getRoutes(); if (routes[slug] == null) { logger.error("App " + slug + " unknown"); callback({ code: 404, msg: 'app unknown' }); return; } switch (routes[slug].state) { case 'broken': logger.error("App " + slug + " broken"); return callback({ code: 500, msg: 'app broken' }); case 'installing': return callback({ code: 404, msg: 'app is still installing' }); case 'installed': return callback(null, routes[slug]); case 'stopped': if (shouldStart && (this.isStarting[slug] == null)) { this.isStarting[slug] = true; return this.startApp(slug, (function(_this) { return function(err, response) { delete _this.isStarting[slug]; if (err != null) { logger.error("cannot start app " + slug + " : " + err); return callback({ code: 500, msg: "cannot start app : " + err }); } else { return callback(null, response); } }; })(this)); } else { logger.error("cannot start app " + slug + " : won't start"); return callback({ code: 500, msg: 'wont start' }); } break; default: state = routes[slug].state; logger.error(slug + ": incorrect app state: " + state); return callback({ code: 500, msg: 'incorrect app state' }); } }; AppManager.prototype.startApp = function(slug, callback) { logger.info("Starting app " + slug); return this.client.post("api/applications/" + slug + "/start", {}, (function(_this) { return function(err, res, data) { var msg, routes; if (data != null ? data.error : void 0) { err = err || data.msg; } if ((err != null) || res.statusCode !== 200) { msg = "An error occurred while starting the app " + slug; logger.error(msg + " -- " + err); return callback(err); } else { logger.info("App " + slug + " successfully started."); routes = _this.router.getRoutes(); routes[slug] = { port: data.app.port, state: data.app.state }; return callback(null, routes[slug]); } }; })(this)); }; AppManager.prototype.versions = function(callback) { return this.client.get("api/applications/stack", function(error, res, apps) { if (error != null) { return callback(error); } return callback(null, apps.rows.map(function(app) { return app.name + ": " + app.version; })); }); }; return AppManager; })(); module.exports = new AppManager();