CoolFace
Apppublic

HuuDatLego/Unicode

sourceHugging Faceupdated 6mo agoView on Hugging Face
0likes
server.js111 linesDownload Raw Back to root
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