Public
Edited
Jan 11, 2024
Importers
2 stars
WASI browser_wasi_shim experiments
Insert cell
Insert cell
Insert cell
simple_wasm = FileAttachment("simple.wasm")
Insert cell
Insert cell
xterm = (await import("https://cdn.skypack.dev/xterm@4.18.0?min")).default
.Terminal
Insert cell
Insert cell
terminalContainer
Insert cell
xtermCSS
Insert cell
term = Terminal
Insert cell
Insert cell
wasiShim = import(
"https://cdn.jsdelivr.net/npm/@bjorn3/browser_wasi_shim@0.2.17/+esm"
)
Insert cell
Insert cell
class XtermStdio extends wasiShim.Fd {
/*:: term: Terminal*/

constructor(term /*: Terminal*/) {
super();
this.term = term;
this.file_pos = 0;
}
fd_write(
view8 /*: Uint8Array*/,
iovs /*: [wasi.Iovec]*/
) /*: {ret: number, nwritten: number}*/ {
let nwritten = 0;
for (let iovec of iovs) {
console.log(
iovec.buf_len,
iovec.buf_len,
view8.slice(iovec.buf, iovec.buf + iovec.buf_len)
);
let buffer = view8.slice(iovec.buf, iovec.buf + iovec.buf_len);
this.term.writeln(buffer);
nwritten += iovec.buf_len;
}
return { ret: 0, nwritten };
}
/*
fd_read(
view8, // Uint8Array
iovs // Array<wasi.Iovec>
) {
debugger;
let nread = 0;
for (const iovec of iovs) {
if (this.file_pos < this.file.data.byteLength) {
const slice = this.file.data.slice(
Number(this.file_pos),
Number(this.file_pos + BigInt(iovec.buf_len))
);
view8.set(slice, iovec.buf);
this.file_pos += BigInt(slice.length);
nread += slice.length;
} else {
break;
}
}
return { ret: 0, nread };
}*/
}
Insert cell
Insert cell
{
let args = ["bin", "arg1", "arg2"];
let env = ["FOO=bar"];
let fds = [
new XtermStdio(term), // stdin
new XtermStdio(term), // stdout
new XtermStdio(term) // stderr
];
let wasi = new wasiShim.WASI(args, env, fds);
let wasm = await WebAssembly.compileStreaming(fetch(await simple_wasm.url()));
let inst = await WebAssembly.instantiate(wasm, {
wasi_snapshot_preview1: wasi.wasiImport
});
wasi.start(inst);
}
Insert cell

One platform to build and deploy the best data apps

Experiment and prototype by building visualizations in live JavaScript notebooks. Collaborate with your team and decide which concepts to build out.
Use Observable Framework to build data apps locally. Use data loaders to build in any language or library, including Python, SQL, and R.
Seamlessly deploy to Observable. Test before you ship, use automatic deploy-on-commit, and ensure your projects are always up-to-date.
Learn more