roach-storm
Version:
Apache Kafka to Google Pub/Sub Gateway, API controlled
83 lines (82 loc) • 3.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const Debug = require("debug");
const debug = Debug("roach:http");
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const pjson = require("../../package.json");
const routes_1 = require("./routes");
const AccessControll_1 = require("./AccessControll");
const DEFAULT_PORT = 1912;
const WARNING_LOG_MS = 1500;
class HttpServer {
constructor(config, roachStorm) {
this.config = config;
this.roachStorm = roachStorm;
this.server = null;
this.accessControll = new AccessControll_1.default(this.config.access, this.roachStorm.metrics);
}
async start() {
const app = express();
app.set("etag", false);
app.use((req, res, next) => {
const onEndOfRequest = () => {
res.removeListener("finish", onEndOfRequest);
res.removeListener("close", onEndOfRequest);
const diff = Date.now() - res.locals.startTime;
// debug(`Access-log: ${req.method} : ${req.url} => ${res.statusCode} after ${diff} ms.`);
if (diff >= WARNING_LOG_MS) {
debug(`Slow request alert: ${req.method} : ${req.url} took ${diff} ms.` +
`Token used: ${this.accessControll.anonymiseToken(req.headers.authorization)}.`);
}
};
// crawler check
if (req.path === "/robots.txt") {
res.status(200);
res.set("content-type", "text/plain");
return res.end("User-agent: *\nDisallow: /");
}
// dev browser check
if (req.path === "/favicon.ico") {
return res.status(404).end();
}
res.on("finish", onEndOfRequest);
res.on("close", onEndOfRequest);
this.roachStorm.metrics.inc("http_calls");
if (req.url && req.url.startsWith("/api")) {
this.roachStorm.metrics.inc("api_calls");
debug("api call =>", req.method, ":", req.url);
}
res.set("x-powered-by", `${pjson.name}/${pjson.version}`);
res.set("cache-control", "no-cache");
res.locals.access = this.accessControll;
next();
});
app.use(cors());
app.use(bodyParser.json());
app.use("/", routes_1.routeRoot(this.roachStorm));
app.use("/api/config", routes_1.routeTopicConfig(this.roachStorm));
app.use("/api/info", routes_1.routeInfo(this.roachStorm));
app.use("/api/state", routes_1.routeState(this.roachStorm));
app.use("/api/produce", routes_1.routeProduce(this.roachStorm));
this.server = await new Promise((resolve, reject) => {
let server = null;
server = app.listen(this.config.port || DEFAULT_PORT, (error) => {
if (error) {
return reject(error);
}
resolve(server);
});
});
debug("Listening on port", this.config.port || DEFAULT_PORT);
return true;
}
close() {
debug("Closing..");
if (this.server) {
this.server.close();
}
}
}
exports.default = HttpServer;