troopclient
Version:
Client component for troop style backend svc
176 lines (149 loc) • 4.55 kB
JavaScript
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);
});
}