import express, {Application, RequestHandler} from "express"; import { Server as HttpServer } from "http"; import { Logger } from "../logger/logger"; export class Server { private readonly app: Application; private server?: HttpServer; private readonly logger: Logger; constructor(logger: Logger) { this.logger = logger; this.app = express(); this.app.use(express.json()); this.app.use(express.urlencoded({ extended: true })); this.app.use((req, res, next) => { const start = Date.now(); this.logger.info(`[${new Date().toISOString()}] ${req.method} ${req.originalUrl}`); res.on('finish', () => { const duration = Date.now() - start; this.logger.info(`${req.method} ${req.originalUrl} ${res.statusCode} - ${duration}ms`); }); next(); }) } public start(port: number): Promise { return new Promise((resolve, reject) => { if (this.server) { return reject(new Error("Server is already running")); } this.server = this.app.listen(port, () => { this.logger.info(`[Server]: Listening on port ${port}`); resolve(); }); this.server.on("error", reject); }); } public stop(): Promise { return new Promise((resolve, reject) => { if (!this.server) { return resolve(); } this.server.close((err) => { if (err) { return reject(err); } this.server = undefined; resolve(); }); }); } public get(path: string, handler: RequestHandler): void { this.app.get(path, handler); } public post(path: string, handler: RequestHandler): void { this.app.post(path, handler); } }