UNPKG

censeo

Version:

Run arbitrary JavaScript or PogoScript on a server

139 lines 7.47 kB
(function() { var self = this; var http, socketIO, log, serverRequire, pogoWrappers; http = require("http"); socketIO = require("socket.io"); log = require("debug")("censeo:server"); serverRequire = function(path) { var tryPath; tryPath = path; if (path[0] === ".") { tryPath = process.cwd() + "/" + path; } try { return require(tryPath); } catch (e) { if (e.code === "MODULE_NOT_FOUND") { log("censeo paths", module.paths); throw { message: "Censeo could not find the file '" + tryPath + "'", code: e.code }; } else { throw e; } } }; pogoWrappers = function() { return "\n //TODO it would be nice if we could just get these from pogo\n\n var promisify = function(fn) {\n return new Promise(function(onFulfilled, onRejected) {\n fn(function(error, result) {\n if (error) {\n onRejected(error);\n } else {\n onFulfilled(result);\n }\n });\n });\n }.toString();\n\n for (var iteration=1; iteration<10; iteration++) {\n eval('var gen'+iteration+'_promisify = ' + promisify );\n }\n\n var asyncFor = function(test, incr, loop) {\n return new Promise(function(success, failure) {\n function testAndLoop(loopResult) {\n Promise.resolve(test()).then(function(testResult) {\n if (testResult) {\n Promise.resolve(loop()).then(incrTestAndLoop, failure);\n } else {\n success(loopResult);\n }\n }, failure);\n }\n function incrTestAndLoop(loopResult) {\n Promise.resolve(incr()).then(function() {\n testAndLoop(loopResult);\n }, failure);\n }\n testAndLoop();\n });\n }.toString();\n\n\n for (var iteration=1; iteration<10; iteration++) {\n eval('var gen'+iteration+'_asyncFor = ' + asyncFor );\n }\n "; }; module.exports = function(server) { var self = this; var tasks; log("Starting censeo"); tasks = []; return server.on("connection", function(socket) { var convertErrorToEmit, emitError, run; socket.on("error", function(e) { return log("Socker error " + e); }); convertErrorToEmit = function(options, run) { var gen1_asyncResult; return new Promise(function(gen2_onFulfilled) { gen2_onFulfilled(new Promise(function(gen2_onFulfilled) { gen2_onFulfilled(Promise.resolve(run())); }).then(void 0, function(e) { return emitError(options, e); })); }); }; emitError = function(options, error) { return socket.emit("error:" + options.id, { message: error.message }); }; run = function(options) { var gen3_asyncResult; return new Promise(function(gen2_onFulfilled) { gen2_onFulfilled(Promise.resolve(convertErrorToEmit(options, function() { var func, context, runFunc, gen4_asyncResult; return new Promise(function(gen2_onFulfilled) { func = options.func; context = options.context; context.process = process; context.require = serverRequire; context.serverRequire = serverRequire; runFunc = Function("context", "callback", "\n for (var property in context) {\n eval ('var '+property+'= context.'+property);\n }\n\n " + pogoWrappers() + "\n\n return (" + func + ")();\n "); gen2_onFulfilled(Promise.resolve(runFunc(context))); }); }))); }); }; socket.on("runTask", function(options) { var gen5_asyncResult, result; return new Promise(function(gen2_onFulfilled) { log("Run task received " + options.id); gen2_onFulfilled(Promise.resolve(run(options)).then(function(gen5_asyncResult) { result = gen5_asyncResult; tasks.push({ id: options.id, stop: result.stop, data: result.data }); return socket.emit("running:" + options.id, result); })); }); }); socket.on("run", function(options) { var gen6_asyncResult, result; return new Promise(function(gen2_onFulfilled) { log("Run received " + options.id); gen2_onFulfilled(Promise.resolve(run(options)).then(function(gen6_asyncResult) { result = gen6_asyncResult; return socket.emit("ran:" + options.id, result); })); }); }); socket.on("stop", function(options) { var runningTask, gen7_asyncResult, result; return new Promise(function(gen2_onFulfilled) { log("Stop received " + options.id); runningTask = function() { var gen8_results, gen9_items, gen10_i, task; gen8_results = []; gen9_items = tasks; for (gen10_i = 0; gen10_i < gen9_items.length; ++gen10_i) { task = gen9_items[gen10_i]; (function(task) { if (task.id === options.id) { return gen8_results.push(task); } })(task); } return gen8_results; }()[0]; gen2_onFulfilled(Promise.resolve(function() { if (runningTask) { return new Promise(function(gen2_onFulfilled) { gen2_onFulfilled(Promise.resolve(runningTask.stop()).then(function(gen11_asyncResult) { result = gen11_asyncResult; tasks.splice(tasks.indexOf(runningTask), 1); return socket.emit("stopped:" + options.id, result); })); }); } }())); }); }); return log("Censeo server ready"); }); }; module.exports.listen = function(port) { var self = this; var app, server; app = http.createServer(); server = socketIO(app); module.exports(server); return app.listen(port); }; }).call(this);