import { PredefinedConfig } from "@config"; import { loggerManager } from "@logger"; import bodyParser from "body-parser"; import express, { Express, NextFunction, Request, Response } from "express"; import helmet from "helmet"; import { createServer, Server as HttpServer } from "http"; import util from "node:util"; import { WebhookRouter } from "./routes/webhook.route"; export class Server { private server: HttpServer; constructor( webhookRouter: WebhookRouter, private readonly predefinedConfig: PredefinedConfig, private readonly app: Express = express(), ) { this.server = createServer(this.app); this.setupMiddleware(); this.setupRoutes(webhookRouter); this.createListeners(); } async start() { await new Promise((resolve) => this.server.listen(this.predefinedConfig.SERVER_PORT, () => resolve(null))); loggerManager.info(`Started a server in port: ${this.predefinedConfig.SERVER_PORT}`); } private createListeners() { this.server.on("error", this.onError); this.server.on("clientError", this.onClientError); } private async onError(e: Error) { loggerManager.error(`Received an error on the server because of ${e}`); } private async onClientError(e: Error) { loggerManager.warn(`Received a client error on the server because of ${e}`); } private setupMiddleware() { this.app.use(bodyParser.urlencoded({ extended: true })); this.app.use(bodyParser.json()); this.app.use(helmet()); } private setupRoutes(webhookRouter: WebhookRouter) { // This is the health check line this.app.get("/", function health(_req, res) { res.sendStatus(200); }); this.app.use(webhookRouter.router); this.app.use((error: Error, _request: Request, response: Response, _next: NextFunction) => { loggerManager.error(util.format(error)); response.status(403).send(error.message); }); } public async stop(): Promise { this.server.close(); } }