From 085bc4bc79c8346b5f2c70685b294c89e829f038 Mon Sep 17 00:00:00 2001
From: TomatoCake <60300461+DEVTomatoCake@users.noreply.github.com>
Date: Mon, 1 Jul 2024 20:14:40 +0200
Subject: [PATCH] add proper WS connection retrying
---
webpage/index.html | 8 ++++++-
webpage/localuser.ts | 51 ++++++++++++++++++++++++++++++--------------
2 files changed, 42 insertions(+), 17 deletions(-)
diff --git a/webpage/index.html b/webpage/index.html
index 4ea6348..67b3d56 100644
--- a/webpage/index.html
+++ b/webpage/index.html
@@ -12,7 +12,13 @@
-
diff --git a/webpage/localuser.ts b/webpage/localuser.ts
index 31e5b27..170ded3 100644
--- a/webpage/localuser.ts
+++ b/webpage/localuser.ts
@@ -7,6 +7,9 @@ import {Member} from "./member.js";
import {markdown} from "./markdown.js";
import {Fullscreen} from "./fullscreen.js";
import {setTheme, Specialuser} from "./login.js";
+
+const wsCodesRetry=new Set([4000,4003,4005,4007,4008,4009]);
+
class Localuser{
packets:number;
token:string;
@@ -27,6 +30,8 @@ class Localuser{
ws:WebSocket;
typing:[string,number][];
wsinterval:NodeJS.Timeout;
+ connectionSucceed=0;
+ errorBackoff=0;
constructor(userinfo:Specialuser){
this.packets=1;
this.token=userinfo.token;
@@ -215,6 +220,8 @@ class Localuser{
}else if(temp.op===10){
console.log("heartbeat down")
this.wsinterval=setInterval(_=>{
+ if (this.connectionSucceed===0) this.connectionSucceed=Date.now()
+
this.ws.send(JSON.stringify({op:1,d:this.packets}))
},temp.d.heartbeat_interval)
this.packets=1;
@@ -227,23 +234,35 @@ class Localuser{
});
- this.ws.addEventListener('close', (event) => {
- clearInterval(this.wsinterval);
- console.log('WebSocket closed');
- console.warn(event);
- if(event.code!==4000){
- this.unload();
- document.getElementById("loading").classList.remove("doneloading");
- document.getElementById("loading").classList.add("loading");
- this.initwebsocket().then(_=>{
- this.loaduser();
- this.init();
- document.getElementById("loading").classList.add("doneloading");
- document.getElementById("loading").classList.remove("loading");
- console.log("done loading")
- });
- }
+ this.ws.addEventListener("close", event => {
+ console.log("WebSocket closed with code " + event.code);
+ if (this.wsinterval) clearInterval(this.wsinterval);
+
+ this.unload();
+ document.getElementById("loading").classList.remove("doneloading");
+ document.getElementById("loading").classList.add("loading");
+
+ if (((event.code>1000 && event.code<1016) || wsCodesRetry.has(event.code))) {
+ if (this.connectionSucceed!==0 && Date.now()>this.connectionSucceed+20000) this.errorBackoff=0;
+ else this.errorBackoff++;
+ this.connectionSucceed=0;
+
+ document.getElementById("load-desc").innerHTML="Unable to connect to the Spacebar server, retrying in
" + Math.round(0.2 + (this.errorBackoff*2.8)) + " seconds...";
+
+ setTimeout(() => {
+ document.getElementById("load-desc").textContent="Retrying...";
+
+ this.initwebsocket().then(() => {
+ this.loaduser();
+ this.init();
+ document.getElementById("loading").classList.add("doneloading");
+ document.getElementById("loading").classList.remove("loading");
+ console.log("done loading");
+ });
+ }, 200 + (this.errorBackoff*2800));
+ } else document.getElementById("load-desc").textContent="Unable to connect to the Spacebar server. Please try logging out and back in.";
});
+
await promise;
return;
}