Spaces:
Sleeping
Sleeping
File size: 1,968 Bytes
d6986d3 726889d b61dc8a 726889d b61dc8a 726889d d6986d3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 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);
}
} |