aboutsummaryrefslogtreecommitdiffhomepage
path: root/index.mjs
blob: 055a9a89d55d944c20143f33f7aff5b738ce7192 (plain)
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());