Skip to content

Commit 50fc71f

Browse files
author
Michael-F-Bryan
committed
Rewrote the wasmer.sh example to be simpler and use Vite
1 parent 95c45ea commit 50fc71f

File tree

6 files changed

+1029
-2739
lines changed

6 files changed

+1029
-2739
lines changed

examples/wasmer.sh/index.html

+11-9
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
<!doctype html>
22
<html lang="en">
3-
<head>
4-
<meta charset="UTF-8" />
5-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6-
<title>Wasmer Shell</title>
7-
</head>
83

9-
<body>
10-
<div id="terminal"></div>
11-
<script type="module" src="index.ts"></script>
12-
</body>
4+
<head>
5+
<meta charset="UTF-8">
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7+
<title>Wasmer Shell</title>
8+
<script type="module" defer src="index.ts"></script>
9+
</head>
10+
11+
<body>
12+
<div id="terminal"></div>
13+
</body>
14+
1315
</html>

examples/wasmer.sh/index.ts

+11-40
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,33 @@
11
import "xterm/css/xterm.css";
22

3-
import { Wasmer, init, initializeLogger } from "@wasmer/sdk";
4-
import { IDisposable, Terminal } from "xterm";
3+
import { Wasmer, init, initializeLogger, Instance } from "@wasmer/sdk";
4+
import { Terminal } from "xterm";
55
import { FitAddon } from "xterm-addon-fit";
66

77
const encoder = new TextEncoder();
8-
const logFilter = ["info"].join(",");
98

109
async function main() {
1110
await init();
12-
initializeLogger(logFilter);
11+
initializeLogger("debug");
1312

14-
// Create a terminal
1513
const term = new Terminal({ cursorBlink: true, convertEol: true });
1614
const fit = new FitAddon();
1715
term.loadAddon(fit);
1816
term.open(document.getElementById("terminal")!);
1917
fit.fit();
2018

2119
const pkg = await Wasmer.fromRegistry("sharrattj/bash");
22-
2320
term.writeln("Starting...");
2421

25-
while (true) {
26-
const subscriptions: IDisposable[] = [];
27-
28-
try {
29-
const instance = await pkg.entrypoint!.run();
30-
31-
// Connect stdin/stdout/stderr to the terminal
32-
const stdin: WritableStreamDefaultWriter<Uint8Array> =
33-
instance.stdin!.getWriter();
34-
subscriptions.push(
35-
term.onData(line => stdin.write(encoder.encode(line))),
36-
);
37-
copyStream(instance.stdout, term);
38-
copyStream(instance.stderr, term);
39-
40-
// Now, wait until bash exits
41-
const { code } = await instance.wait();
42-
43-
if (code != 0) {
44-
term.writeln(`\nExit code: ${code}`);
45-
term.writeln("Rebooting...");
46-
}
47-
} finally {
48-
subscriptions.forEach(d => d.dispose());
49-
}
50-
}
22+
const instance = await pkg.entrypoint!.run();
23+
connectStreams(instance, term);
5124
}
5225

53-
function copyStream(reader: ReadableStream<Uint8Array>, term: Terminal) {
54-
const writer = new WritableStream<Uint8Array>({
55-
write: chunk => {
56-
term.write(chunk);
57-
},
58-
});
59-
reader.pipeTo(writer);
26+
function connectStreams(instance: Instance, term: Terminal) {
27+
const stdin = instance.stdin?.getWriter();
28+
term.onData(data => stdin?.write(encoder.encode(data)));
29+
instance.stdout.pipeTo(new WritableStream({ write: chunk => term.write(chunk) }));
30+
instance.stderr.pipeTo(new WritableStream({ write: chunk => term.write(chunk) }));
6031
}
6132

62-
addEventListener("DOMContentLoaded", () => main());
33+
main();

0 commit comments

Comments
 (0)