This repository has no description
1import { FitAddon } from "@xterm/addon-fit";
2import { WebglAddon } from "@xterm/addon-webgl";
3import { Terminal } from "@xterm/xterm";
4import "@xterm/xterm/css/xterm.css";
5import {
6 BlockDevice,
7 ConsoleDevice,
8 EntropyDevice,
9 Machine,
10} from "./build/linux";
11import "./style.css";
12
13const terminal = new Terminal({
14 convertEol: true,
15 fontFamily: "monospace",
16});
17
18{
19 const terminal_fit = new FitAddon();
20 terminal.loadAddon(terminal_fit);
21 terminal.open(document.body);
22 terminal_fit.fit();
23 window.onresize = () => terminal_fit.fit();
24}
25
26try {
27 terminal.loadAddon(new WebglAddon());
28} catch (err) {
29 console.warn(err);
30}
31
32if (!window.crossOriginIsolated) {
33 terminal.write("Error: not cross origin isolated\n");
34}
35
36const {
37 cmdline = "",
38 memory = navigator.hardwareConcurrency > 16 ? 256 : 128,
39 initcpio: initcpio_path = new URL("./build/initcpio", import.meta.url).href,
40} = Object.fromEntries(new URLSearchParams(location.search));
41
42(document.querySelector("input[name=cmdline]") as HTMLInputElement).value =
43 cmdline;
44(document.querySelector("input[name=memory]") as HTMLInputElement).value =
45 String(memory);
46(document.querySelector("input[name=initcpio]") as HTMLInputElement).value =
47 initcpio_path;
48
49const initcpio = await fetch(initcpio_path).then((res) =>
50 res.ok ? res.arrayBuffer() : null,
51);
52if (!initcpio) {
53 terminal.write(`Failed to fetch initramfs.\n`);
54}
55
56const stdin = new ReadableStream<string>({
57 start(controller) {
58 terminal.onData((data) => {
59 controller.enqueue(data);
60 });
61 },
62}).pipeThrough(new TextEncoderStream());
63
64const stdout = new WritableStream<Uint8Array>({
65 write(chunk) {
66 terminal.write(chunk);
67 },
68});
69const stdout2 = new WritableStream<Uint8Array>({
70 write(chunk) {
71 terminal.write(chunk);
72 },
73});
74
75const machine = new Machine({
76 cmdline: cmdline.replace(/\+/g, " "),
77 memoryMib: Number(memory),
78 devices: [
79 new ConsoleDevice(stdin, stdout),
80 new EntropyDevice(),
81 new BlockDevice(new Uint8Array(8 * 1024 * 1024)),
82 ],
83 initcpio: initcpio ? new Uint8Array(initcpio) : undefined,
84});
85
86// machine.bootConsole.pipeTo(stdout2);
87
88machine.on("halt", () => {
89 terminal.write("halting...");
90});
91
92machine.on("restart", () => {
93 location.reload();
94});
95
96machine.on("error", ({ error, threadName }) => {
97 terminal.write(`${error.name} in ${threadName}: ${error.message}\n`);
98});
99
100machine.boot();