From a10e8e64305e5002c682b45471b417ca4e33773d Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 8 Mar 2025 00:59:36 +0900 Subject: worker: swift to php --- worker/exec.mjs | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 worker/exec.mjs (limited to 'worker/exec.mjs') diff --git a/worker/exec.mjs b/worker/exec.mjs new file mode 100644 index 0000000..7d64cc3 --- /dev/null +++ b/worker/exec.mjs @@ -0,0 +1,72 @@ +import PHPWasm from "./php-wasm.js"; + +process.once("message", async ({ code, input }) => { + const PRELUDE = ` + define('STDIN', fopen('php://stdin', 'r')); + define('STDOUT', fopen('php://stdout', 'r')); + define('STDERR', fopen('php://stderr', 'r')); + + `; + const BUFFER_MAX = 1024; + + let stdinPos = 0; // bytewise + const stdinBuf = Buffer.from(input); + let stdoutPos = 0; // bytewise + const stdoutBuf = Buffer.alloc(BUFFER_MAX); + let stderrPos = 0; // bytewise + const stderrBuf = Buffer.alloc(BUFFER_MAX); + + const { ccall } = await PHPWasm({ + stdin: () => { + if (stdinBuf.length <= stdinPos) { + return null; + } + return stdinBuf.readUInt8(stdinPos++); + }, + stdout: (asciiCode) => { + if (asciiCode === null) { + return; // flush + } + if (BUFFER_MAX <= stdoutPos) { + return; // ignore + } + stdoutBuf.writeUInt8( + asciiCode < 0 ? asciiCode + 256 : asciiCode, + stdoutPos++, + ); + }, + stderr: (asciiCode) => { + if (asciiCode === null) { + return; // flush + } + if (BUFFER_MAX <= stderrPos) { + return; // ignore + } + stderrBuf.writeUInt8( + asciiCode < 0 ? asciiCode + 256 : asciiCode, + stderrPos++, + ); + }, + }); + + let err; + let result; + try { + result = ccall("php_wasm_run", "number", ["string"], [PRELUDE + code]); + } catch (e) { + err = e; + } + if (err) { + process.send({ + status: "runtime_error", + stdout: stdoutBuf.subarray(0, stdoutPos).toString(), + stderr: `${stderrBuf.subarray(0, stderrPos).toString()}\n${err.toString()}`, + }); + } else { + process.send({ + status: result === 0 ? "success" : "runtime_error", + stdout: stdoutBuf.subarray(0, stdoutPos).toString(), + stderr: stderrBuf.subarray(0, stderrPos).toString(), + }); + } +}); -- cgit v1.2.3-70-g09d2 From c06d46eae30c9468535fb6af5e9b822acadbbdb6 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 8 Mar 2025 10:51:01 +0900 Subject: trim php tag before execution --- backend/game/hub.go | 2 +- worker/exec.mjs | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) (limited to 'worker/exec.mjs') diff --git a/backend/game/hub.go b/backend/game/hub.go index 0aca96c..46cd321 100644 --- a/backend/game/hub.go +++ b/backend/game/hub.go @@ -38,7 +38,7 @@ func (hub *Hub) Run() { func (hub *Hub) CalcCodeSize(code string) int { re := regexp.MustCompile(`\s+`) - return len(re.ReplaceAllString(code, "")) + return len(strings.TrimSuffix(strings.TrimPrefix(strings.TrimPrefix(re.ReplaceAllString(code, ""), "")) } func (hub *Hub) EnqueueTestTasks(ctx context.Context, submissionID, gameID, userID int, code string) error { diff --git a/worker/exec.mjs b/worker/exec.mjs index 7d64cc3..fc0accd 100644 --- a/worker/exec.mjs +++ b/worker/exec.mjs @@ -1,12 +1,23 @@ import PHPWasm from "./php-wasm.js"; -process.once("message", async ({ code, input }) => { +process.once("message", async ({ code: originalCode, input }) => { const PRELUDE = ` define('STDIN', fopen('php://stdin', 'r')); define('STDOUT', fopen('php://stdout', 'r')); define('STDERR', fopen('php://stderr', 'r')); `; + + // remove php tag + let code; + if (originalCode.startsWith(" { let err; let result; try { - result = ccall("php_wasm_run", "number", ["string"], [PRELUDE + code]); + result = ccall("php_wasm_run", "number", ["string"], [code]); } catch (e) { err = e; } -- cgit v1.2.3-70-g09d2