|
1 | 1 | import "xterm/css/xterm.css";
|
2 | 2 |
|
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"; |
5 | 5 | import { FitAddon } from "xterm-addon-fit";
|
6 | 6 |
|
7 | 7 | const encoder = new TextEncoder();
|
8 |
| -const logFilter = ["info"].join(","); |
9 | 8 |
|
10 | 9 | async function main() {
|
11 | 10 | await init();
|
12 |
| - initializeLogger(logFilter); |
| 11 | + initializeLogger("debug"); |
13 | 12 |
|
14 |
| - // Create a terminal |
15 | 13 | const term = new Terminal({ cursorBlink: true, convertEol: true });
|
16 | 14 | const fit = new FitAddon();
|
17 | 15 | term.loadAddon(fit);
|
18 | 16 | term.open(document.getElementById("terminal")!);
|
19 | 17 | fit.fit();
|
20 | 18 |
|
21 | 19 | const pkg = await Wasmer.fromRegistry("sharrattj/bash");
|
22 |
| - |
23 | 20 | term.writeln("Starting...");
|
24 | 21 |
|
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); |
51 | 24 | }
|
52 | 25 |
|
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) })); |
60 | 31 | }
|
61 | 32 |
|
62 |
| -addEventListener("DOMContentLoaded", () => main()); |
| 33 | +main(); |
0 commit comments