Automatic reconnect to server with exp backoff
This commit is contained in:
		
							parent
							
								
									b31e49d40d
								
							
						
					
					
						commit
						76a1c8fa1d
					
				| 
						 | 
					@ -14,56 +14,73 @@ 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;
 | 
				
			||||||
  (document.location.protocol === "http:" ? "ws://" : "wss://") +
 | 
					let retryDelayMs = initialRetryDelayMs;
 | 
				
			||||||
    document.location.host +
 | 
					 | 
				
			||||||
    `/api/v1/ws?lang=${lang}`
 | 
					 | 
				
			||||||
);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
socket.addEventListener("open", () =>
 | 
					function tryConnect() {
 | 
				
			||||||
  console.log("Successfully connected to server")
 | 
					  console.log("Connecting to server...");
 | 
				
			||||||
);
 | 
					  socket = new WebSocket(
 | 
				
			||||||
socket.addEventListener("message", (event) => {
 | 
					    (document.location.protocol === "http:" ? "ws://" : "wss://") +
 | 
				
			||||||
  let message: any;
 | 
					      document.location.host +
 | 
				
			||||||
  try {
 | 
					      `/api/v1/ws?lang=${lang}`
 | 
				
			||||||
    message = JSON.parse(event.data);
 | 
					  );
 | 
				
			||||||
  } catch (err) {
 | 
					  socket.addEventListener("open", () => {
 | 
				
			||||||
    console.error("Malformed message from server:", event.data);
 | 
					    retryDelayMs = initialRetryDelayMs;
 | 
				
			||||||
    return;
 | 
					    console.log("Successfully connected to server");
 | 
				
			||||||
  }
 | 
					  });
 | 
				
			||||||
  switch (message?.event) {
 | 
					  socket.addEventListener("message", (event: MessageEvent) => {
 | 
				
			||||||
    case "terminalClear":
 | 
					    let message: any;
 | 
				
			||||||
      term.reset();
 | 
					    try {
 | 
				
			||||||
 | 
					      message = JSON.parse(event.data);
 | 
				
			||||||
 | 
					    } catch (err) {
 | 
				
			||||||
 | 
					      console.error("Malformed message from server:", event.data);
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    case "terminalOutput":
 | 
					    }
 | 
				
			||||||
      if (typeof message.output !== "string") {
 | 
					    switch (message?.event) {
 | 
				
			||||||
 | 
					      case "terminalClear":
 | 
				
			||||||
 | 
					        term.reset();
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      case "terminalOutput":
 | 
				
			||||||
 | 
					        if (typeof message.output !== "string") {
 | 
				
			||||||
 | 
					          console.error("Unexpected message from server:", message);
 | 
				
			||||||
 | 
					          return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        term.write(message.output);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      case "setMonacoLanguage":
 | 
				
			||||||
 | 
					        if (typeof message.monacoLanguage !== "string") {
 | 
				
			||||||
 | 
					          console.error("Unexpected message from server:", message);
 | 
				
			||||||
 | 
					          return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        monaco.editor.setModelLanguage(
 | 
				
			||||||
 | 
					          editor.getModel(),
 | 
				
			||||||
 | 
					          message.monacoLanguage
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
        console.error("Unexpected message from server:", message);
 | 
					        console.error("Unexpected message from server:", message);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
      }
 | 
					    }
 | 
				
			||||||
      term.write(message.output);
 | 
					  });
 | 
				
			||||||
      return;
 | 
					  socket.addEventListener("close", (event: CloseEvent) => {
 | 
				
			||||||
    case "setMonacoLanguage":
 | 
					    if (event.wasClean) {
 | 
				
			||||||
      if (typeof message.monacoLanguage !== "string") {
 | 
					      console.log("Connection closed cleanly");
 | 
				
			||||||
        console.error("Unexpected message from server:", message);
 | 
					    } else {
 | 
				
			||||||
        return;
 | 
					      console.error("Connection died");
 | 
				
			||||||
      }
 | 
					    }
 | 
				
			||||||
      monaco.editor.setModelLanguage(editor.getModel(), message.monacoLanguage);
 | 
					    scheduleConnect();
 | 
				
			||||||
      return;
 | 
					  });
 | 
				
			||||||
    default:
 | 
					}
 | 
				
			||||||
      console.error("Unexpected message from server:", message);
 | 
					
 | 
				
			||||||
      return;
 | 
					function scheduleConnect() {
 | 
				
			||||||
  }
 | 
					  const delay = retryDelayMs * Math.random();
 | 
				
			||||||
});
 | 
					  console.log(`Trying to reconnect in ${Math.floor(delay)}ms`);
 | 
				
			||||||
socket.addEventListener("close", (event) => {
 | 
					  setTimeout(tryConnect, delay);
 | 
				
			||||||
  if (event.wasClean) {
 | 
					  retryDelayMs *= 2;
 | 
				
			||||||
    console.log("Connection closed cleanly");
 | 
					}
 | 
				
			||||||
  } else {
 | 
					
 | 
				
			||||||
    console.error("Connection died");
 | 
					let socket = null;
 | 
				
			||||||
  }
 | 
					tryConnect();
 | 
				
			||||||
});
 | 
					 | 
				
			||||||
socket.addEventListener("onerror", (event) =>
 | 
					 | 
				
			||||||
  console.error("Connection error:", event)
 | 
					 | 
				
			||||||
);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
term.onData((data) =>
 | 
					term.onData((data) =>
 | 
				
			||||||
  socket.send(JSON.stringify({ event: "terminalInput", input: data }))
 | 
					  socket.send(JSON.stringify({ event: "terminalInput", input: data }))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue