Automatic reconnect to server with exp backoff
This commit is contained in:
		
							parent
							
								
									b31e49d40d
								
							
						
					
					
						commit
						76a1c8fa1d
					
				| 
						 | 
				
			
			@ -14,16 +14,21 @@ term.open(document.getElementById("terminal"));
 | 
			
		|||
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.host +
 | 
			
		||||
      `/api/v1/ws?lang=${lang}`
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
socket.addEventListener("open", () =>
 | 
			
		||||
  console.log("Successfully connected to server")
 | 
			
		||||
);
 | 
			
		||||
socket.addEventListener("message", (event) => {
 | 
			
		||||
  );
 | 
			
		||||
  socket.addEventListener("open", () => {
 | 
			
		||||
    retryDelayMs = initialRetryDelayMs;
 | 
			
		||||
    console.log("Successfully connected to server");
 | 
			
		||||
  });
 | 
			
		||||
  socket.addEventListener("message", (event: MessageEvent) => {
 | 
			
		||||
    let message: any;
 | 
			
		||||
    try {
 | 
			
		||||
      message = JSON.parse(event.data);
 | 
			
		||||
| 
						 | 
				
			
			@ -47,23 +52,35 @@ socket.addEventListener("message", (event) => {
 | 
			
		|||
          console.error("Unexpected message from server:", message);
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
      monaco.editor.setModelLanguage(editor.getModel(), message.monacoLanguage);
 | 
			
		||||
        monaco.editor.setModelLanguage(
 | 
			
		||||
          editor.getModel(),
 | 
			
		||||
          message.monacoLanguage
 | 
			
		||||
        );
 | 
			
		||||
        return;
 | 
			
		||||
      default:
 | 
			
		||||
        console.error("Unexpected message from server:", message);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
socket.addEventListener("close", (event) => {
 | 
			
		||||
  });
 | 
			
		||||
  socket.addEventListener("close", (event: CloseEvent) => {
 | 
			
		||||
    if (event.wasClean) {
 | 
			
		||||
      console.log("Connection closed cleanly");
 | 
			
		||||
    } else {
 | 
			
		||||
      console.error("Connection died");
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
socket.addEventListener("onerror", (event) =>
 | 
			
		||||
  console.error("Connection error:", event)
 | 
			
		||||
);
 | 
			
		||||
    scheduleConnect();
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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) =>
 | 
			
		||||
  socket.send(JSON.stringify({ event: "terminalInput", input: data }))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue