import express from "express"; import morgan from "morgan"; import { createServer } from "http"; import { setupRoutes } from "./src/internal/routerHandler/routeHandler.js"; import { printers } from "./src/internal/ocp/printers/printers.js"; import { dirname, join } from "path"; import { fileURLToPath } from "url"; import { db } from "./src/pkg/db/db.js"; import { settings } from "./src/pkg/db/schema/settings.js"; import { validateEnv } from "./src/pkg/utils/envValidator.js"; import { createLogger } from "./src/pkg/logger/logger.js"; import { returnFunc } from "./src/pkg/utils/return.js"; import { initializeProdPool } from "./src/pkg/prodSql/prodSqlConnect.js"; import { tryCatch } from "./src/pkg/utils/tryCatch.js"; import os from "os"; import { sendNotify } from "./src/pkg/utils/notify.js"; const main = async () => { const env = validateEnv(process.env); const PORT = Number(env.VITE_PORT) || 4200; //create the logger const log = createLogger({ module: "system", subModule: "main start" }); // base path let basePath: string = ""; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // Db connection stuff const res = await tryCatch(db.select().from(settings)); if (res.error) { return returnFunc({ success: false, module: "system", level: "fatal", message: `Database lookup failed`, notify: false, data: [], }); } if (res.data.length === 0) { //return // returnFunc({ // success: false, // module: "system", // level: "fatal", // message: `This seems to be the first time you have started the app please validate the settings have been intiated`, // notify: false, // data: [], // }); } // connect to the prod sql await initializeProdPool(); // express app const app = express(); // global middleware app.use(express.json()); // global env that run only in dev if (process.env.NODE_ENV?.trim() !== "production") { app.use(morgan("tiny")); basePath = "/lst"; app.use( basePath + "/test", express.static(join(__dirname, "../controller")) ); } // docs and api stuff app.use( basePath + "/d", express.static(join(__dirname, "../lstDocs/build")) ); app.use( basePath + "/app", express.static(join(__dirname, "../frontend/dist")) ); // register app setupRoutes(app, basePath); // ws stuff // ws + server stuff const server = createServer(app); // sub systems printers(); // start the server up server.listen(PORT, "0.0.0.0", () => log.info( { stack: { name: "test" } }, `Server running in ${ process.env.NODE_ENV ? process.env.NODE_ENV : "dev" }, on http://0.0.0.0:${PORT}${basePath}` ) ); process.on("uncaughtException", async (err) => { //console.log("Uncaught Exception:", err); // await closePool(); // const emailData = { // email: "blake.matthes@alpla.com", // should be moved to the db so it can be reused. // subject: `${os.hostname()} has just encountered a crash.`, // template: "serverCrash", // context: { // error: err, // plant: `${os.hostname()}`, // }, // }; if (!process.env.WEBHOOK_URL) { // await sendEmail(emailData); } else { log.fatal({ stack: err.stack }, err.message); await sendNotify({ module: "system", subModule: "fatalCrash", hostname: os.hostname(), message: err.message, stack: err?.stack, }); } //process.exit(1); }); // setInterval(() => { // const used = process.memoryUsage(); // console.log( // `Heap: ${(used.heapUsed / 1024 / 1024).toFixed(2)} MB / RSS: ${( // used.rss / // 1024 / // 1024 // ).toFixed(2)} MB` // ); // }, 10000); }; main();