56 lines
1.4 KiB
TypeScript
56 lines
1.4 KiB
TypeScript
import axios from "axios"
|
|
import { DEAD_RESULTS } from "./constants"
|
|
import { Code } from "./types"
|
|
|
|
const http = axios.create({ baseURL: "https://judge0api.hyyz.izhai.net" })
|
|
|
|
function encode(str: string) {
|
|
return btoa(unescape(encodeURIComponent(str ?? "")))
|
|
}
|
|
|
|
function decode(bytes: string) {
|
|
let escaped = escape(atob(bytes ?? ""))
|
|
try {
|
|
return decodeURIComponent(escaped)
|
|
} catch (e) {
|
|
return unescape(escaped)
|
|
}
|
|
}
|
|
|
|
export async function createTestSubmission(code: Code, input: string) {
|
|
const encodedCode = encode(code.value)
|
|
|
|
if (encodedCode === DEAD_RESULTS[code.language].encoded) {
|
|
return DEAD_RESULTS[code.language].result
|
|
} else {
|
|
const id = {
|
|
C: 50,
|
|
"C++": 54,
|
|
Java: 62,
|
|
Golang: 60,
|
|
JavaScript: 63,
|
|
Python2: 70,
|
|
Python3: 71,
|
|
}[code.language]
|
|
let compilerOptions = ""
|
|
if (id === 50) compilerOptions = "-lm" // 解决 GCC 的链接问题
|
|
const payload = {
|
|
source_code: encodedCode,
|
|
language_id: id,
|
|
stdin: encode(input),
|
|
redirect_stderr_to_stdout: true,
|
|
compiler_options: compilerOptions,
|
|
}
|
|
const response = await http.post("/submissions", payload, {
|
|
params: { base64_encoded: true, wait: true },
|
|
})
|
|
const data = response.data
|
|
return {
|
|
status: data.status && data.status.id,
|
|
output: [decode(data.compile_output), decode(data.stdout)]
|
|
.join("\n")
|
|
.trim(),
|
|
}
|
|
}
|
|
}
|