From af78ada00c645a98b3e149b206cfe75daf9d1aed Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 23 Apr 2025 03:50:45 +0900 Subject: pass custom stdout/stderr --- index.mjs | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) (limited to 'index.mjs') 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()); -- cgit v1.2.3-70-g09d2