1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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 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'],
[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());
|