webshell/index.html

95 lines
3.4 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>Web Terminal</title>
<link href="https://cdn.jsdelivr.net/npm/xterm/css/xterm.css" rel="stylesheet"/>
<script src="https://cdn.jsdelivr.net/npm/xterm/lib/xterm.js"></script>
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-attach/lib/xterm-addon-attach.js"></script>
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-fit/lib/xterm-addon-fit.js"></script>
<style>
#terminal-container {
width: 700px;
height: 500px;
padding: 10px;
background-color: black;
border: 2px solid #ccc;
font-size: 10px;
}
</style>
</head>
<body>
<div id="terminal-container"></div>
<script>
const terminal = new Terminal({
cursorBlink: true
});
const terminalContainer = document.getElementById('terminal-container');
terminal.open(terminalContainer);
const fitAddon = new FitAddon.FitAddon();
terminal.loadAddon(fitAddon);
terminal.options.fontSize = 12;
// Initialize WebSocket connection to the server
const ws = new WebSocket('ws://localhost:38000/ws');
ws.binaryType = 'arraybuffer'; // Set the binary type to ArrayBuffer for receiving binary messages
function sendResizeToServer() {
if (ws.readyState === WebSocket.OPEN) {
fitAddon.fit(); // Fit the terminal to the size of the container
let { cols, rows } = terminal;
ws.send(JSON.stringify({ action: "resize", cols: cols, rows: rows }));
}
}
// When the WebSocket connection is established
ws.addEventListener('open', () => {
terminal.write('Connected to server...\r\n');
sendResizeToServer(); // Send the size of the terminal to the server
});
// Handle incoming binary messages (terminal output) from the WebSocket
ws.addEventListener('message', (event) => {
if (typeof event.data === 'string') {
terminal.write(event.data);
} else {
// We have received an ArrayBuffer
// Convert the ArrayBuffer to string
const decoder = new TextDecoder("utf-8");
const text = decoder.decode(new Uint8Array(event.data));
terminal.write(text);
}
});
ws.addEventListener('close', () => {
terminal.write('\r\nDisconnected from server...');
});
ws.addEventListener('error', (error) => {
terminal.write('\r\nWebSocket error: ' + error.message);
});
// Send data to the WebSocket when data is input into the terminal
terminal.onData(data => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(data);
}
});
// Handle terminal resize
terminal.onResize(({cols, rows}) => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({action: "resize", cols: cols, rows: rows}));
}
});
// Focus the terminal on load
window.addEventListener('load', () => {
sendResizeToServer(); // Send initial size when the page loads
terminal.focus();
});
window.addEventListener('resize', () => {
sendResizeToServer(); // Send updated size when the window is resized
});
</script>
</body>
</html>