Spaces:
Build error
Build error
File size: 3,465 Bytes
bc6743c f3f9912 bc6743c 605d9dd bc6743c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | 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}`);
});
|