Ratan1870/code-execution
0
1require("dotenv").config();2 3const app = require("./app");4const config = require("./config");5const logger = require("./utils/logger.util");6const { ensureDir } = require("./utils/file.util");7const { verifyDocker, buildSandboxImage } = require("./utils/docker.util");8 9async function bootstrap() {10 logger.info("═══════════════════════════════════════════════");11 logger.info(" 🚀 Code Execution Engine — Starting...");12 logger.info("═══════════════════════════════════════════════");13 14 // Step 1: Check execution mode15 if (config.EXECUTION_MODE === "process") {16 logger.info("🔧 Running in PROCESS mode (no Docker required)");17 } else {18 // Docker mode: verify Docker is available and build sandbox image19 await verifyDocker();20 await buildSandboxImage();21 }22 23 // Step 2: Ensure temp directory exists24 await ensureDir(config.TEMP_DIR);25 26 // Step 3: Start HTTP server27 app.listen(config.PORT, "0.0.0.0", () => {28 logger.info("───────────────────────────────────────────────");29 logger.info(` ✅ Server running on http://0.0.0.0:${config.PORT}`);30 logger.info(` 📋 Environment: ${config.NODE_ENV}`);31 logger.info(` 🐳 Sandbox image: ${config.SANDBOX_IMAGE}`);32 logger.info(` ⚡ Max concurrent: ${config.MAX_CONCURRENT}`);33 logger.info(` 🔒 Memory limit: ${config.MAX_MEMORY_LIMIT}MB`);34 logger.info(` ⏱️ Time limit: ${config.MAX_TIME_LIMIT}s`);35 logger.info(` 🌐 Languages: C, C++, Python`);36 logger.info("───────────────────────────────────────────────");37 logger.info(" API Endpoints:");38 logger.info(" GET /api/health → Health check");39 logger.info(" GET /api/languages → Supported languages");40 logger.info(" POST /api/execute → Run code");41 logger.info(" POST /api/judge → Judge with test cases");42 logger.info(" POST /api/batch-judge → Batch judge");43 logger.info("═══════════════════════════════════════════════");44 });45}46 47// Graceful shutdown48process.on("SIGTERM", () => {49 logger.info("🛑 SIGTERM received. Shutting down...");50 process.exit(0);51});52 53process.on("SIGINT", () => {54 logger.info("🛑 SIGINT received. Shutting down...");55 process.exit(0);56});57 58process.on("uncaughtException", (err) => {59 logger.error("Uncaught Exception:", err.message);60 process.exit(1);61});62 63process.on("unhandledRejection", (reason) => {64 logger.error("Unhandled Rejection:", reason);65 process.exit(1);66});67 68bootstrap().catch((err) => {69 logger.error("❌ Failed to start server:", err.message);70 process.exit(1);71});72 