diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-09-05 20:12:41 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-09-05 20:52:56 +0900 |
| commit | c7941d027be068f6e563a17e882232580fe15334 (patch) | |
| tree | 40479fdff8903af289f8a2a02c6f58ba1c69a82c /worker/php/exec.mjs | |
| parent | 0f91e938442b22e54ba2f1b29e25d678cf0acdd3 (diff) | |
| download | iosdc-japan-2025-albatross-c7941d027be068f6e563a17e882232580fe15334.tar.gz iosdc-japan-2025-albatross-c7941d027be068f6e563a17e882232580fe15334.tar.zst iosdc-japan-2025-albatross-c7941d027be068f6e563a17e882232580fe15334.zip | |
feat(worker): move directory worker/ to worker/php/
Diffstat (limited to 'worker/php/exec.mjs')
| -rw-r--r-- | worker/php/exec.mjs | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/worker/php/exec.mjs b/worker/php/exec.mjs new file mode 100644 index 0000000..d8ca899 --- /dev/null +++ b/worker/php/exec.mjs @@ -0,0 +1,85 @@ +import PHPWasm from "./php-wasm.js"; + +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')); + + error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE & ~E_DEPRECATED); + + `; + + // remove php tag + let code; + if (originalCode.startsWith("<?php")) { + code = PRELUDE + originalCode.slice(5); + } else if (originalCode.startsWith("<?")) { + code = PRELUDE + originalCode.slice(2); + } else { + code = PRELUDE + originalCode; + } + + const BUFFER_MAX = 10 * 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"], [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(), + }); + } +}); |
