fix: resolve IDB nil-on-channel and CLJS deref bugs

- idb/get-meta and idb/get-doc were calling (put! ch nil) when no
  result found, which is illegal in core.async. Now close the channel
  instead (reader gets nil from closed channel).
- todomvc.cljs used @(!todos) which calls the atom as a function.
  Fixed to @@!todos (deref atom → deref SyncedAtom).
This commit is contained in:
Florian Schroedl
2026-04-04 16:53:54 +02:00
parent d5a0082b67
commit 6f70fbfdbb
2 changed files with 14 additions and 11 deletions

View File

@@ -100,14 +100,15 @@
(set! (.-onsuccess req) (set! (.-onsuccess req)
(fn [e] (fn [e]
(let [result (.-result (.-target e))] (let [result (.-result (.-target e))]
(put! ch (when result (if result
{:id (.-id result) (do (put! ch {:id (.-id result)
:value (decode (.-value result)) :value (decode (.-value result))
:version (.-version result) :version (.-version result)
:updated (.-updated result) :updated (.-updated result)
:deleted (.-deleted result) :deleted (.-deleted result)
:synced (.-synced result)})) :synced (.-synced result)})
(async/close! ch)))) (async/close! ch))
(async/close! ch)))))
(set! (.-onerror req) (set! (.-onerror req)
(fn [e] (js/console.error "IDB get error:" e) (async/close! ch))) (fn [e] (js/console.error "IDB get error:" e) (async/close! ch)))
ch)) ch))
@@ -196,8 +197,10 @@
(set! (.-onsuccess req) (set! (.-onsuccess req)
(fn [e] (fn [e]
(let [result (.-result (.-target e))] (let [result (.-result (.-target e))]
(put! ch (when result (.-value result))) (if result
(async/close! ch)))) (do (put! ch (.-value result))
(async/close! ch))
(async/close! ch)))))
(set! (.-onerror req) (fn [_] (async/close! ch))) (set! (.-onerror req) (fn [_] (async/close! ch)))
ch)) ch))

View File

@@ -20,7 +20,7 @@
(defn- todos-list (defn- todos-list
"Return todos as sorted vec of [id doc] pairs." "Return todos as sorted vec of [id doc] pairs."
[] []
(->> @(!todos) (->> @@!todos
(sort-by (fn [[_ doc]] (:created doc))) (sort-by (fn [[_ doc]] (:created doc)))
vec)) vec))