-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjava-worker.js
47 lines (40 loc) · 1.48 KB
/
java-worker.js
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
const { parentPort, workerData } = require("worker_threads");
const { spawnSync } = require("child_process");
const os = require("os");
const fs = require("fs");
const path = require("path");
parentPort.on("message", ({ code, input }) => {
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "java-"));
const javaFile = path.join(tmpDir, "Main.java");
const classFile = path.join(tmpDir, "Main.class");
try {
fs.writeFileSync(javaFile, code);
// Compile Java code
const compileProcess = spawnSync("javac", [javaFile], { encoding: "utf-8" });
if (compileProcess.status !== 0) {
return parentPort.postMessage({
error: { fullError: `Compilation Error:\n${compileProcess.stderr}` },
});
}
// Run Java code
const execProcess = spawnSync("java", ["-cp", tmpDir, "Main"], {
input,
encoding: "utf-8",
timeout: 2000,
});
// Clean up temporary files
fs.rmSync(tmpDir, { recursive: true, force: true });
if (execProcess.status !== 0) {
return parentPort.postMessage({
error: { fullError: `Runtime Error:\n${execProcess.stderr}` },
});
}
parentPort.postMessage({
output: execProcess.stdout.trim() || "No output received!",
});
} catch (err) {
parentPort.postMessage({
error: { fullError: `Server error: ${err.message}` },
});
}
});