Automatic reconnect to server with exp backoff

This commit is contained in:
Radon Rosborough 2020-06-07 16:24:45 -06:00
parent b31e49d40d
commit 76a1c8fa1d
1 changed files with 63 additions and 46 deletions

View File

@ -14,16 +14,21 @@ term.open(document.getElementById("terminal"));
fitAddon.fit(); fitAddon.fit();
window.addEventListener("resize", () => fitAddon.fit()); window.addEventListener("resize", () => fitAddon.fit());
const socket = new WebSocket( const initialRetryDelayMs = 200;
let retryDelayMs = initialRetryDelayMs;
function tryConnect() {
console.log("Connecting to server...");
socket = new WebSocket(
(document.location.protocol === "http:" ? "ws://" : "wss://") + (document.location.protocol === "http:" ? "ws://" : "wss://") +
document.location.host + document.location.host +
`/api/v1/ws?lang=${lang}` `/api/v1/ws?lang=${lang}`
); );
socket.addEventListener("open", () => {
socket.addEventListener("open", () => retryDelayMs = initialRetryDelayMs;
console.log("Successfully connected to server") console.log("Successfully connected to server");
); });
socket.addEventListener("message", (event) => { socket.addEventListener("message", (event: MessageEvent) => {
let message: any; let message: any;
try { try {
message = JSON.parse(event.data); message = JSON.parse(event.data);
@ -47,23 +52,35 @@ socket.addEventListener("message", (event) => {
console.error("Unexpected message from server:", message); console.error("Unexpected message from server:", message);
return; return;
} }
monaco.editor.setModelLanguage(editor.getModel(), message.monacoLanguage); monaco.editor.setModelLanguage(
editor.getModel(),
message.monacoLanguage
);
return; return;
default: default:
console.error("Unexpected message from server:", message); console.error("Unexpected message from server:", message);
return; return;
} }
}); });
socket.addEventListener("close", (event) => { socket.addEventListener("close", (event: CloseEvent) => {
if (event.wasClean) { if (event.wasClean) {
console.log("Connection closed cleanly"); console.log("Connection closed cleanly");
} else { } else {
console.error("Connection died"); console.error("Connection died");
} }
scheduleConnect();
}); });
socket.addEventListener("onerror", (event) => }
console.error("Connection error:", event)
); function scheduleConnect() {
const delay = retryDelayMs * Math.random();
console.log(`Trying to reconnect in ${Math.floor(delay)}ms`);
setTimeout(tryConnect, delay);
retryDelayMs *= 2;
}
let socket = null;
tryConnect();
term.onData((data) => term.onData((data) =>
socket.send(JSON.stringify({ event: "terminalInput", input: data })) socket.send(JSON.stringify({ event: "terminalInput", input: data }))