diff web/websocket.js @ 2376:4556eebe5d73

topdir reorgs; let pdm have its src/ dir; separate vite area from light9/
author drewp@bigasterisk.com
date Sun, 12 May 2024 19:02:10 -0700
parents light9/web/websocket.js@19c2e6216cf8
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/websocket.js	Sun May 12 19:02:10 2024 -0700
@@ -0,0 +1,62 @@
+/*
+  url is now relative to the window location. Note that nginx may drop
+  the connection after 60sec of inactivity.
+*/
+
+class ReconnectingWebsocket {
+    
+    constructor(url, onMessage) {
+        this.onMessage = onMessage;
+        this.ws = null;
+        this.connectTimer = null
+        this.pong = 0;
+        
+        this.fullUrl = (
+            "ws://"
+                + window.location.host
+                + window.location.pathname
+                + (window.location.pathname.match(/\/$/) ? "" : "/")
+                + url);
+        this.connect();
+    }
+    setStatus(txt) {
+        const docStatus = document.querySelector('#status')
+        if (docStatus) {
+            docStatus.innerText = txt;
+        }
+    }
+    connect() {
+        this.reconnect = true;
+        this.ws = new WebSocket(this.fullUrl);
+        
+        this.ws.onopen = () => { this.setStatus("connected"); };
+        this.ws.onerror = (e) => { this.setStatus("error: "+e); };
+        this.ws.onclose = () => {
+            this.pong = 1 - this.pong;
+            this.setStatus("disconnected (retrying "+(this.pong ? "😼":"😺")+")");
+            this.ws = null;
+
+            this.connectTimer = setTimeout(() => {
+                this.connectTimer = null;
+                requestAnimationFrame(() => {
+                    if (this.reconnect) {
+                        this.connect();
+                    }
+                });
+            }, 2000);
+        };
+        this.ws.onmessage = (evt) => {
+            this.onMessage(JSON.parse(evt.data));
+        };
+    }
+    disconnect() {
+        this.reconnect = false;
+        this.ws.close();
+    }
+}
+
+
+
+function reconnectingWebSocket(url, onMessage) {
+    return new ReconnectingWebsocket(url, onMessage);
+}