UNPKG

zamza

Version:

Apache Kafka discovery, indexing, searches, storage, hooks and HTTP gateway

88 lines (87 loc) 3.62 kB
"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;