webvm icon indicating copy to clipboard operation
webvm copied to clipboard

Support capturing stdout

Open jaulz opened this issue 2 years ago • 2 comments

Is it possible to read any file from the VM? I tried to use cat via the run function but the run function does only return the exit code (I assume). I see that the output is logged to the console but it would be great to have a callback for the output as well.

jaulz avatar Jun 23 '23 07:06 jaulz

There is currently no APIs to either read files from the disk or to capture stdout. As things stand today your best bet is to hook the console output.

For such small questions I would like to encourage you to join our discord: https://discord.gg/yTNZgySKGa

I'll keep this bug open as a feature request

alexp-sssup avatar Jun 23 '23 07:06 alexp-sssup

For the time being, you can capture console output (i.e. both stdout and stderr) with the following snippet. This works by capturing all output into an array bufs whilst the command runs, and then clearing it when it finishes.

const cx = await CheerpXApp.create(/* ... */);

const decoder = new TextDecoder("utf-8");
let bufs = [];
const writeCharCode = cx.setCustomConsole(buf => bufs.push(buf), 60, 30);

async function run(command, args, opts) {
  const code = await cx.run(command, args, opts);
  
  const output = bufs.map(buf => decoder.decode(buf)).join("");
  bufs = [];
  
  return { code, output };
}

// Run cat and capture its output
const cat = await run("/bin/cat", ["/etc/hosts"], {
  env: ["HOME=/home/user", "TERM=xterm", "USER=user", "SHELL=/bin/bash", "EDITOR=vim", "LANG=en_US.UTF-8", "LC_ALL=C"],
  cwd: "/",
  uid: 1000,
  gid: 1000,
});
console.log("cat exited with code:", cat.code);
console.log("cat output:", cat.output);

bates64 avatar Aug 17 '23 09:08 bates64