aboutsummaryrefslogtreecommitdiffhomepage
path: root/index.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'index.mjs')
-rw-r--r--index.mjs49
1 files changed, 47 insertions, 2 deletions
diff --git a/index.mjs b/index.mjs
index f58aa15..055a9a8 100644
--- a/index.mjs
+++ b/index.mjs
@@ -1,12 +1,57 @@
import { readFile } from 'node:fs/promises';
import PHPWasm from './php-wasm.mjs'
+const PRELUDE = `
+define('STDIN', fopen('php://stdin', 'r'));
+define('STDOUT', fopen('php://stdout', 'r'));
+define('STDERR', fopen('php://stderr', 'r'));
+
+`;
+
const code = await readFile('/dev/stdin', { encoding: 'utf-8' });
-const { ccall } = await PHPWasm();
+const BUFFER_MAX = 1024 * 1024; // 1 MiB
+
+let stdoutPos = 0; // bytewise
+const stdoutBuf = Buffer.alloc(BUFFER_MAX);
+let stderrPos = 0; // bytewise
+const stderrBuf = Buffer.alloc(BUFFER_MAX);
+
+const { ccall } = await PHPWasm({
+ 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++,
+ );
+ },
+});
const result = ccall(
'php_wasm_run',
'number', ['string'],
- [code],
+ [PRELUDE + code],
);
console.log(`result: ${result}`);
+
+console.log("stdout:");
+console.log(stdoutBuf.subarray(0, stdoutPos).toString());
+
+console.log("stderr:");
+console.log(stderrBuf.subarray(0, stderrPos).toString());