HuuDatLego/Unicode
0
1const express = require('express');2const cors = require('cors');3const bodyParser = require('body-parser');4const { exec } = require('child_process');5const fs = require('fs');6const path = require('path');7const { v4: uuidv4 } = require('uuid');8 9const app = express();10const port = process.env.PORT || 7860;11 12app.set('view engine', 'ejs');13app.set('views', path.join(__dirname, 'views'));14 15app.use(cors());16app.use(bodyParser.json());17app.use(express.static(__dirname));18 19app.get('/', (req, res) => {20 res.render('index');21});22 23app.get('/subject', (req, res) => {24 res.render('subject');25});26 27const TEMP_DIR = path.join(__dirname, 'temp');28if (!fs.existsSync(TEMP_DIR)) {29 fs.mkdirSync(TEMP_DIR);30}31 32app.post('/run', (req, res) => {33 const { code, language, input } = req.body;34 const id = uuidv4();35 let fileName, compileCmd, runCmd;36 37 switch (language) {38 case 'c':39 fileName = `main_${id}.c`;40 const exeName = `main_${id}.exe`;41 fs.writeFileSync(path.join(TEMP_DIR, fileName), code);42 compileCmd = `gcc ${path.join(TEMP_DIR, fileName)} -o ${path.join(TEMP_DIR, exeName)}`;43 runCmd = `${path.join(TEMP_DIR, exeName)}`;44 break;45 case 'python':46 fileName = `main_${id}.py`;47 fs.writeFileSync(path.join(TEMP_DIR, fileName), code);48 runCmd = `python3 ${path.join(TEMP_DIR, fileName)}`;49 break;50 case 'java':51 fileName = `Main_${id.replace(/-/g, '_')}.java`;52 // Note: Java requires class name to match file name53 const javaCode = code.replace(/public class \w+/, `public class Main_${id.replace(/-/g, '_')}`);54 fs.writeFileSync(path.join(TEMP_DIR, fileName), javaCode);55 compileCmd = `javac ${path.join(TEMP_DIR, fileName)}`;56 runCmd = `java -cp ${TEMP_DIR} Main_${id.replace(/-/g, '_')}`;57 break;58 default:59 return res.status(400).json({ error: 'Unsupported language' });60 }61 62 const execute = () => {63 const process = exec(runCmd, { timeout: 10000 }, (runErr, stdout, stderr) => {64 // Cleanup65 fs.readdirSync(TEMP_DIR).forEach(file => {66 if (file.includes(id) || file.includes(id.replace(/-/g, '_'))) {67 try { fs.unlinkSync(path.join(TEMP_DIR, file)); } catch (e) {}68 }69 });70 71 if (runErr && runErr.killed) {72 return res.json({73 stdout: stdout,74 stderr: 'Error: Execution timed out (limit: 10s)',75 exitCode: 12476 });77 }78 79 res.json({80 stdout: stdout,81 stderr: stderr || (runErr ? runErr.message : ''),82 exitCode: runErr ? runErr.code : 083 });84 });85 86 if (input) {87 process.stdin.write(input);88 process.stdin.end();89 }90 };91 92 if (compileCmd) {93 exec(compileCmd, (compErr, stdout, stderr) => {94 if (compErr) {95 return res.json({96 stdout: stdout,97 stderr: stderr || compErr.message,98 exitCode: compErr.code99 });100 }101 execute();102 });103 } else {104 execute();105 }106});107 108app.listen(port, "0.0.0.0", () => {109 console.log(`Server is running on port ${port}`);110});111 