import express from "express"; import { Routes } from "../interfaces/router"; import cors from "cors"; import { Server } from "socket.io"; import { createServer } from "http"; import { SocketSubscriber } from "./socket_controller"; import { dirname } from "path"; import fileUpload from "express-fileupload"; import { SetLastActivePipelineToRealTimeServiceScenario } from "../scenarios/set_active_pipeline_to_realtime_service_scenario"; import { CheckAndCreateStaticFilesFolderUseCase } from "../usecases/check_and_create_static_files_folder_usecase"; import { DataBaseConnectUseCase } from "../usecases/database_connect_usecase"; 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 })); this.app.use(express.static("public")); this.app.use( fileUpload({ createParentPath: true, }) ); } private initializeRoutes(routes: Routes[]) { routes.forEach((route) => { this.app.use("/", route.router); }); } async loadAppDependencies() { await new DataBaseConnectUseCase().call(); await new CheckAndCreateStaticFilesFolderUseCase().call(); await new SetLastActivePipelineToRealTimeServiceScenario().call(); } static staticFilesStoreDir = () => { const dir = dirname(__filename); const rootDir = dir.slice(0, dir.length - 20); return rootDir + "public/"; }; }