zamza
Version:
Apache Kafka discovery, indexing, searches, storage, hooks and HTTP gateway
88 lines (87 loc) • 3.62 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Debug = require("debug");
const debug = Debug("zamza: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, zamza) {
this.config = config;
this.zamza = zamza;
this.server = null;
this.accessControll = new AccessControll_1.default(this.config.access, this.zamza.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.zamza.metrics.inc("http_calls");
if (req.url && req.url.startsWith("/api")) {
this.zamza.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.zamza));
app.use("/api/config", routes_1.routeTopicConfig(this.zamza));
app.use("/api/config", routes_1.routeHook(this.zamza));
app.use("/api/config", routes_1.routeReplay(this.zamza));
app.use("/api/info", routes_1.routeInfo(this.zamza));
app.use("/api/fetch", routes_1.routeFetch(this.zamza));
app.use("/api/produce", routes_1.routeProduce(this.zamza));
app.use("/api/manage", routes_1.routeManage(this.zamza));
app.use("/api/state", routes_1.routeState(this.zamza));
app.use("/api/query", routes_1.routeQuery(this.zamza));
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;