@fdm-monster/server
Version:
FDM Monster is a bulk OctoPrint, Klipper, PrusaLink and BambuLab manager to set up, configure and monitor 3D printers. Our aim is to provide neat overview over your farm.
65 lines (64 loc) • 2.48 kB
JavaScript
import { ensureDirExists, getDatabaseFolder, getMediaPath } from "./utils/fs.utils.js";
import { initializePassportStrategies } from "./middleware/passport.js";
import { LoggerService } from "./handlers/logger.js";
import { configureContainer } from "./container.js";
import { interceptDatabaseError } from "./middleware/database.js";
import { interceptRoles, validateWizardCompleted } from "./middleware/global.middleware.js";
import passport from "passport";
import { Counter } from "prom-client";
import express, { json, urlencoded } from "express";
import { scopePerRequest } from "awilix-express";
import cookieParser from "cookie-parser";
import cors from "cors";
import helmet from "helmet";
//#region src/server.core.ts
const httpRequestsTotal = new Counter({
name: "http_requests_total",
help: "HTTP requests executed"
});
async function setupServer() {
const logger = new LoggerService("FDM-ServerCore");
const httpServer = express();
const databasePath = getDatabaseFolder();
ensureDirExists(databasePath);
logger.log(`Expecting database at path ${databasePath}`);
const mediaPath = getMediaPath();
ensureDirExists(mediaPath);
logger.log(`Expecting media at path ${mediaPath}`);
const container = configureContainer();
initializePassportStrategies(passport, container);
httpServer.use((req, res, next) => {
if ((req.route?.path ?? req.path ?? "unknown").includes("/api")) {
const start = process.hrtime();
res.on("finish", () => {
httpRequestsTotal.inc();
const delta = process.hrtime(start);
const duration = delta[0] + delta[1] / 1e9;
new LoggerService("HttpRequest").newDebug({
message: `HTTP request ${req.method} ${req.originalUrl} ${res.statusCode}`,
method: req.method,
path: req.originalUrl,
statusCode: res.statusCode,
responseTimeMs: duration.toFixed(2),
clientIp: req.ip,
userAgent: req.get("User-Agent")
});
});
}
next();
}).use(cors({
origin: "*",
methods: "GET,HEAD,PUT,PATCH,POST,DELETE"
})).use(helmet({ contentSecurityPolicy: false })).use(json({ limit: "10mb" })).use(cookieParser()).use(urlencoded({ extended: false })).use(passport.initialize()).use(passport.authenticate([
"jwt",
"api-key",
"anonymous"
], { session: false })).use(scopePerRequest(container)).use(interceptDatabaseError).use(validateWizardCompleted).use(interceptRoles);
return {
httpServer,
container
};
}
//#endregion
export { setupServer };
//# sourceMappingURL=server.core.js.map