Spaces:
Build error
Build error
| 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}`); | |
| }); | |