UNPKG

troopclient

Version:

Client component for troop style backend svc

176 lines (149 loc) 4.55 kB
"use strict" var COOKIE_DATA = "cookie"; var CONTEXT_URL = "/context"; var QUERY_URL = "/query"; var COMMAND_URL = "/command"; var COMMAND_META_URL_REGEX = /^\/command_meta/; var TROOP_QUERY_PATH = "/query"; var TROOP_METADATA_PATH = "/metadata"; var TROOP_COMMAND_PATH = "/command"; var RESOURCE_ID = "ResourceId"; var SERVICE = "Service"; var CONTEXT_PARAMETERS = "ContextParameters"; var APP = "App"; var INPUT_JSON = "InputJson"; var FAILED = "{\"error\":1}"; var STATIC_FOLDER = "/static"; var PORT = 7163; var HTTP = "http://"; var MAIN_PAGE_URL = HTTP + "localhost:" + PORT + "/index.htm"; var CONTENTTYPE_TEXT = {"Content-Type": "text/plain"}; var CONTENTTYPE_JSON = {"Content-Type": "application/json"}; var targetHost; var userName; var password; var cache = {}; var connect = require("connect"); var url = require("url"); var querystring = require("querystring"); var clc = require("cli-color"); var when = require("when"); var open = require("open"); var request = require("request"); var ask = require("./lib/ask"); var requestHandler = require("./lib/request-handler"); var postdataReader = require("./lib/postdata-reader"); module.exports.run = function (authenticate) { var questions = ["Target host:", "Username:", "Password:"]; ask(questions).then(function (answers) { targetHost = answers[0]; userName = answers[1]; password = answers[2]; if(authenticate) { authenticate(targetHost, userName, password).then(function(val) { if(val) { cache[COOKIE_DATA] = val; console.log(clc.green("Authentication succeed, starting server")); startServer(); } else { console.log(clc.red("authenticate failed")); } }); } else { console.log(clc.green("No authentication required, starting server")); startServer(); } }); } function startServer() { connect() .use(connect.logger("dev")) .use(connect.static(__dirname + STATIC_FOLDER)) .use(function(req, res) { handleRequest(req, res); }) .listen(PORT); open(MAIN_PAGE_URL); } function handleRequest(req, res) { if(req.url == CONTEXT_URL) { handleContext(req, res); } else if(req.url == QUERY_URL) { handleQuery(req, res); } else if(COMMAND_META_URL_REGEX.test(req.url)) { handleCommandMeta(req, res); } else if(req.url == COMMAND_URL) { handleCommand(req, res); } else { res.writeHead(404, CONTENTTYPE_TEXT); res.end(404); } } function handleContext (req, res) { var context = { "targetHost": targetHost, "userName": userName }; res.writeHead(200, CONTENTTYPE_JSON); res.end(JSON.stringify(context)); } function handleQuery(req, res) { res.writeHead(200, CONTENTTYPE_JSON); postdataReader.read(req).then(function(postData) { var resourceId = postData[RESOURCE_ID]; var service = postData[SERVICE]; var contextParameters = postData[CONTEXT_PARAMETERS]; var queryUrl = HTTP + targetHost + service + "?" + contextParameters; var queryMetadataUrl = getQueryMetadataUrl(service, resourceId); when.all([ requestHandler.get(queryMetadataUrl, cache[COOKIE_DATA]) , requestHandler.post(queryUrl, {"q": resourceId}, cache[COOKIE_DATA]) ]) .then(function (val) { res.end(JSON.stringify(val)); }, function () { res.end(FAILED); }); }, function() { res.end(FAILED); }); } function getQueryMetadataUrl(service, resourceId) { var metadataService = service.replace(TROOP_QUERY_PATH, TROOP_METADATA_PATH); var resourceName = resourceId.split('!')[0]; return HTTP + targetHost + metadataService + "/" + resourceName; } function handleCommandMeta(req, res) { var url_parts = url.parse(req.url, true); var app = url_parts.query.app; var service = url_parts.query.service; var targetUrl = HTTP + targetHost + app + TROOP_METADATA_PATH + service; res.writeHead(200, CONTENTTYPE_JSON); requestHandler.get(targetUrl, cache[COOKIE_DATA]).then(function (val) { res.end(val); }, function () { res.end(FAILED); }); } function handleCommand(req, res) { res.writeHead(200, CONTENTTYPE_JSON); postdataReader.read(req).then(function(postData) { var app = postData[APP]; var service = postData[SERVICE]; var inputJson = postData[INPUT_JSON]; var contextParameters = postData[CONTEXT_PARAMETERS]; var commandUrl = HTTP + targetHost + app + TROOP_COMMAND_PATH + service + "?" + contextParameters; requestHandler.postJson(commandUrl, JSON.parse(inputJson), cache[COOKIE_DATA]) .then(function (val) { res.end(JSON.stringify(val)); }, function () { res.end(FAILED); }); }, function() { res.end(FAILED); }); }