Spaces:
Sleeping
Sleeping
| 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<void> { | |
| 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<void> { | |
| 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); | |
| } | |
| } |