fix: deduplicate SSE events and debounce client reload
Build and Deploy / build-and-deploy (push) Successful in 1m39s

This commit is contained in:
2026-05-20 11:54:06 -04:00
parent 71cef21daf
commit 795a99ae2b
2 changed files with 25 additions and 3 deletions
+13 -2
View File
@@ -344,8 +344,13 @@ sseRecipeJs =
, "if (!el) return;"
, "var currentRecipe = el.textContent;"
, "var es = new EventSource('/events');"
, "var lastReload = 0;"
, "es.addEventListener('recipe-changed', function(e) {"
, " if (e.data === currentRecipe) location.reload();"
, " if (e.data !== currentRecipe) return;"
, " var now = Date.now();"
, " if (now - lastReload < 2000) return;"
, " lastReload = now;"
, " location.reload();"
, "});"
, "})();"
]
@@ -358,7 +363,13 @@ sseIndexJs =
, "'use strict';"
, "if (!window.EventSource) return;"
, "var es = new EventSource('/events');"
, "es.addEventListener('recipe-changed', function() { location.reload(); });"
, "var lastReload = 0;"
, "es.addEventListener('recipe-changed', function() {"
, " var now = Date.now();"
, " if (now - lastReload < 2000) return;"
, " lastReload = now;"
, " location.reload();"
, "});"
, "})();"
]
+12 -1
View File
@@ -115,7 +115,18 @@ sseHandler changeLog _request respond = do
sent <- readIORef lastSent
when (version > sent) $ do
let newEntries = takeWhile (\(v, _) -> v > sent) entries
forM_ newEntries $ \(_v, path) -> do
-- Entries are newest-first. Deduplicate by filename,
-- keeping the newest (first encountered) entry per file.
let deduped =
foldl'
( \acc e@(_, p) ->
if any ((== p) . snd) acc
then acc
else e : acc
)
[]
newEntries
forM_ deduped $ \(_v, path) -> do
write
( lazyByteString $
LB.fromStrict $