92 lines
2.3 KiB
HTML
92 lines
2.3 KiB
HTML
|
<!DOCTYPE html>
|
||
|
<html>
|
||
|
|
||
|
<head>
|
||
|
<link rel="stylesheet" href="xterm.css" />
|
||
|
<script src="xterm.js"></script>
|
||
|
<script src="xterm-addon-fit.js"></script>
|
||
|
<script src="jquery.js"></script>
|
||
|
</head>
|
||
|
<style>
|
||
|
body {
|
||
|
font-family: sans;
|
||
|
}
|
||
|
</style>
|
||
|
|
||
|
<body>
|
||
|
<div id="terminal" style="height: 90vh"></div>
|
||
|
<div id="status">Connecting...</div>
|
||
|
<script>
|
||
|
var line_items = [];
|
||
|
var idx = -1;
|
||
|
|
||
|
var term = new Terminal({ cursorBlink: true, convertEol: true });
|
||
|
var fitAddon = new FitAddon.FitAddon();
|
||
|
term.loadAddon(fitAddon);
|
||
|
|
||
|
var socket;
|
||
|
var firstConnection = true;
|
||
|
|
||
|
function createSocket() {
|
||
|
if (socket && !socket.replacementCreated) {
|
||
|
socket.close();
|
||
|
}
|
||
|
socket = new WebSocket("ws://" + window.location.host + "/ws/debug");
|
||
|
socket.binaryType = 'arraybuffer';
|
||
|
socket.replacementCreated = false;
|
||
|
socket.ontimeout = function () {
|
||
|
if (socket.readyState == WebSocket.OPEN) {
|
||
|
socket.send('');
|
||
|
}
|
||
|
};
|
||
|
|
||
|
socket.onmessage = function (event) {
|
||
|
term.write(new Uint8Array(event.data));
|
||
|
};
|
||
|
|
||
|
socket.onerror = function (event) {
|
||
|
socket.close();
|
||
|
}
|
||
|
|
||
|
socket.onclose = function (event) {
|
||
|
socket.onerror = undefined;
|
||
|
socket.onclose = undefined;
|
||
|
if (event.wasClean) {
|
||
|
$("#status").text("Connection closed");
|
||
|
} else {
|
||
|
$("#status").text("Reconnecting...");
|
||
|
}
|
||
|
clearInterval(socket.intervalId);
|
||
|
if (!socket.replacementCreated) {
|
||
|
socket.replacementCreated = true;
|
||
|
createSocket();
|
||
|
} else {
|
||
|
console.log("a replacement socket was already being created -- skipping");
|
||
|
}
|
||
|
};
|
||
|
|
||
|
socket.onopen = function (event) {
|
||
|
$("#status").text("Connected");
|
||
|
if (firstConnection) {
|
||
|
term.write("\x1B[1;3;31m[Websocket] Connection established\x1B[0m\r\n");
|
||
|
} else {
|
||
|
term.write("[Websocket] Connection reestablished\n");
|
||
|
}
|
||
|
firstConnection = false;
|
||
|
};
|
||
|
socket.intervalId = setInterval(socket.ontimeout, 2000, socket);
|
||
|
}
|
||
|
createSocket();
|
||
|
|
||
|
term.open(document.getElementById('terminal'));
|
||
|
|
||
|
fitAddon.activate(term)
|
||
|
fitAddon.fit()
|
||
|
term.focus()
|
||
|
|
||
|
window.addEventListener('resize', () => { fitAddon.fit() });
|
||
|
|
||
|
</script>
|
||
|
</body>
|
||
|
|
||
|
</html>
|