const express = require('express'); const cors = require('cors'); const bodyParser = require('body-parser'); const { exec } = require('child_process'); const fs = require('fs'); const path = require('path'); const { v4: uuidv4 } = require('uuid'); const app = express(); const port = process.env.PORT || 7860; app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'views')); app.use(cors()); app.use(bodyParser.json()); app.use(express.static(__dirname)); app.get('/', (req, res) => { res.render('index'); }); app.get('/subject', (req, res) => { res.render('subject'); }); const TEMP_DIR = path.join(__dirname, 'temp'); if (!fs.existsSync(TEMP_DIR)) { fs.mkdirSync(TEMP_DIR); } app.post('/run', (req, res) => { const { code, language, input } = req.body; const id = uuidv4(); let fileName, compileCmd, runCmd; switch (language) { case 'c': fileName = `main_${id}.c`; const exeName = `main_${id}.exe`; fs.writeFileSync(path.join(TEMP_DIR, fileName), code); compileCmd = `gcc ${path.join(TEMP_DIR, fileName)} -o ${path.join(TEMP_DIR, exeName)}`; runCmd = `${path.join(TEMP_DIR, exeName)}`; break; case 'python': fileName = `main_${id}.py`; fs.writeFileSync(path.join(TEMP_DIR, fileName), code); runCmd = `python3 ${path.join(TEMP_DIR, fileName)}`; break; case 'java': fileName = `Main_${id.replace(/-/g, '_')}.java`; // Note: Java requires class name to match file name const javaCode = code.replace(/public class \w+/, `public class Main_${id.replace(/-/g, '_')}`); fs.writeFileSync(path.join(TEMP_DIR, fileName), javaCode); compileCmd = `javac ${path.join(TEMP_DIR, fileName)}`; runCmd = `java -cp ${TEMP_DIR} Main_${id.replace(/-/g, '_')}`; break; default: return res.status(400).json({ error: 'Unsupported language' }); } const execute = () => { const process = exec(runCmd, { timeout: 10000 }, (runErr, stdout, stderr) => { // Cleanup fs.readdirSync(TEMP_DIR).forEach(file => { if (file.includes(id) || file.includes(id.replace(/-/g, '_'))) { try { fs.unlinkSync(path.join(TEMP_DIR, file)); } catch (e) {} } }); if (runErr && runErr.killed) { return res.json({ stdout: stdout, stderr: 'Error: Execution timed out (limit: 10s)', exitCode: 124 }); } res.json({ stdout: stdout, stderr: stderr || (runErr ? runErr.message : ''), exitCode: runErr ? runErr.code : 0 }); }); if (input) { process.stdin.write(input); process.stdin.end(); } }; if (compileCmd) { exec(compileCmd, (compErr, stdout, stderr) => { if (compErr) { return res.json({ stdout: stdout, stderr: stderr || compErr.message, exitCode: compErr.code }); } execute(); }); } else { execute(); } }); app.listen(port, "0.0.0.0", () => { console.log(`Server is running on port ${port}`); });