import express from "express"; import { Routes } from "../interfaces/router"; import cors from "cors"; import locator from "../di/register_di"; import { DevEnv, UnitTestEnv } from "../di/env"; import mongoose from "mongoose"; import { Server } from "socket.io"; import { createServer } from "http"; import { TypedEvent } from "../helper/typed_event"; import { SocketSubscriber } from "./socket_controller"; export class App { public app: express.Application; public port: number; public env: string; public socketSubscribers: SocketSubscriber[]; public io: Server; constructor(routes: Routes[], socketSubscribers: SocketSubscriber[]) { this.port = 4001; this.socketSubscribers = socketSubscribers; this.env = "dev"; this.app = express(); this.loadAppDependencies().then(() => { this.initializeMiddlewares(); this.initializeRoutes(routes); }); } public listen() { const httpServer = createServer(this.app); const io = new Server(httpServer, { cors: { origin: "*" }, }); io.on("connection", (socket) => { this.socketSubscribers.map((el) => { el.emitter.on((e) => { socket.emit(el.event, e); }); }); }); httpServer.listen(this.port, () => { console.info(`=================================`); console.info(`======= ENV: ${this.env} =======`); console.info(`🚀 HTTP http://localhost:${this.port}`); console.info(`🚀 WS ws://localhost:${this.port}`); console.info(`=================================`); }); this.io = io; } public getServer() { return this.app; } private initializeMiddlewares() { this.app.use(cors()); this.app.use(express.json()); this.app.use(express.urlencoded({ extended: true })); } private initializeRoutes(routes: Routes[]) { routes.forEach((route) => { this.app.use("/", route.router); }); } async loadAppDependencies() { // await locator( // this.env == "development" // ? new DevEnv(this.computedFolder) // : new UnitTestEnv(this.computedFolder) // ); mongoose .connect("mongodb://127.0.0.1:27017/test") .then(() => {}) .catch((e) => { console.log("ERROR:", e); }); } }