Skip to content

Commit e91bd78

Browse files
committed
web
1 parent 529f34f commit e91bd78

7 files changed

Lines changed: 69 additions & 37 deletions

File tree

website/components/term/index.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { useRef, useEffect, useState } from "react";
2-
import { TerminalEmulator as TerminalEmulatorInterface } from "../../services/wasm/tunshell_client";
2+
import type { TerminalEmulator as TerminalEmulatorInterface } from "../../services/wasm-client";
33
import * as Styled from "./styled";
44

55
export interface TerminalEmulatorProps {
@@ -58,7 +58,9 @@ export const TerminalEmulator = ({
5858
initialisedTerm.loadAddon(fitAddon);
5959
initialisedTerm.open(viewportRef.current);
6060

61-
await new Promise((r) => initialisedTerm.writeln("Welcome to the tunshell web terminal\r\n", r));
61+
await new Promise<void>((resolve) =>
62+
initialisedTerm.writeln("Welcome to the tunshell web terminal\r\n", () => resolve()),
63+
);
6264

6365
setTerm(initialisedTerm);
6466
setFitAddon(fitAddon);
@@ -82,7 +84,7 @@ export const TerminalEmulator = ({
8284
stop.dispose();
8385
});
8486
}),
85-
write: (data) => new Promise<void>((r) => term.write(data, r)),
87+
write: (data) => new Promise<void>((resolve) => term.write(data, () => resolve())),
8688
size: () => new Uint16Array([term.cols, term.rows]),
8789
clone: () => ({ ...emulator }),
8890
};

website/components/tunshell-client/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import dynamic from "next/dynamic";
22
import { TunshellWasm } from "../../services/tunshell-wasm";
33
import { useEffect, useState } from "react";
4-
import { TerminalEmulator as TerminalEmulatorInterface } from "../../services/wasm/tunshell_client";
4+
import type { TerminalEmulator as TerminalEmulatorInterface } from "../../services/wasm-client";
55
import { TerminalEmulator } from "../term";
66
import { SessionKeys } from "../../services/session";
77

@@ -46,4 +46,5 @@ export const TunshellClient = dynamic<TunshellClientProps>({
4646
);
4747
};
4848
},
49+
ssr: false,
4950
});

website/package-lock.json

Lines changed: 5 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

website/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@
2222
"@types/react": "^18.2.55",
2323
"@types/styled-components": "^5.1.2",
2424
"babel-plugin-styled-components": "^1.11.1",
25-
"typescript": "^3.8.3"
25+
"typescript": "^4.9.5"
2626
}
2727
}

website/services/tunshell-wasm.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
import { TerminalEmulator } from "./wasm/tunshell_client";
1+
import { loadTunshellClientModule, TerminalEmulator, TunshellClientModule } from "./wasm-client";
22
import { SessionKeys } from "./session";
33

4-
type ClientModule = typeof import("./wasm/tunshell_client");
5-
64
export class TunshellWasm {
7-
private module: ClientModule;
8-
private terminateCallback: () => void | undefined;
5+
private module: TunshellClientModule;
6+
private terminateCallback?: () => void;
97

108
constructor() {}
119

1210
init = async () => {
13-
let module = await import("./wasm/tunshell_client").catch((e) => {
11+
let module = await loadTunshellClientModule().catch((e) => {
1412
console.error(e);
1513
throw e;
1614
});
@@ -19,8 +17,8 @@ export class TunshellWasm {
1917
};
2018

2119
connect = async (session: SessionKeys, emulator: TerminalEmulator) => {
22-
let terminatePromise = new Promise((resolve) => {
23-
this.terminateCallback = resolve;
20+
let terminatePromise = new Promise<void>((resolve) => {
21+
this.terminateCallback = () => resolve();
2422
});
2523

2624
const config = new this.module.BrowserConfig(

website/services/wasm-client.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import * as wasmBindings from "./wasm/tunshell_client_bg.js";
2+
3+
export interface TerminalEmulator {
4+
data: () => Promise<string>;
5+
resize: () => Promise<Uint16Array>;
6+
write: (data: string | Uint8Array) => Promise<void>;
7+
size: () => Uint16Array;
8+
clone: () => TerminalEmulator;
9+
}
10+
11+
type WasmBindingModule = typeof import("./wasm/tunshell_client_bg.js");
12+
type WasmExports = WebAssembly.Exports & {
13+
__wbindgen_start: () => void;
14+
};
15+
16+
export interface TunshellClientModule {
17+
BrowserConfig: WasmBindingModule["BrowserConfig"];
18+
tunshell_init_client: WasmBindingModule["tunshell_init_client"];
19+
}
20+
21+
let modulePromise: Promise<TunshellClientModule> | undefined;
22+
23+
export const loadTunshellClientModule = async (): Promise<TunshellClientModule> => {
24+
if (!modulePromise) {
25+
modulePromise = (async () => {
26+
const response = await fetch("/wasm/tunshell_client_bg.wasm");
27+
if (!response.ok) {
28+
throw new Error(`Failed to load the tunshell wasm module: ${response.status}`);
29+
}
30+
31+
const source = await response.arrayBuffer();
32+
const { instance } = await WebAssembly.instantiate(source, {
33+
"./tunshell_client_bg.js": wasmBindings,
34+
});
35+
36+
const wasm = instance.exports as WasmExports;
37+
wasmBindings.__wbg_set_wasm(wasm);
38+
wasm.__wbindgen_start();
39+
40+
return {
41+
BrowserConfig: wasmBindings.BrowserConfig,
42+
tunshell_init_client: wasmBindings.tunshell_init_client,
43+
};
44+
})();
45+
}
46+
47+
return modulePromise;
48+
};

website/tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"moduleResolution": "node",
1717
"resolveJsonModule": true,
1818
"isolatedModules": true,
19-
"jsx": "preserve"
19+
"jsx": "preserve",
20+
"incremental": true
2021
},
2122
"exclude": [
2223
"node_modules"

0 commit comments

Comments
 (0)