File: lib/daemon.js
#!/usr/bin/env node
/**
* ApiGeek: Architect
*
* API-based Micro-Service
*
* (c) Lee Curtis 2016 (c) Troven 2009-2015. Apache Licensed.
*
*/
var _ = require("underscore");
var ApiGeek = require("apigeek-dialect"), cli = ApiGeek.cli, Runtime = ApiGeek.Runtime;
var debug = require("debug")("apigeek:daemon");
var log = require("debug")("apigeek:daemon:log");
var assert = require('assert');
var logger = require('winston');
var logsene = require('winston-logsene');
var express = require('express');
var pkg = require("../package");
var RunFeatureHandler = require("./daemon/RunFeatureHandler");
var StatusIconHandler = require("./daemon/StatusIconHandler");
var AuditFeatureHandler = require("./daemon/AuditFeatureHandler");
// setup CLI
cli.option("--listen <port>", "Server port to listen on (default: 9090)");
cli.version(pkg.version);
// initialize Runtime
var apigeek = new Runtime(cli);
assert(apigeek, "Failed to instantiate ApiGeek");
assert(apigeek.config, "Missing config");
apigeek.config.name = pkg.name+"s";
// configure remote logging
if (apigeek.config.logsene) {
logger.add(logsene, _.extend({ssl: 'true', source: pkg.name }, apigeek.config.logsene) );
debug("Logsene Activated");
}
// Load Dialects
_.each(pkg.dependencies, function(ver, dep) {
if (dep.indexOf("dialect-")>=0) {
debug("install: "+dep+" @ "+ver);
apigeek.dialect.learn(require(dep),dep);
}
});
// Initalise WebAPI
const PORT = cli.listen || process.env.PORT || 9090;
var app = express();
app.use(function(req, res,next) {
res.header("X-Powered-By", pkg.name);
next();
})
// set up the express routes
app.get("/favicon.ico", function(req, res, next) { res.sendFile("favicon.png", { root: __dirname+"/../docs" }) })
app.get("/feature/:feature", new RunFeatureHandler(apigeek) );
app.get("/audit/:feature", new AuditFeatureHandler(apigeek) );
app.get("/status/:feature", new StatusIconHandler(apigeek) );
// start listening
app.listen(PORT, function() { console.log('%s listening on port %s', pkg.name, PORT)});
// auto-install dependent dialects - needed in top-level project to resolve external projects