commit 6ecfc60ceec1dd4f45e6a52e5d4160968e16ac7f parent 1eb1450686030116ffa5c9ff107e2cb52acd2551 Author: Daniel Barlow <dan@telent.net> Date: Tue, 10 Mar 2026 12:10:50 +0000 handle errorful tile fetches if the tile data is not parseable as json, we re-fetch Diffstat:
| M | pkgs/maps/tiles.fnl | | | 66 | ++++++++++++++++++++++++++++++++++++++---------------------------- |
1 file changed, 38 insertions(+), 28 deletions(-)
diff --git a/pkgs/maps/tiles.fnl b/pkgs/maps/tiles.fnl @@ -135,35 +135,45 @@ (fn tile-name [x y zoom] (.. x "_" y "_" zoom)) -(fn jsond [s] - (case (pcall json.decode s) - (true val) val - (false err) (values nil err))) -(fn fetch [cq x y zoom cb] +(fn tile-status- [x y zoom] (let [k (tile-name x y zoom) - pathname (.. "/tmp/tiles/" k ".json")] - (if (file-exists? pathname) - (let [payload (with-open [i (io.open pathname :r)] (i:read "*a"))] - (when (not (= payload "")) - (case (jsond payload) - val (cb (canvas (. val :elements) zoom)) - (nil err) (print "json decode error" pathname)))) - (let [out (io.open pathname :w)] - (cq:wrap (fn [] - (print "getting " k) - (var payload nil) - (with-open [f out] - (while (not payload) - (set payload (unparsed-for-xyz x y zoom)) - (when (not payload) - (print "sleeping " k) - (cqueues.sleep (math.random 2 6)))) - (print "got " k) - (f:write payload) - (case (jsond payload) - val (cb (canvas (. val :elements) zoom)) - (nil err) (print "json decode error" pathname)) - true))))))) + pathname (.. "/tmp/tiles/" k ".json") + payload (match (io.open pathname :r) + f (with-open [i f] (i:read "*a")) + _ nil) + (valid val) (if payload (pcall json.decode payload))] + (if (or (= payload nil) (not valid)) + (values :missing pathname) + (= payload "") + (values :pending) + valid + (values :json val) + true + (values :unknown)))) + +(fn tile-status [x y zoom] + (let [(s v) (tile-status- x y zoom)] + (values s v))) + +(fn fetch [cq x y zoom cb] + (print "fetch" x y zoom) + (case (tile-status x y zoom) + (:pending) nil + (:json val) (cb (canvas (. val :elements) zoom)) + (:missing pathname) + (cq:wrap + (fn [] + (print "getting " pathname) + (var payload nil) + (with-open [f (io.open pathname :w)] + (while (not payload) + (set payload (unparsed-for-xyz x y zoom)) + (when (not payload) + (print "sleeping " pathname) + (cqueues.sleep (math.random 2 6)))) + (print "got " pathname) + (f:write payload)) + (fetch cq x y zoom cb))))) { : fetch : latlon->tile :name tile-name }