From 6a8fefdfd80eea55ad12ed1cf43f517cbe801b55 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Tue, 10 Jan 2023 14:41:26 -0600 Subject: [PATCH] keep liveview websocket alive --- packages/liveview/src/main.js | 16 ++++++++++++++-- packages/liveview/src/pool.rs | 8 ++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/liveview/src/main.js b/packages/liveview/src/main.js index bdf656b50..3d1cc4355 100644 --- a/packages/liveview/src/main.js +++ b/packages/liveview/src/main.js @@ -12,7 +12,13 @@ class IPC { let ws = new WebSocket(WS_ADDR); + function ping() { + ws.send("__ping__"); + } + ws.onopen = () => { + // we ping every 30 seconds to keep the websocket alive + setInterval(ping, 30000); ws.send(serializeIpcMessage("initialize")); }; @@ -21,8 +27,14 @@ class IPC { }; ws.onmessage = (event) => { - let edits = JSON.parse(event.data); - window.interpreter.handleEdits(edits); + // Ignore pongs + if (event.data != "__pong__") { + let edits = JSON.parse(event.data); + window.interpreter.handleEdits(edits); + } + else { + console.log("ponged"); + } }; this.ws = ws; diff --git a/packages/liveview/src/pool.rs b/packages/liveview/src/pool.rs index a25673d84..a20ad029e 100644 --- a/packages/liveview/src/pool.rs +++ b/packages/liveview/src/pool.rs @@ -127,9 +127,13 @@ where _ = vdom.wait_for_work() => {} evt = ws.next() => { - match evt { + match evt.as_ref().map(|o| o.as_deref()) { + // respond with a pong every ping to keep the websocket alive + Some(Ok("__ping__")) => { + ws.send("__pong__".to_string()).await?; + } Some(Ok(evt)) => { - if let Ok(IpcMessage { params }) = serde_json::from_str::(&evt) { + if let Ok(IpcMessage { params }) = serde_json::from_str::(evt) { vdom.handle_event(¶ms.name, params.data.into_any(), params.element, params.bubbles); } }