From 6f70fbfdbb54935eb5bfa02188aca9412fa50478 Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Sat, 4 Apr 2026 16:53:54 +0200 Subject: [PATCH] fix: resolve IDB nil-on-channel and CLJS deref bugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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). --- src/pocketbook/idb.cljs | 23 +++++++++++++---------- src/pocketbook/todomvc.cljs | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/pocketbook/idb.cljs b/src/pocketbook/idb.cljs index 52fa6ff..80eacb8 100644 --- a/src/pocketbook/idb.cljs +++ b/src/pocketbook/idb.cljs @@ -100,14 +100,15 @@ (set! (.-onsuccess req) (fn [e] (let [result (.-result (.-target e))] - (put! ch (when result - {:id (.-id result) - :value (decode (.-value result)) - :version (.-version result) - :updated (.-updated result) - :deleted (.-deleted result) - :synced (.-synced result)})) - (async/close! ch)))) + (if result + (do (put! ch {:id (.-id result) + :value (decode (.-value result)) + :version (.-version result) + :updated (.-updated result) + :deleted (.-deleted result) + :synced (.-synced result)}) + (async/close! ch)) + (async/close! ch))))) (set! (.-onerror req) (fn [e] (js/console.error "IDB get error:" e) (async/close! ch))) ch)) @@ -196,8 +197,10 @@ (set! (.-onsuccess req) (fn [e] (let [result (.-result (.-target e))] - (put! ch (when result (.-value result))) - (async/close! ch)))) + (if result + (do (put! ch (.-value result)) + (async/close! ch)) + (async/close! ch))))) (set! (.-onerror req) (fn [_] (async/close! ch))) ch)) diff --git a/src/pocketbook/todomvc.cljs b/src/pocketbook/todomvc.cljs index 9233dad..6a48eee 100644 --- a/src/pocketbook/todomvc.cljs +++ b/src/pocketbook/todomvc.cljs @@ -20,7 +20,7 @@ (defn- todos-list "Return todos as sorted vec of [id doc] pairs." [] - (->> @(!todos) + (->> @@!todos (sort-by (fn [[_ doc]] (:created doc))) vec))