File size: 4,251 Bytes
a55949b
 
314a3e4
a55949b
314a3e4
 
a55949b
 
 
 
 
 
 
 
 
336b464
a55949b
 
84c00ca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93d296d
41a4668
 
 
 
 
 
 
 
 
 
 
93d296d
41a4668
 
 
 
93d296d
41a4668
 
 
 
 
 
93d296d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41a4668
93d296d
f311e4e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93d296d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f311e4e
 
84c00ca
 
314a3e4
93d296d
e7e6e29
314a3e4
 
 
93d296d
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const cors = require("cors");
const fs = require("fs");
const { exec } = require("child_process");
const compiler = require("compilex");
const options = { stats: true };
compiler.init(options);

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cors());

app.get("/", function (req, res) {
  res.send("Hello World!!");
});

app.post("/compile", function (req, res) {
    var code = req.body.code;
    var input = req.body.input;
    var lang = req.body.lang;
  
    try {
       if (lang == "Python") {
        if (!input) {
          var envData = { OS: "linux" };
          compiler.compilePython(envData, code, function (data) {
            if (data.output) {
              res.send(data);
            } else {
              res.send({ error: data.error });
            }
          });
        } else {
          var envData = { OS: "linux" };
          compiler.compilePythonWithInput(envData, code, input, function (data) {
            if (data.output) {
              res.send(data);
            } else {
              res.send({ error: data.error });
            }
          });
        }
      } else if (lang == "Java") {
        fs.writeFile("/code/temp/Main.java", code, (err) => {
          if (err) {
            console.error(err);
            res.status(500).send("Error writing Java file");
            return;
          }
          const javaProcess = exec(
            "javac -d /code/temp /code/temp/Main.java && java -cp /code/temp Main",
            (error, stdout, stderr) => {
              if (error) {
                console.error(error);
                res.send({ error: stderr });
                return;
              }
              console.log(stdout);
              console.error(stderr);
              res.send({ output: stdout });
            }
          );
          if (input) {
            javaProcess.stdin.write(input);
            javaProcess.stdin.end();
          }

          // Timeout functionality
          const timeout = 5000; // 5 seconds timeout
          let isTimeout = false;
          const timeoutId = setTimeout(() => {
            isTimeout = true;
            javaProcess.kill(); // Kill the process if it exceeds the timeout
            res.status(408).send({ error: "Time Limit Exceeded" });
          }, timeout);

          javaProcess.on("exit", () => {
            clearTimeout(timeoutId); // Clear the timeout if the process exits before the timeout
            if (!isTimeout) {
              res.send({ output: stdout });
            }
          });
        });
      } else if (lang == "Cpp") {
        fs.writeFile("/code/temp/Main.cpp", code, (err) => {
          if (err) {
            console.error(err);
            res.status(500).send("Error writing C++ file");
            return;
          }
          const cppProcess = exec(
            "g++ -o /code/temp/Main /code/temp/Main.cpp && /code/temp/Main",
            (error, stdout, stderr) => {
              if (error) {
                console.error(error);
                res.send({ error: stderr });
                return;
              }
              console.log(stdout);
              console.error(stderr);
              res.send({ output: stdout });
            }
          );
          if (input) {
            cppProcess.stdin.write(input);
            cppProcess.stdin.end();
          }

          // Timeout functionality
          const timeout = 5000; // 5 seconds timeout
          let isTimeout = false;
          const timeoutId = setTimeout(() => {
            isTimeout = true;
            cppProcess.kill(); // Kill the process if it exceeds the timeout
            res.status(408).send({ error: "Time Limit Exceeded" });
          }, timeout);

          cppProcess.on("exit", () => {
            clearTimeout(timeoutId); // Clear the timeout if the process exits before the timeout
            if (!isTimeout) {
              res.send({ output: stdout });
            }
          });
        });
      }
    } catch (e) {
      console.log("error:" + e);
    }
});

const port = 7860;
app.listen(port, () => {
  console.log(`Open http://localhost:${port}`);
});