diff --git a/extensions/remote-control/html.ts b/extensions/remote-control/html.ts index 7c77d09..5f0987b 100644 --- a/extensions/remote-control/html.ts +++ b/extensions/remote-control/html.ts @@ -607,17 +607,26 @@ export function buildHTML(nonce: string): string { } } - var ws, timer; + var ws, timer, connectTimer; function connect() { + if (ws && (ws.readyState === 0 || ws.readyState === 1)) return; + clearTimeout(connectTimer); var wsProtocol = location.protocol === "https:" ? "wss:" : "ws:"; ws = new WebSocket(wsProtocol + "//" + location.host + "/ws"); + // If not connected within 4s, close and retry immediately + connectTimer = setTimeout(function () { + if (ws && ws.readyState !== 1) { ws.close(); } + }, 4000); + ws.onopen = function () { clearTimeout(timer); + clearTimeout(connectTimer); updateStatus(true); }; ws.onclose = function () { + clearTimeout(connectTimer); updateStatus(false); clearTimeout(timer); timer = setTimeout(connect, 2000); @@ -717,6 +726,14 @@ export function buildHTML(nonce: string): string { }); connect(); + + // Reconnect immediately when app comes back to foreground (e.g. iOS PWA resume) + document.addEventListener("visibilitychange", function () { + if (document.visibilityState === "visible") { + clearTimeout(timer); + if (!ws || ws.readyState === 2 || ws.readyState === 3) connect(); + } + }); })();