NSMP-Server / src /server /server.ts
Franek-Le's picture
Add logging
b61dc8a
Raw
History Blame Contribute Delete
1.97 kB
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);
}
}